Спящий режим для пингвина

25 Янв
2008

Статья для Linux Format (www.linuxformat.ru)

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

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

Сторонники Linux также любят праздники и желают пользоваться всеми благами цивилизации, поэтому проблема не осталась незамеченной. Первым такой режим реализовал в 1998 Гэйбоур Кьюти (Gabor Kuti) его патч 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 включен в основное дерево разработки.

hibernate.PNG

Вместе с исходными текстами ядра доступно небольшое описание реализации такого режима, посмотрите файл 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/) и µswsusp (User space Suspend, http://suspend.sourceforge.net/). Первые два проекта в настоящее время интереса не представляют. Из них наибольший интерес представляют последние две разработки, развивающиеся сейчас наиболее активно. Проект µswsusp относительно молодой, начало разработок датировано апрелем 2006, поддержаны ядра начиная от 2.6.17, реализована в виде обычной программы работающей в пространстве пользователя, что дает большие преимущества, эта разработка уже готова к применению, но некоторые возможности пока не дотягивают до swsusp2. Поэтому речь далее пойдет об 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. Использование файла поможет избежать таких ситуаций.

Хотя справедливости ради стоит отметить, что KDE умеет восстанавливать, рабочий стол последнего сеанса, если выйти из него через К- Завершить сеанс. Для настройки такой возможности зайдите в Центр настройки KDE – Компоненты – Менеджер сессий и установите галочку напротив Восстанавливать предыдущий сеанс. Правда приложения все равно закрываются и рабочий стол восстанавливается частично, хотя этого бывает достаточно, чтобы вспомнить чем занимался последний раз. Итак тренируем пингвина на спящий режим.

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

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

К сожалению если набрать “sudo apt-cache search hibernate” можно найти только старую версию скрипта hibernate, упрощающего управление этим режимом. Мир не без добрых людей, тем у кого нет желания самостоятельно компилировать ядро, следует отправиться на страницу http://dagobah.ucc.asn.au/dapper-kernels/, где найдете альтернативный репозитарий для Daper 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/ необходимое ядро, с сайта swasup2 патч под эту версию.

$ 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 активируем следующие параметры.

113.PNG

CONFIG_SUSPEND2=y

CONFIG_SUSPEND2_FILE=y

CONFIG_SUSPEND2_SWAP=y

CONFIG_CRYPTO_LZF=y

Если используется более ранняя версия ядра, желательно, но не обязательно установить и последнюю версию ACPI (http://acpi.sourceforge.net/).

29.PNG

Последние приготовления.

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

Загружаемся с новым ядром. В процессе загрузки на консоль должны быть выведены сообщения (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. Я приведу лишь наиболее интересные из параметров, но в принципе можно работать с установками по умолчанию. Кстати в некоторых дистрибутивах, Kubuntu как раз к ним относится, для удобства все настройки разнесены по нескольким файлам, которые подключены в hibernate.conf параметром Include.

UseSwsusp2 yes # разрешение или блокировка suspend режима

Reboot no # запрещает или разрешает (yes) перезагрузку после перехода в режим засыпания

EnableEscape yes # разрешает отмену перехода в suspend нажатием клавиши Escape

ImageSizeLimit 200 # установка предела сохраняемой в свопе информации (в Мб), 0 – нет предела.

SuspendDevice swap:/dev/hda2

# включаем компрессию, отключаем шифрование

Compressor lzf

Encryptor none

# метод засыпания: 3 соответствует ACPI 3 (suspend-to-RAM), 4 гибернация, 5 аналогично с отключением питания

PowerdownMethod 5

# для ноутбуков следует включить.

EnableVbetool yes

VbetoolPost yes

# Если вы счастливый обладатель видео карты Radeon

# следует установить программу radeontool

# http://fdd.com/software/radeon/ и включить следующий параметр.

# RadeonTool yes

## показ статус-бара, с указанием пути, требует также включенного SwitchToTextMode

Bootsplash on

BootsplashConfig /etc/bootsplash/default/config/bootsplash-1024×768.cfg


### все процессы, имеющие доступ к этим устройствам будут остановлены, а не заморожены

# IncompatibleDevices /dev/dsp /dev/video*

# список файловых систем которые необходимо отмонтировать перед засыпанием

# Unmount /nfsshare /windows /mnt/sambaserver

# UnmountFSTypes smbfs nfs

### network (все сетевые устройства также желательно просто остановить)

DownInterfaces eth0

UpInterfaces auto

### programs (несовместимые программы, процессы которых будут остановлены)

# IncompatiblePrograms xmms


### services (а здесь сервисы, которые останавливаются при выключении и запускаются (перезапускаются) при включении)

# RestartServices postfix

# StopServices alsasound

# StartServices aumix


Когда файл готов можно пробовать лечь в спячку. Для начала рекомендуется сделать это в консоли. Вводим 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 очень даже просто, а попробовав один раз на практике очень трудно отказаться о его использования. К хорошему быстро привыкаешь.

 

Комментировать

Наверх