Что такое TuxOnIce? Это проект, ранее называвшийся suspend2, пытающийся сделать быстрый и стабильный hibernate для Linux.
Что такое hibernate? Если вы не знаете, что это, то hibernate = спящий режим (Win XP) = гибернация (гыгы) (Vista). Это запись содержимого физической памяти на жесткий диск и полное выключение компьютера, после которого можно запустить систему и продолжить работу.
Подробнее о Tux On Ice можно почитать на официальном сайте

В этой статье я хочу рассказать, как заставить работать TuxOnIce на популярном ныне дистрибутиве Ubuntu (с его модификациями, естественно).
Надо заметить, что из коробки в Убунте работает hibernate (просто suspend-to-disk), при том достаточно стабильно. Тут описано, как вместо него начать использовать более фичастый TuxOnIce, основной профит от которого — ускорение процесса и возможность наблюдения за происходящим.


Disclaimer: Если не понимаете, что происходит на каждом шаге — не делайте. Никому не нужны чужие проблемы из-за бездумного копипаста.

Приступим.

Для начала нам нужно ядро с наложенным патчем. Есть путь правильный (пересборка) и простой (установка из репозитория). Оставим правильный гентушникам и остальным не вполне нормальным людям. (Кстати, в Gentoo установка TuxOnIce проще).

Прописываем репозиторий с tuxonice-enabled ядром, добавляем ключ, апдейтим:
$ sudo -i
# echo deb http:\/\/ppa.launchpad.net/tuxonice/ppa/ubuntu jaunty main >> /etc/apt/sources.list
# gpg --keyserver hkp://subkeys.pgp.net --recv-keys DAC45EC9DEC8FAAC
# gpg --export DAC45EC9DEC8FAAC|apt-key add -
# apt-get update


Обновляем, новое ядро должно поставиться из свежепрописанного репозитория. Заодно ставим вспомогательные вещи:
# apt-get dist-upgrade
# apt-get install tuxonice-userui


Перезагружаемся, убеждаемся, что ядро работает.
$ uname -rv
2.6.28-12-generic #44+tuxonice2-Ubuntu SMP Sun Apr 26 23:28:12 UTC 2009


Далее говорим ядру (на самом деле, tuxonice'у), откуда он(о) будет пытаться продолжить работу. Скармливаем ядру параметр resume=/dev/swap (раздел со свопом)
$ grep defoptions /boot/grub/menu.lst
## e.g. defoptions=vga=791 resume=/dev/hda5
# defoptions=quiet splash resume=/dev/sda5

После этого делаем # update-grub и убеждаемся, что в конфиге все не-recovery ядра обрели такую опцию.

Тот же раздел со свапом надо скормить скрипту hibernate. Для этого в файле /etc/hibernate/suspend2.conf выставляем параметр SuspendDevice.

Теперь самое интересное. Если вы попробуете уйти в hibernate, а потом восстановиться из него, то вас, возможно, ждет разочарование. TuxOnIce по умолчанию сжимает содержимое памяти алгоритмом LZF, для чего ему нужен соответствующий модуль ядра. В убунте из коробки я такого не нашел :)
Выхода два — не использовать сжатие или использовать, например, LZO и подгружать модуль до возобновления. Поскольку первый путь может привести к нехватке места при замораживании системы, мы пойдем вторым путем.
Открываем все тот же /etc/hibernate/suspend2.conf и правим параметр Compressor — вместо lzf пишем lzo.
Итак, при взлете ядра TuxOnIce пытается возобновить работу системы из указанного раздела (swap). Но не может это сделать, поск��льку образ сжат недоступным на тот момент алгоритмом. Далее монтируется initrd и загрузка идет своим обычным путем.
Наша задача — сделать такой initrd, init в котором подгрузит модуль lzo и отдаст команду на повторную попытку восстановления.
# echo lzo >> /etc/initramfs-tools/modules
Так мы добавили модуль в список сборки initrd. Далее — скрипт для восстановления. Должно получиться так:
# cat /etc/initramfs-tools/scripts/init-top/00resume
#!/bin/sh
case $1 in
prereqs)
exit 0
;;
esac

modprobe lzo

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

Не забываем дать всем права на исполнение этого файла: chmod +x /etc/initramfs-tools/scripts/init-top/00resume

Теперь пересобираем initrd (команда update-initramfs -u).

Пробуем: если с ГУЕм не ладится, от имени рута выполняем команду hibernate и читаем, на что она ругается.

Выглядеть должно примерно так:


В результате имеем ноутбук (или не ноутбук, но я не вижу смысла в hibernate в других случаях) с модным быстрым hibernate.

К сожалению, некоторые драйверы не очень дружат с таким режимом, наиболее опасные из них — видео. Заведомо могут работать свежие intel и nvidia (180+), про ATI и другую экзотику ничего не скажу.
В файле /etc/hibernate/common.conf можно настроить разнообразные твики, от гашения звука до рестарта сервисов и удаления/подгрузки драйверов.
Теоретически можно прикрутить графический интерфейс для отображения статуса, но это отдельные пляски, от которых, ИМХО, больше возможных глюков, чем реальной пользы.