пятница, 11 июля 2008 г.

TuxOnIce (бывший suspend2) в Debian

Надумал поставить себе улучшенную версию "усыпляльщика" системы, TuxOnIce. Самое привлекательное - сжатие образа памяти налету шустрым алгоритмом. Т.к. пока что процесс сжатия происходит быстрее процесса записи на жесткий, это позволяет сократить время засыпания/подъема системы, а это ой как важно!

Сейчас у меня установлено ядро 2.6.24-7 из репов ленни.

Как оказалось, последняя версия патча TuxOnIce есть в Дебиановских репозиториях. Пакет зовется linux-patch-tuxonice. Однако, его установки не достаточно для начала работы TuxOnIce. Это всего-лишь патч. Нужно скачать еще и исходники ядра (можно из репозиториев стянуть, получим исходники того ядра, на котором система и работает). Далее, патчим исходники... для этого переходим в корневую папку исходников (у меня это /usr/src/linux-source-2.6.24) и оттуда от имени рута выполняем

../kernel-patches/all/apply/tuxonice

Теперь открываем конфигуратор ядра и там смотрим опции, которые нам нужны. Все настройки находятся разделе Power management -> Hibernation -> Enchanced Hibernation. Там можно включить/выключить хранение образа памяти в файле или в свопе, поддержку сжатия ;) , поддержку сплеш-картинки, а также включить по-умолчанию TuxOnIce и заменить старый метод гибернации. Себе я включил запись в своп, сжатие и замену старого метода, плюс оставил включенной опцию "Checksum pagaset2" (как я понял, это нужно для проверки целостности образа памяти). Пока не пробовал подключать сплеш-картинку, но обязательно попробую позже...

После этого собираем ядро в дебиан-пакет командой

make deb-pkg

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

А теперь самое интересное. Для работы этого чуда нужно:
  • добавить скрипт в initramfs для пробуждения системы, иначе после усыпления при загрузке системы не будет восстановлен образ памяти, а система загрузится как ни в чем не бывало (за исключением отвалившегося свопа с сообщением "Unable to find swap-space signature")
  • собрать initrd с новыми модулями и добавленным скриптом
  • настроить загрузчик на новое ядро, initrd и указать устройство для хранения образа памяти.
Теперь подробно. Убедитесь, что у вас установлен пакет initramfs-tools, он нам понадобится. Скрипт вот такого содержания:

#!/bin/sh
PREREQ=""

prereqs()
{
echo "$PREREQ"
}

case $1 in
# get pre-requisites
prereqs)
prereqs
exit 0
;;
esac

if [ -d /sys/power/tuxonice ]; then
echo 1 > /sys/power/tuxonice/do_resume
fi

нужно положить в файл /etc/initramfs-tools/scripts/local-premount/tuxonice
Самая веселая шутка в том, что имя файла должно содержать только цифры, буквы и символ подчеркивания. Если назвать файл как-нибудь так: "tuxonice.sh", то ничего не сработает. ;) Ну и не забываем сделать файл исполняемым:

chmod ugo+x /etc/initramfs-tools/scripts/local-premount/tuxonice

Далее, собираем initrd. Для этого делал я следующее. Для удобства переходим в консоли в папку /boot, затем оттуда от рута выполняем:

mkinitramfs -o initrd.img-2.6.24 2.6.24

Подробнее о параметрах:
  • -o <имя образа> - это выходной файл, думаю можно указывать что душе угодно, главное - затем загрузчику указать тот же файл.
  • <версия ядра> - это версия ядра, для которой мы собираем initrd. Если его не указывать, то программа возьмет модули от текущей версии ядра и система может не стартовать вообще.
Если настройка производится для текущего ядра можно использовать команду по-проще:

update-initramfs -u

Теперь настраиваем загрузчик. Сам я использую GRUB, поэтому и настройку привожу для него. Вот как выглядит запись для нового ядра:

title Debian GNU/Linux, kernel 2.6.24 Custom Kernel
root (hd0,0)
kernel /boot/vmlinuz-2.6.24 root=/dev/sda1 ro vga=791 resume=swap:/dev/sda5
initrd /boot/initrd.img-2.6.24

Просто скопируйте строчку, с помощью которой загружаетесь в данный момент и измените 3 параметра:
  • /boot/vmlinuz-2.6.24 - это образ ядра, он устанавливается из deb-пакета, который сгенерирован системой сборки ядра. Подставляйте свой файл.
  • resume=swap:/dev/sda5 - это параметр для TuxOnIce. Он говорит, куда записывать и откуда брать образ памяти. У меня это своп-раздел /dev/sda5. Выяснить, что вам нужно здесь вписывать поможет "fdisk -l", тип какого устройства swap, такой адрес и пишите. Здесь также можно указать и файл, но я не пробовал, поэтому советовать не буду... читайте документацию на официальном сайте.
  • /boot/initrd.img-2.6.24 - это ваш initrd.


На этом базовая настройка заканчивается... и начинаются танцы с бубном. Если система пишет, что на второй стадии ей чего-то там не хватило, что у вас установлено extra_pages_allowance в 500, а ей нужно больше, то методов решения тут несколько. Нужно изменить этот параметр настолько, чтоб вашей системе хватило (он напишет, например, 764/500, вот вам нужно больше, чем 764, себе выставляю на 1000, поэтому далее в методах решения буду использовать эту цифру). Методы:
  • Одноразовый метод. Нужно выполнить
    echo 1000 > /sys/power/tuxonice/extra_pages_allowance
    это увеличит параметр до очередной перезагрузки.
  • Изменить конфигурационный файл /etc/hibernate/suspend2.conf, добавить в него строчку
    ProcSetting extra_pages_allowance 1000
    Есть только одно НО: этот метод у меня не работает, надо еще исследовать... может конфиг переименовать в tuxonice.conf ...
  • Жесткий метод. Нужно найти в пропатченых исходниках ядра эту константу, изменить на желаемое значение, пересобрать ядро и initrd. Будьте аккуратны с этим, отмена патча после изменения будет работать криво.
Предпочтительнее, конечно, заставить работать второй метод. Если получится, допишу. Можно еще строчку из первого метода добавить в скрипт, который затем зашивается в initrd, но пока не проверял такое решение.

Обновление от 15 апреля 2009
В версии 3.0.1 по-умолчанию используется сжатие lzo. А вот модуль для работы с этим сжатием не включается в initrd. Исправляется это добавлением в файл /etc/initramfs-tools/modules строчки:
lzo
Не забудьте обновить initrd:
update-initramfs -u

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