Журнал LinuxFormat - перейти на главную

LXF97:Hibernate

Материал из Linuxformat
Перейти к: навигация, поиск

Содержание

Пингвин впадает в спячку

Приходится часто включать и выключать ноутбук? Сергей Яремчук подскажет, как сэкономить пару-тройку минут на загрузке и запуске необходимых приложений.

К сожалению, праздники и выходные имеют вредную привычку быстро заканчиваться, после чего снова предстоит приступать к работе, вспоминая, чем занимался в последний раз. Очевидно, это настолько существенная проблема для народа, что в Windows, начиная с ХР, уже реализована возможность гибернации (hibernate state), доступная через Панель Управления: Производительность и обслуживание > Электропитание > Спящий режим > Разрешить использование спящего режима. При этом все данные, находящиеся в оперативной памяти, сбрасываются на жесткий диск (т.е. фактически делается моментальный снимок состояния системы), и компьютер отключается. При включении полностью восстанавливается предыдущее состояние, и пользователь начинает работу именно с того места, где он закончил ее. Кроме очевидного удобства, выключение/включение компьютера при использовании такого режима ускоряется, так как не происходит закрытия и запуска приложений, что очень важно для мобильных устройств, нацеленных на энергосбережение.

А что пингвины?

Сторонники Linux тоже любят праздники и желают пользоваться всеми благами цивилизации, поэтому проблема не осталась незамеченной. Первым такой режим реализовал Габор Кути [Gabor Kuti] в 1998 году – его заплатка v7c для ядра 2.2.20 до сих пор находится на странице http://falcon.sch.bme.hu/~seasons/linux/swsusp.html, но уже долгое время не поддерживается. Основную работу по реализации спящего режима для Linux провела группа энтузиастов под руководством Найджела Каннингэма [Nigel Cunningham]. Хотя разработка Software Suspend for Linux или swsusp, имеет уже длинную историю, она долгое время рассматривалась как альфа и использовалась энтузиастами на свой страх и риск. Наконец, начиная с версии ядра 2.5.18, код swsusp включен в основное дерево разработки.

Вместе с исходными текстами ядра доступно небольшое описание реализации этого режима: посмотрите файл swsusp.txt в каталоге /usr/src/linux/Documentation/power, с которым советую ознакомиться всем для понимания сути проблемы. В настоящее время фактически известны несколько реализаций спящего режима для Linux. Это заплатка pmdisk (СONFIG_PM_DISK) http://lwn.net/Articles/48471/, сейчас ее код включен в состав swsusp, собственно сам swsusp, swsusp2 или Software Suspend 2 (http://www.suspend2.net/) и µswsuspUser space Suspend (http://suspend.sourceforge.net/). Первые два проекта в настоящее время интереса не представляют. Зато интересны последние две разработки, развивающиеся сейчас наиболее активно. Проект µswsusp относительно молодой (начало разработок датировано апрелем 2006), поддержаны ядра начиная от 2.6.17, реализация – в виде обычной программы, работающей в пространстве пользователя,что дает большие преимущества. Эта разработка уже готова к применению, но некоторые возможности пока не дотягивают до swsusp2, о котором и пойдет речь в дальнейшем.

Врезка


В отличие от µswsusp, swsusp2 реализован в виде заплатки к ядру. Сегодня поддержка ядер версии 2.4 этим проектом практически остановлена, последней является заплатка 2.1.5.7B для ядра 2.4.28; работает она стабильно, но дальнейшее развитие не предусмотрено. Аналогичная ситуация и с ядром 2.2. Поддерживаются все файловые системы (некоторые, правда, с оговорками), а также LVM и dm-crypt (средство для шифрования данных). Работа со спящим режимом протестирована на многочисленных конфигурациях, хотя возможны и проблемы с некоторым оборудованием. Необходима поддержка расширения процессора PSE или PSE36 (cat /proc/cpuinfo | grep pse) – не могу сказать, где ее нет, но с процессорами Intel, AMD и VIA C3 проблем быть не должно. Система сна пока не будет работать с большим количеством оперативной памяти (> 4 ГБ), зато поддерживаются AGP, DRI, USB и прочее. Однако, если жесткий диск не знает ничего о DMA или режиме suspend, что свойственно для ну очень старых дисков, то с данными, скорее всего, придется проститься.

Возможность сохранения данных вместо раздела подкачки в файл, появившаяся во второй версии, имеет особое значение. Представьте себе такую ситуацию: для тестирования запускаете Knoppix, который находит на диске swap-раздел, монтирует его и сохраняет в нем свои данные. Если в этом разделе были сохранены результаты suspend, то, естественно, они будут затерты. Аналогичная картина будет наблюдаться при использовании двух ядер, одно из которых не знает о suspend. Использование файла подкачки позволяет избежать таких ситуаций.

Настройка гибернации в Kubuntu

Некоторые производители уже включают возможность перехода в спящий режим в последние версии дистрибутивов. За подробностями конкретно используемого вами дистрибутива отправляю на страницу Wiki проекта SWSup2, где все подробно расписано. В Kubuntu, начиная с версии 6.10, при выходе из системы такой пункт уже имеется. В Kubuntu 6.06 LTS такой возможности по умолчанию нет, но эту несправедливость легко исправить.

К сожалению, если набрать sudo apt-cache search hibernate, можно найти только старую версию скрипта hibernate, упрощающего управление этим режимом. Мир не без добрых людей: тем, у кого нет желания самостоятельно компилировать ядро, следует отправиться на страницу http://dagobah.ucc.asn.au/dapper-kernels/, где находится альтернативный репозиторий для Dapper Drake. Добавьте в /etc/apt/sources.list:

deb http://dagobah.ucc.asn.au/ubuntu-suspend2 dapper/

и обновите список пакетов:

$ sudo apt-get update

Запрос sudo apt-cache search hibernate покажет наличие двух пакетов, которые и нужно установить. Кстати, метапакет suspend2 включает все необходимое.

$ sudo apt-get hibernate suspend2

Учитывая «мягкий» характер зависимостей пакетов в Ubuntu, советую внимательно просмотреть, какие пакеты будут установлены дополнительно – и, главное, списки Предлагаемые пакеты и Рекомендуемые пакеты.

Компиляция ядра

В том случае, когда вышеприведенный вариант неприемлем, ядро придется собрать самостоятельно. Исходные тексты ядра можно загрузить с http://www.kernel.org/ или найти на нашем DVD, а с сайта swsup2 следует взять заплатку под нужную версию.

 $ cd /usr/src
 $ sudo tar -xjvf /home/source/ linux-2.6.22.tar.gz
 $ sudo ln -sf linux-2.6.22 linux
 $ cd linux
 $ wget -c http://www.tuxonice.net/downloads/all/suspend2-2.2.10-for-2.6.22.patch.bz2
 $ bzcat suspend2-2.2.10-for-2.6.22.patch.bz2 | patch -p1

Теперь в .config активируйте следующие параметры:

 CONFIG_SUSPEND2=y
 CONFIG_SUSPEND2_FILE=y
 CONFIG_SUSPEND2_SWAP=y
 CONFIG_CRYPTO_LZF=y

Если используется более ранняя версия ядра, желательно, но не обязательно установить и последнюю версию ACPI (http://acpi.sourceforge.net/). См. Рис. 1. Последние приготовления Также следует позаботиться о том, чтобы раздел подкачки имел достаточный размер (рекомендуется хотя бы двойной размер ОЗУ). Как вариант, можно подготовить файл, в котором и будет сохраняться информация. В конфигурационном файле загрузчика /boot/grub/menu.lst к параметрам, передаваемым ядру, добавьте строку resume2=swap:/dev/hda2, где /dev/hda2 – swap-раздел, используемый при гибернации. Теперь, когда система будет засыпать, сигнатура данного раздела будет изменена на S2SUSP, а уже после загрузки и извлечения данных она будет заменена на нормальную – SWASPACE2. И если этот раздел будет использован другим дистрибутивом, то при запуске заснувшей системы будет найдена сигнатура S2SUSP, но нужных данных на разделе не обнаружится, и загрузка будет остановлена. Выходом из такой ситуации является загрузка с параметром noresume2 или форматирование раздела заново при помощи mkswap, либо использование для хранения данных гибернации файла подкачки вместо раздела.

(thumbnail)
Рис.1 Настроить необходимые параметры ядра можно и через графический интерфейс

Загрузите новое ядро. В процессе старта на консоль должны быть выведены сообщения (dmesg | less), вроде:

Software Suspend Core.
Software Suspend Swap Writer registered.
Software Suspend 2.2.10: Suspending enabled.

Обратите также внимание и на запуск ACPI. Иногда система выводит примерно такое сообщение:

ACPI disabled because your bios is from 97 and too old
You can enable it with acpi=force

Оно свидетельствует о древности используемого BIOS. Поступите, как подсказывает сообщение, т.е. добавьте параметр acpi=force к параметрам, передаваемым ядру, прописав эти строки в конфигурационном файле загрузчика.

Вперед

Теперь можно укладывать систему спать. Ранее это можно было сделать несколькими вариантами, но в ядрах 2.6, использующих sysfs, рекомендуемым является обращение к файлам в /sys/power/.

Например, чтобы перевести систему в режим Suspend to RAM, когда питание процессора отключается, но вся информация сохраняется в оперативной памяти, следует ввести

$ sudo echo mem > /sys/power/state

Для сброса информации в раздел подкачки и последующего отключения – режим Suspend to Disk – используется такая команда:

$ sudo echo -n disk > /sys/power/state

После загрузки с новым ядром в /sys/power/ появится подкаталог suspend2, файлы в котором позволяют получить информацию о состоянии некоторых параметров системы либо управлять режимом сна. Перевести систему в режим гибернации можно и так:

$ sudo echo anything > /sys/power/suspend2/do_suspend

после чего компьютер, немного пожужжав, выключится. Если заново запустить систему, то в консоли среди прочих должны появиться сообщения, свидетельствующие о том, что swap-раздел с информацией для восстановления состояния найден.

Software Suspend 2.2.10: Swap space signature found.
Software Suspend 2.2.10: This is normal swap space.

По умолчанию компрессия и шифрование записываемого образа включены. При необходимости, отключить эти функции можно так:

$ sudo echo 0 > /sys/power/suspend2/compression/enabled
$ sudo echo 0 > /sys/power/suspend2/encryption/enabled

Чтобы опять их включить, достаточно заменить в этих выражениях 0 на 1.

Работа со скриптом hibernate

C помощью файлов, находящихся в /sys/power/suspend2, можно задать множество параметров работы системы сна, но вбивать их каждый раз вручную достаточно нудно. Разработчики существенно упростили эту задачу, написав скрипт, делающий весь процесс более наглядным и удобным. Называется он hibernate – именно его мы и установили, введя одноименный параметр в apt-get. Просто наберите:

$ sudo /usr/sbin/hibernate

и система погрузится в режим сна. Скрипт имеет ряд полезных параметров. Например, --save-settings позволит сохранить все настройки в указанный следом файл. Параметр --no-suspend позволит протестировать скрипт без выключения питания. После изменения всех настроек следует протестировать работу, введя в качестве параметра --reboot=1, что заставит систему сохранить все настройки в файл гибернации и перезагрузиться.

Свои параметры скрипт берет из конфигурационного файла /etc/hibernate/hibernate.conf, разъяснения по структуре которого можно получить, набрав hibernate с параметром --h. Я приведу здесь лишь наиболее интересные директивы, но в принципе можно работать и с установками по умолчанию.

UseSwsusp2 - Разрешает или блокирует режим Suspend.

EnableEscape - Будучи включенным, позволяет отменить переход в suspend-режим клавишей Escape.

PowerdownMethod - Способ засыпания. 3 соответствует Suspend-To-RAM, 4 – гибернации, 5 – отключению питания. Для ноутбуков разумно использовать последний вариант.

IncompatibleDevices и IncompatiblePrograms - Первое – это список устройств, несовместимых с гибернацией (обычно /dev/dsp, /dev/video*). Процессы, имеющие к ним доступ, будут перед засыпанием остановлены. Второе – названия несовместимых программ; они будут остановлены независимо от того, к каким устройствам обращаются.

Unmount и UnmountFSTypes - Перечень файловых систем, которые следует размонтировать перед переходом в suspend-режим. Хорошей идеей будет включить в него используемые вами сетевые ФС. Первая директива позволяет указать точки монтирования, а вторая – типы файловых систем (например, smbfs).

StartServices, StopServices, RestartServices - Список сервисов, которые необходимо остановить при выключении и запустить/перезапустить при включении.

Кстати, в некоторых дистрибутивах (Kubuntu как раз относится к ним) для удобства все настройки разнесены по нескольким файлам, которые подключены в hibernate.conf директивой Include.

Теперь можно пробовать залечь в спячку. Для начала рекомендуется сделать это в консоли. Введите init 3 и запустите скрипт.

$ sudo /usr/ sbin/hibernate
   Good night!
   Good morning!

Если все прошло удачно, попробуйте запустить его изпод Х. Если и это получилось, можете себя поздравить.

Немного автоматизируем процесс

На этом статью о гибернации в Linux можно бы и закончить, но еще пару слов хочется добавить для удобства использования. Естественно, каждый раз запускать скрипт не всегда удобно, иногда бывает проще закрыть крышку ноутбука, а вновь включив питание, обнаружить все на своих местах. Для этого необходимо использовать демон acpid, который является пользовательским интерфейсом, позволяющим управлять любыми событиями ACPI, доступными через /proc/acpi/event. При этом acpid читает набор конфигурационных файлов в каталоге /etc/acpi/events/.

Скорее всего, необходимый пакет уже есть в вашем дистрибутиве, и надо просто проверить его наличие и создать конфигурационные файлы. Если же пакета нет, скачайте последнюю версию с сайта http://phobos.fs.tum.de/acpi/, скомпилируйте и установите. В каталоге /etc/acpi/events создайте два файла: lid и power. Первый описывает реакцию на закрытие крышки, второй – на нажатие кнопки включения питания.

В /etc/acpi/events/lid впишите

  event=button/lid.*
  action=/usr/sbin/hibernate

Аналогично поступите и с /etc/acpi/events/power

  event=button/power.*
  action=/sbin/shutdown -h now

Затем перезапустите acpid.

  $ sudo /etc/init.d/acpid restart

Теперь при закрытии крышки ноутбука система будет впадать в спячку с выключенным питанием, а при нажатии на кнопку питания выключаться. Просто, а главное – удобно.

Несмотря на то, что рассказано много, настроить спящий режим в Linux очень даже просто, а попробовав один раз на практике, очень трудно отказаться от его использования. К хорошему быстро привыкаешь. LXF

Персональные инструменты
купить
подписаться
Яндекс.Метрика