Усыпляем компьютер | Версия для печати |
1. Аннотация. $ patch -p1 < 100-suspend2-2.2-rc14-for-2.6.14.patch Если у вас есть какие-то вопросы по работе/использованию команды patch - почитайте документацию на нее (напр. man patch). Патч я накладывал на "чистое" (т.н. vanilla) ядро, поэтому никаких проблем (reject'ов) не возникло, все было "succeeded" (достигло цели то есть). 8. Конфигурируем ядро. После наложения патча запускаем конфигуратор ядра и идем в раздел "Power management options (ACPI, APM)", в котором должен появиться пункт Suspend2. Если у вас была включена поддержка SMP (хотя бы для процессора с гипертредингом), то здесь может возникнуть неприятный момент - опции Suspend2 не будет. Согласно информации на сайте проекта, SMP-конфигурации вроде как поддерживаются, поэтому такая ситуация мне непонятна, однако ее можно обойти, если немного похачить. :) От корня исходников ядра идем в kernel/power, открываем на редактирование файл Kconfig и в разделе "config SOFTWARE_SUSPEND" примерно в 32ой строке ("depends on PM && SWAP ...") надо убрать воскл. знак перед SMP после второй скобки и в самом конце строки. Эту процедуру надо повторить и примерно в 106ой строке (раздел "menuconfig SUSPEND2"). Теперь засыпание будет доступно только для конфигураций с SMP. Если вы вообще не хотите зависеть от мультипроцессорности, то в двух вышеуказанных строках упоминание про SMP надо убрать, чтобы они выглядели примерно следующим образом: depends on PM && SWAP && X86 || (FVR || PPC32)для строки 32 и depends on PMдля строки 106. В любом случае это хак, который может вызвать нестабильную работу системы. Итак, опцию мы все-таки нарисовали, теперь ее надо включить и зайти в ее подменю. Там для начала достаточно выбрать пункт "Swap writer" и указать раздел со свопом, на который будет сохраняться состояние системы. Здесь все, не забываем не включать APM (acpi и apm использовать одновременно не надо), можно еще в "Device Drivers" -> "USB support" от корня конфигурации выбрать пункт "USB suspend/resume" для поддержки замораживания USB-устройств. Конфигурируем оставшееся в ядре если есть необходимость, сохраняем, пересобираем, ставим, дописываем в меню загрузчика если необходимо и перезагружаемся с новым ядром. 9. Настройка и проверка. Если все прошло хорошо, то после загрузки нового ядра в /proc появится каталог suspend2 и в нем ряд файлов, в частности - do_suspend. Проверяем наличие на диске ('fdisk -l /dev/hdX | grep swap' от рута) и активность (напр. при помощи top или 'grep Swap /proc/meminfo') swap-раздела указанного выше объема (не меньше объема ОЗУ). Для автоматического задействования имеющегося свопа при загрузке системы достаточно прописать в /etc/fstab что-нибудь вроде такого: /dev/hda2 none swap sw 0 0 Теперь можно переключиться в чисто консольный runlevel (telinit 3 в каком-нибудь терминале от рута) и скомандовать echo > /proc/suspend2/do_suspend После этого должны побежать по экрану всякие строки про "freeze" и похожие на нее, ряды увеличивающихся процентов и питание должно отключиться. Включаем питание - обратно строки и проценты и в результате довольно быстро мы должны оказаться в консоли в том виде, в каком она была на момент выполнения команды заморозки. В случае успеха - с безбашенной консольной заморозкой все получилось. 10. Аккуратное засыпание. Аккуратное засыпание заключается в остановке процессов, отключении сетевых интерфейсов, выгрузке модулей и т.д. Всем этим занимается скрипт hibernate. Он почему-то написан с использованием zenity и мне оказалось проще доставить последнее, чем хачить первое. Не исключено также, что в чисто консольном режиме скрипт работает и без графических диалогов - я не пробовал. У этого скрипта имеется конфигурационный файл (в процессе установки кладется в /etc/hibernate вместе с другими файлами), в котором как раз и указывается что и как делать. Для моих целей особо переправлять его не пришлось, сам он находится во вложении к этой заметке. Для установки скрипта достаточно распаковать его архив и запустить файл install.sh. После правки конфига переходим к настройке собственно засыпания по разным поводам. 11. Настройка acpid. Реагированием на все события, связанные с электропитанием, занимается демон acpid. Поэтому если мы хотим какой-то реакции системы на закрытие крышки, то надо демону это объяснить. Для начала идем в /etc/acpi/events и открываем на редактирование файл default, в котором комментируем все незакоментированное. После перезапускаем демона (для slackware - '/etc/rc.d/rc.acpid restart') и дальше наблюдаем за событиями в системе: # tail -f /var/log/acpid Нажимаем руками датчик закрытия крышки (или закрываем/открываем крышку). Должно появиться что-то вроде [Thu Dec 8 01:12:04 2005] received event "button/lid LID 00000080 00000003" "button/lid" как раз и является интересующим нас событием, на которое нам в данном случае надо отреагировать. Обратно редактируем /etc/acpid/events/default и добавляем (или правим, если есть) в него след. сроки: event=button/lid action=/usr/local/sbin/hibernate Здесь после event указывается отлавливаемое событие, а после action - что делать при появлении этого события, в данном случае запускается скрипт hibernate. Сохраняем, закрываем и снова перезапускаем acpid. Давим на датчик закрытия крышки - должен выскочить графический прогресс-бар, после мы должны вывалиться в консоль и дальше все как и при консольном засыпании. После выключения бука обратно его включаем, он сам подтягивает ядро, детектит железо, загружает из свопа образ памяти и запускает систему из замороженного состояния. Все. 12. Край для работы. Интересной особенностью является сохранение дампа памяти в файл. Я с этим не экспериментировал, потому как нет надобности и времени, но если у кого есть успешный опыт - присылайте описание, добавим сюда. Также любопытно настроить засыпание на разные события, напр. на разряд батареи - здесь можно почитать документацию на acpid и посмотреть на его логи. 13. Источники информации. - man acpid - - - исходный код Suspend2 и hibernate - исходный код zenity - san.linuxportal.ru/files/hibernate.conf мой вариант hibernate.conf Опубликовал: |