Slider – Blog van Cedric Dubois

Cedric Dubois

Suspend2 in debian

Suspend2 is een linux-equivalent van de hibernate-functie zoals deze in Windows. Alles wat in het geheugen zit wordt opgeslagen op de harde schijf en de computer wordt uitgezet. De volgende keer dat je je computer start, worden de gegevens terug in het geheugen geplaatst en heb je je omgeving terug zoals deze eruitzag voor je de computer uitzette.
Een korte uitleg hoe ik het werkend kreeg op mijn laptop…De patch is niet standaard aanwezig in de kernel die door debian gedistribueerd wordt. Je kunt ervoor kiezen een eigen kernel te compileren of deze van debian te patchen. Ik heb de debiankernel gepatcht en opnieuw gecompileerd tot een mooie deb. Even erbij vermelden dat ik momenteel testing draai op mijn laptop.

Eerst en vooral haal je de kernel-source binnen:
apt-get source linux-image-2.6.15-1-686
De kernel-source wordt gedownload en er verschijnen een paar bestanden en directories. De directory “linux-2.6-2.6.15” is van belang, deze bevat de kernelsource.

Download nu ook de suspend-patch hier en untar hem in een aparte directory. Kopiëer de patch-file naar linux-2.6-2.6.15/debian/patches/. Daarna open je linux-2.6-2.6.15/debian/patches/series/3 en voeg daar de filename van de patch toe, voorafgegaan door “+ “.
+ 100-suspend2-2.2-for-2.6.15.1.patch

In linux-2.6-2.6.15/debian/arch/<uw arch>/config voeg je volgende lijnen toe:
CONFIG_SUSPEND2_CRYPTO=y
CONFIG_SUSPEND2=y
CONFIG_SUSPEND2_FILEWRITER=y
CONFIG_SUSPEND2_SWAPWRITER=y
CONFIG_SUSPEND2_DEFAULT_RESUME2=""
CONFIG_SUSPEND2_KEEP_IMAGE=y
CONFIG_CRYPTO_LZF=y

Deze zorgen ervoor dat suspend2 meegecompileerd wordt in uw kernel.
Daarna ga je terug naar linux-2.6-2.6.15 en compileer je de kernel:
dpkg-buildpackage -rfakeroot
Nu wordt de kernel gecompileerd. Standaard worden alle flavors van uw architecture gecompileerd, gewoonlijk heb je er maar 1 nodig. Ik heb het opgelost door de overbodige .config’s te verwijderen uit linux-2.6-2.6.15/debian/arch/<uw arch>/. Bij mij bleven enkel “config” en “config.686” over (en Makefile.inc en defines natuurlijk).

Debian laadt standaard ook een initrd.img (initramfs-image). Daarom moet de resume expliciet getriggerd worden door iets (maakt niet uit wat) te echo’en naar /proc/suspend2/do_resume. Dit moet echter gebeuren vóór je rootfs gemount wordt.
Daarom voeg je een nieuw script toe aan de initrd.img. Maak een script met volgende inhoud:
#!/bin/sh
echo > /proc/suspend2/do_resume

en plaats dat in /etc/mkinitramfs/scripts/local-premount/ en geef het execute-permissies.
Na het builden beschik je over een (aantal) nieuwe deb(s) in de directory boven linux-2.6-2.6.15, de juiste kun je nu installeren met dpkg -i linux-image-<versiestuff>.deb. Een nieuwe initrd.img wordt automatisch gegenereerd (inclusief scriptje van hierboven).
Nu moet je de locatie opgeven waar de gegevens uit je geheugen opgeslagen moeten worden. Ik heb ervoor gekozen om dit op mijn swappartitie te doen. Dit moet je ook aangeven in je bootloader, in lilo met append=resume2=swap:/dev/[h|s]daX (in /etc/lilo.conf) en in grub voeg je resume2=swap:/dev/[h|s]daX toe in /boot/grub/menu.lst op de lijn die begint met “kernel”.

Nadien installeer je het hibernate-package (aptitude install hibernate) en bekijk je /etc/hibernate/hibernate.conf even (zie ook man 5 hibernate.conf) en doe er de nodige aanpassingen.

Nu is het aangeraden om voor het suspenden networking ed. uit te schakelen en terug te starten na het resumen. Dit kan via de RestartService directive in /etc/hibernate/hibernate.conf. RestartService aanvaardt één of meerdere scriptnamen uit /etc/init.rd/. Voor het suspenden worden deze aangeroepen met stop als argument, na het resumen worden ze terug aangeroepen met start als argument. Bv. RestartService networking.

Er wordt ook aangeraden om de usb-modules te unloaden/reloaden. Dit kan door de modules in /etc/hibernate/blacklisted-modules toe te voegen en in hibernate.conf de volgende lijnen te plaatsen (als ze al niet standaard ingeschakeld zijn):
UnloadBlacklistedModules yes
LoadModules auto

Om een of andere reden wordt de kernelmodule uhci_hcd niet correct geladen. De module even unloaden en opnieuw laden lost het probleem op. Dit heb ik opgelost door een scriptje reloaduhcihcd in /etc/init.d te plaatsen met daarin:
#!/bin/sh
/sbin/rmmod uhci_hcd
/sbin/insmod uhci_hcd

(en terug executable maken). In hibernate.conf voeg je dat script dan toe aan StartServices (StartServices reloaduchihcd). Problem solved.
Nu kun je booten naar je nieuwe kernel. Na het booten start je een editor en een terminal op. In de editor geef je wat tekst in (niet opslaan), in de terminal (zorg ervoor dat root kan connecten op uw X-server, bv met xhost +), en dan voer je sudo hibernate uit. Als het goed gaat dan zie je wat tekst van suspend2 verschijnen die je vertelt wat er gebeurt. Daarna wordt het systeem uitgezet.

Als je nu terug boot, zou uw systeem automatisch moeten resumen.

Succes!




1 comment

1 Comment so far

  1. cedric March 8th, 2006 09:46

    Blijkbaar loopt het toch nog mis met de uhci_hcd module. Vandaag weer geen USB bij het opstarten en resumen 🙂

Leave a reply