Мгновенная загрузка Linux через режимы Suspend to disk или Hibernate

Режим засыпания "Suspend to disk" позволяет мгновенно выключить компьютер и так же мгновенно продолжить работать после включения, с полным сохранением текущего состояния системы. Использованию этой технологии для быстрой загрузки ОС Linux и посвящена данная статья.

[Maxim Chirkov (mc@opennet.ru)]

Режим засыпания "Suspend to disk" позволяет мгновенно выключить компьютер и так же мгновенно продолжить работать после включения, с полным сохранением текущего состояния системы. Т.е. производится сброс полного дампа виртуальной памяти и информации о состоянии системы на диск, при включении состояние полностью восстанавливается.

Что требуется:

  • Последнее Linux ядро 2.4.x в исходных текстах.
  • ACPI патч (acpi-дата-2.4.x.diff.bz2) с сайта http://acpi.sourceforge.net
  • Software Suspend (swsusp) патчи (два патча software-suspend-*-core.bz2 и software-suspend-*-linux-2.4.x.bz2) и скрипт suspend.sh с http://swsusp.sf.net
  • acpid из дистрибутивного пакета или можно скачать c http://phobos.fs.tum.de/acpi/ (swsusp входит в состав ядра 2.6.x, для 2.6.x доступно альтернативное решение - pmdisk (СONFIG_PM_DISK) http://lwn.net/Articles/48471/)

Сборка ядра:

  1. Разархивируем и патчим ядро (далее на примере linux-2.4.24). Копируем патчи в linux-2.4.24 и патчим:
    	# bzcat acpi-20031203-2.4.24.diff.bz2| patch -p1
    	# bzcat software-suspend-2.0-linux-2.4.23.bz2| patch -p1
    	# bzcat software-suspend-2.0-core-rc3A.bz2| patch -p1
            
  2. Включаем в конфигурации ядра SWSUSP
            В make menuconfig:
    	    General setup  --->
    		Software Suspend support  --->
    		    Image Storage (you need at least one writer)  --->
    			[*] Swap Writer
    		    Page Transformers  --->
    			[*] Compress image
    	
    или
    	    CONFIG_SOFTWARE_SUSPEND_SWAPWRITER=y
    	    CONFIG_SOFTWARE_SUSPEND2=y
    	    CONFIG_SOFTWARE_SUSPEND_COMPRESSION=y
        	
  3. Пересобираем и устанавливаем новое ядро
    	# make dep && make bzImage && make modules && make modules_install && make install
    	
    Если ядро ставится вместо родного ядра, поставляемого с Linux дистрибутивом, рекомендую ознакомиться со списком дополнительных патчей используемых создателями дистрибутива. Иногда патчи влияют на работу достаточно серьезных вещей и вам придется удостовериться, что отсутствие этих дополнительных патчей не отразится на вашей системе и принять решение, использовать патч swsusp или пачти из комплекта дистрибутива (swsusp требует "чистого" ядра, за редкими исключениями, описанными в документации к swsusp).
  4. Активируем SWSUSP В /etc/lilo.conf добавляем, в блоке описания загрузки текущего ядра:
    	    	append=" resume2=swap:/dev/hda6"
    	
    где, /dev/hda6 - swap раздел, размером не меньше чем на 30% превышающим объем ОЗУ. Можно настроить дамп в свапфайл, как это сделать описано в документе /usr/src/linux/Documentation/swsusp.txt, который рекомендуется внимательно прочитать в любом случае.

    В итоге запись в lilo.conf у меня выглядит примерно так:

    	image=/boot/vmlinuz
    	        label=linux
    	        root=/dev/hda5
    	        vga=normal
    	        append=" resume2=swap:/dev/hda6 ide0=autotune rootflags=data=writeback"
    	        read-only
    	        initrd=/boot/initrd.img-2.4.24
    	
    (не забудьте выполнить команду lilo после внесения изменений в lilo.conf)
  5. Перезагружаемся: shutdown -r now

Проверка.

После перезагрузки смотрим содержимое /proc/acpi/info Если в строке "states:" присутствует S4 (swsusp), то все в порядке, иначе смотрим причину неработы swsusp в /var/log/messages

Пробуем заснуть:

	echo 4 >/proc/acpi/sleep
    
Для информации, S? режимы бывают следующие:
  • S1 (Stopgrant, Standby) - Временное засыпание, без выключения. На CPU подается питание, но инструкции не выполняются.
  • S2 - не используется.
  • S3 (Suspend to RAM) - отключение питания CPU, дамп регистров хранится в ОЗУ
  • S4 (Suspend to Disk, Hibernate) - полное выключение, дамп памяти и регистров CPU сбрасывается на диск.
  • S5 - программное выключение питания.
Подробнее об ACPI можно почитать http://www.columbia.edu/~ariel/acpi/acpi_howto.txt

Настройка acpid и suspend.sh.

Использование /proc/acpi/sleep слишком грубый метод, при засыпании необходимо выгрузить некоторые модули ядра (usb, pcmcia), перезапустить звуковую подсистему, поднять сетевой интерфейс и т.д. Для выполнения этих операций служит скрипт suspend.sh.
  • Устанавливаем suspend.sh:
    	# ./suspend.sh --install
    	
  • Редактируем /etc/suspend.conf в соответствии с конфигурацией системы.
  • Пробуем уснуть:
    	# /usr/local/sbin/hibernat 
    	
Для пользователей ноутбуков полезно привязать засыпание к факту закрытия крышки. Для этого нужно настроить acpid.
  • Устанавливаем acpid из пакета или исходных текстов.
  • В директории /etc/acpi/events создаем два файла lid и power:
    	содержимое /etc/acpi/events/lid (реакция на закрытие панели):
    	    event=button/lid.*     
    	    action=/usr/local/sbin/hibernate
    
    	содержимое /etc/acpi/events/power (реакция на кнопку питания):
    	    event=button/power.*
    	    action=/sbin/shutdown -h now
    	
  • Запускаем apchid
    	service acpid start
    
    Теперь при нажатии на кнопку питания будет производиться правильный shutdown, а при закрытии крышки система будет полностью засыпать.

    Оригинал статьи взят с сайта OpenNet.

    [ опубликовано 31/01/2004 ]

    Maxim Chirkov (mc@opennet.ru) - Мгновенная загрузка Linux через режимы Suspend to disk или Hibernate   Версия для печати