SoftwareSuspend und der Kernel 2.6.15

Ich habe lange darauf gewartet, dass das SoftwareSuspend unter Linux funktioniert. Und nun ist es endlich soweit! Es klappt sogar mit dem proprietären Kernelmodul von nVidia (8178).

Im Folgenden beschreibe ich mein Vorgehen, um das SoftwareSuspend (to Disk) mit den nVidia-Treibern zum Laufen zu kriegen. Dazu ist im Prinzip nur ein kleiner Patch nötig...

Also im Detail: Zuerst ladet ihr euch die aktuellen 2.6.15er Kernelquellen herunter. Diese entpackt ihr nach /usr/src und erzeugt einen passenden Symlink:

tar -jxf linux-2.6.15.tar.bz2 -C /usr/src
ln -s /usr/src/linux-2.6.15 /usr/src/linux

Jetzt müsst ihr den Kernel an euer System anpassen (make [menu|x|g|k]config). Dabei ist die Option für das SoftwareSuspend zu setzen:

Power Management support
-> [*] Software Suspend

Außerdem könnt ihr hier gleich das Default resume partition auf eure Swap-Partition setzen. (Diese sollte ungefähr so groß wie euer RAM sein, da dieser komplett dort gespeichert werden wird.)

Nun könnt ihr mit dem bekannten Zweizeiler

make && make modules_install install
mkinitrd -o /boot/initrd.img-2.6.15 2.6.15

den Kernel übersetzen und auch gleich eine passende Initial-Ramdisk erzeugen.

Wenn ihr grub als Bootloader benutzt, braucht ihr auch noch einen Eintrag in /boot/grub/menu.lst, der in etwa so aussieht:

title Linux 2.6.15
root (hd0,2)
kernel /boot/vmlinuz-2.6.15 root=/dev/hda3
initrd /boot/initrd.img-2.6.15

Es ist an der Zeit, den neuen Kernel zu booten.

Nach dem Booten kommt ihr nicht direkt auf die grafische Oberfläche, da ja noch kein passendes Kernelmodul für eure nVidia-Grafikkarte existiert. Diesem wenden wir uns nun zu: Ihr könnt die nVidia-Modulsourcen nach /usr/src herunterladen. Dann müsst ihr diese mit

sh NVIDIA-Linux-x86-1.0-8174-pkg1.run -x

entpacken. Jetzt wechselt ihr in das neuentstandene Unterverzeichnis NVIDIA-Linux-x86-1.0-8174-pkg1/usr/src/nv und wendet dort diesen Patch auf die Datei nv.c an:

`*** nv.c        2005-11-23 03:22:31.000000000 +0100
--- /usr/src/NVIDIA-Linux-x86-1.0-8174-pkg1_patched/usr/src/nv/nv.c     2006-01-08 11:44:33.000000000 +0100
***************
*** 3851,3856 ****
--- 3851,3857 ----`

switch (state)
{
+       case PM_SUSPEND_STANDBY:
case PM_SUSPEND_MEM:
nv_printf(NV_DBG_INFO, "NVRM: ACPI: received suspend event
");
status = rm_power_management(nv, 0, NV_PM_ACPI_STANDBY);

Führt nun in /usr/src/NVIDIA-Linux-x86-1.0-8174-pkg1 die Datei ./nvidia-installer aus, die das Kernelmodul für euch erstellt und installiert. Wenn eure X.org bzw. XFree-Config noch nicht angepasst ist, übernimmt der Installer das auch für euch. Eure Device-Section sollte mindestens so aussehen:

Section "Device"
Identifier      "nVidia"
Driver          "nvidia"
Option          "NvAGP" "1" #  diese Zeile ist wichtig
EndSection

Wenn ihr nun wieder zur grafischen Oberfläche wechselt, könnt ihr noch das Paket hibernate installieren. Das kümmert sich darum, dass alle kritischen Module entladen werden und entsprechende Dienste gestoppt bzw. neugestartet werden. Dazu müsst ihr die Datei /etc/hibernate/hibernate.conf anpassen. Hier ein paar meiner Meinung nach wichtige Auszüge:

### sysfs_power_state
## To use /sys/power/state to suspend your machine (which may offer
## suspend-to-RAM, suspend-to-disk, standby, etc) comment out all the options
## above for Software Suspend 2, below for acpi_sleep, and uncomment this line.
## You may replace mem with any one of the states from "cat /sys/power/state"
UseSysfsPowerState disk
PowerdownMethod shutdown

##############################################################################
### Some global settings
##############################################################################`

Verbosity 0
LogFile /var/log/hibernate.log
LogVerbosity 0      ## evtl. rauf setzen, wenn was nicht klappt.
SwsuspVT 12
Distribution debian
XDisplay :0

### modules
UnloadBlacklistedModules yes
LoadModules auto

### services
RestartServices alsasound
StopServices esd
StartServices esd

### xstatus
XStatus gnome

Nun muss eigentlich nur noch aus der /etc/hibernate/blacklisted-modules das Modul nvidia auskommentiert werden und fertig.

Jetzt als root das Kommando hibernate ausführen und der Rechner schläft ein. Und beim nächsten Booten könnt ihr genau dort weitermachen, wo ihr gerade aufgehört habt. :)

Das Ganze lässt sich natürlich auch toll mit dem acpid kombinieren... euren Ideen sind kaum Grenzen gesetzt.