Заморозь своего пингвинаBeom Beotiger Хакер, номер #105, стр. 102 Suspend2: отправляем Linux в спячкуБывают такие ситуации, когда у тебя открыто с десяток окон, ты весь в работе, у тебя что-то компилируется, редактируется, играется, режется и тут вдруг тебе срочно требуется выключить компьютер. Например, твой взгляд падает на часы, и ты понимаешь, что уже пять утра и пора бы пойти немного вздремнуть. В такие моменты хочется просто заморозить систему, чтобы при следующем включении компьютера ты мог вернуться в то место, где остановился, и спокойно продолжить процесс. Знакомься: Suspend2В подобном случае на помощь тебе придет Suspend2 (www.suspend2.net). Почему именно он? Во-первых, это активно развивающийся и успешный проект, который в свое время отделился от swsusp и сейчас ведется независимо. Во-вторых, он обладает вкусностями, мимо которых не пройдет ни истинный линуксоид, ни просто любитель компьютеров. Вот основные из них:
Если коротко, то Suspend2 сохраняет содержимое RAM компьютера и выключает питание. При последующем включении он восстанавливает содержимое RAM, и ты можешь продолжать работу как ни в чем не бывало – нет необходимости снова запускать программы, открывать документы, терминалы и т.д. Что нужно для успешной установки и работы Suspend2? В принципе, если у тебя современный компьютер на базе процессора Pentuim и IDE-диски, а также свежее ядро ветки 2.6, то Suspend2 с большой вероятностью будет работать без проблем. В частности, для корректной работы необходима поддержка процессором инструкции pse или pse36 (page size extensions). Проверяем: $ cat /proc/cpuinfo | grep flags flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe cid xtpr К сожалению, в связи с некоторыми разногласиями среди кернел-хакеров Suspend2 не включен в ванильные ядра, и, чтобы его использовать, нам придется наложить патч и перекомпилировать ядро. Готовим ядроСперва убедись, что исходники работающего в данный момент ядра лежат в /usr/src/linux (дефолтовое место для большинства Linux-дистрибутивов). Если же этого каталога у тебя нет или он пуст, значит исходники ядра, скорее всего, не установлены. Ничего страшного. На каждом прилагаемом к журналу диске есть новые ванильные ядра пингвина. Именно ванильные ядра (то есть чистые ядра с kernel.org безо всяких патчей, одобренные Линусом Торвальдсом) наиболее подходят для Suspend2. Накладываем патчИтак, у нас установлены исходники рабочего ядра. Если ты используешь новое ядро, сначала убедись в его работоспособности (отконфигурируй, откомпилируй, установи и загрузись с него). Пришло время прикрутить Suspend2. Идем на www.suspend2.net/downloads, выбираем подходящий под нашу версию ядра патч и скачиваем его. Например, для версии 2.6.19.2 скачиваем suspend2-2.2.9-for-2.6.19.patch.bz2. В общем случае ядра версий 2.6.X.Y не сильно отличаются от версий 2.6.X, поэтому для них возможно использование одного и того же патча. # wget http://www.suspend2.net/downloads/all/suspend2-2.2.9-for-2.6.19.patch.bz2 -P /tmp Командуем (путь и версия патча у тебя могут быть другими): # cd /usr/src/linux # bzcat /tmp/suspend2-2.2.9-for-2.6.19.patch.bz2 | patch -p1 Если ты подобрал правильную версию, то никаких отклонений быть не должно. Если у тебя не ванильные ядра, а скорее всего, так оно и есть, поскольку почти каждый дистрибутив использует собственные пропатченные версии, то может возникнуть несколько несоответствий (режектов). В этом случае у тебя есть три возможности:
Компилируем ядроТеперь делаем make menuconfig, загружаем нашу текущую рабочую конфигурацию и приступаем к настройке ядерной поддержки Suspend2. Сперва убедимся, что в секции Code Maturity отмечен Prompt for development and/or incomplete code/drivers, включающий некоторые тестовые опции в конфигурировании ядра. Затем заходим в секцию Power management options (ACPI, APM) и видим там новый пункт - Suspend2. Отмечаем его и тут же заходим в подменю. Здесь нужно сделать паузу и решить, что мы будем использовать в качестве буфера: специальный файл на жестком диске или раздел подкачки. За это отвечают две опции: File Allocator и Swap Allocator. В принципе, можно отметить оба пункта и решать, откуда грузиться, в самом загрузчике (смотри далее). Должен быть отмечен хотя бы один пункт. Другие опции можно оставить по умолчанию. Теперь идем в раздел Cryptographic options, находим пункт LZF compression algorithm и включаем его. Заметь, он должен быть встроен непосредственно в ядро, а не включен в виде модуля, иначе сжатие работать не будет. Если у тебя карточка от Nvidia на шине AGP и ты не хочешь при пробуждении лицезреть темный экран, в ядре необходимо отключить agpgart – поддержку AGP, включенную по умолчанию. У драйверов от Nvidia есть своя поддержка этой шины: заходи в секцию Device Drivers, подсекцию Character devices, там находи пункт /dev/agpgart (AGP Support) и выключай его. Если эта версия ядра не использует Initrd/Initramfs, то здесь можно сохраняться, компилировать ядро (make && make modules_install) и переходить к следующему пункту. Если же ты задействуешь Initrd/Initramfs, тогда вручную включи пробуждение: модифицируй создание Initrd/Initramfs для своего дистрибутива или измени скрипт linuxrc или init, добавив туда строчку «echo 1 > /sys/power/suspend2/do_resume». Здесь важно обратить внимание на следующий момент. Указанная строчка должна идти ПЕРЕД тем, как Initrd/Initramfs монтирует файловую систему. Если ее там не окажется, пробуждение не будет возможным. Если же эта строчка будет идти после монтирования файловой системы, та может быть разрушена! Помни об этом. Настраиваем Suspend2Теперь, прежде чем перезагружаться, необходимо провести первоначальную настройку Suspend2. Управлять Suspend2 можно через виртуальный каталог /sys/power/suspend2, составляя свои скрипты для пробуждения/восстановления системы, но удобнее все же пользоваться готовым решением – hibernate-скриптом, который будет делать всю работу за нас. Скачиваем hibernate-скрипт и устанавливаем его: $ wget http://www.suspend2.net/downloads/all/hibernate-script-1.95.tar.gz $ tar xzf hibernate-script-1.95.tar.gz $ cd hibernate-script-1.95 $ sudo ./install.sh Сам скрипт по умолчанию инсталлируется в /usr/sbin, а конфигурационные файлы (их может быть несколько) помещаются в каталог /etc/hibernate. Для пользователей Gentoo и Debian уже есть включенный в их дистрибутивы hibernate-script. По умолчанию настройки Suspend2 разбиты на три файла конфигураций: hibernate.conf, suspend2.conf и common.conf. Вообще говоря, никто не мешает нам собрать их все в один главный файл (hibernate.conf), но мы пойдем по пути наименьшего сопротивления. Начнем с первого и отредактируем файл /etc/hibernate/hibernate.conf. # vim /etc/hibernate/hibernate.conf TryMethod suspend2.conf #TryMethod disk.conf #TryMethod ram.conf Так как мы используем Suspend2, оставляем только его; disk.conf и ram.conf нам не понадобятся. Дальше смотрим файл /etc/hibernate/suspend2.conf. # vim /etc/hibernate/suspend2.conf UseSuspend2 yes Reboot no EnableEscape yes DefaultConsoleLevel 1 Compressor lzf Encryptor none Include common.conf Здесь находятся общие для Suspend2 настройки. Первая строчка - «UseSuspend2 yes» - говорит о том, что мы будем использовать именно Suspend2 (а иначе зачем мы вообще все это затеяли?). Опция Reboot решает, хотим ли мы перезагружаться сразу после заморозки. Строчка «EnableEscape yes» позволит нам отменить процесс заморозки нажатием клавиши <Esc>. Опция DefaultConsoleLevel устанавливает вид отображения при заморозке и разморозке (0 – простой прогресс-бар, 1 – прогресс-бар с процентами, 2 и выше выдает обильную отладочную информацию о происходящем). Опции Compressor и Encryptor определяют методы сжатия и шифрования образа. Их имена можно узнать, выполнив команду cat /proc/crypto. Здесь же можно определить еще несколько важных значений, которые мы рассмотрим позднее. Теперь переходим к основным настройкам, собранным в файле /etc/hibernate/common.conf. Подробнее остановлюсь на, пожалуй, самых главных из них, остальные ты можешь изменить по своему вкусу, сверяясь с hibernate.conf(5). UnmountFSTypes – здесь можно перечислить типы файловых систем, которые нужно размонтировать перед заморозкой, например «UnmountFSTypes smbfs nfs ntfs vfat». В принципе, если у тебя есть конкретно заданные устройства, можно размонтировать их в пункте Unmount (например, «Unmount /media/winC /media/MyHomeNetwork»). Их же нужно монтировать обратно при пробуждении в пункте Mount («Mount /media/winC /media/MyHomeNetwork»), Suspend2 не сделает это автоматически. Пункт UnloadModules позволяет перечислить модули, которые надо обязательно выгрузить перед заморозкой, но можно воспользоваться пунктом «UnloadAllModules yes» для выгрузки всех модулей или «UnloadBlacklistedModules yes» для выгрузки тех модулей, чьи имена перечислены в файле /etc/hibernate/blacklisted-modules. Пункт LoadModules дает возможность задать имена модулей, загружаемых при пробуждении («LoadModules auto» автоматически загрузит все модули, которые были выгружены). В пункте DownInterfaces можно указать сетевые интерфейсы, которые следует отключить перед засыпанием, а «UpInterfaces auto» автоматически запустит все остановленные интерфейсы при пробуждении. Пункт RestartServices позволяет запускать/останавливать перечисленные здесь службы. Имена служб должны соответствовать названиям скриптов в каталоге init.d и быть активными на этом уровне запуска (runlevel). С помощью SwitchToTextMode во время засыпания можно переключаться в текстовый режим, а при пробуждении возвращаться обратно к X'ам. Это может быть полезно, если при пробуждении BIOS не восстанавливает твой графический адаптер и ядро не может его опознать. Опция UseDummyXServer поможет в ряде случаев, например, когда при пробуждении на некоторых видеокартах наблюдается потеря ускорения в 3D-графике. Параметрами в IncompatiblePrograms ты можешь указать программы, которые по каким-либо причинам не совместимы с Suspend2. В этом случае, если Suspend2 обнаружит, что такая программа выполняется, он отменит заморозку. Также можно залочить систему после пробуждения одним из параметров в опциях LockConsoleAs, LockXScreenSaver, LockGnomeScreenSaver, LockKDE, LockXLock и LockXAutoLock (здесь нужно определить лишь один из вышеперечисленных параметров). Если ты это сделаешь, то после пробуждения, чтобы продолжать работу, необходимо будет вновь залогиниться. Наконец, если в опции XStatus ты укажешь одно из значений (kde, gnome или x), то Suspend2 будет выводить прогресс-бар при засыпании/пробуждении, а также выдавать сообщения об ошибках в окошках для указанной графической среды. Итак, мы закончили настройку Suspend2, и можно переходить в настройке загрузчика. Но если ты решил использовать в качестве буфера для сохранения RAM не раздел подкачки, а файл, то его сперва необходимо подготовить. Делается это так. В /etc/hibernate/suspend2.conf ищем строку «FilewriterLocation», раскомментируем ее и переделываем по своему вкусу, например: «FilewriterLocation /var/suspend_file 1024». Здесь первый параметр – это имя файла под буфер, второй – его размер в мегабайтах. Далее командуем: # hibernate --no-suspend И Suspend2 сам подготовит для нас файл. Смотрим, что выдает /sys/power/suspend2/resume2: # cat /sys/power/suspend2/resume2 Это может быть что-то типа «file:/dev/hda1:0x10011f». Записываем эту строчку – она нам позже понадобится при конфигурировании загрузчика. Для использования файла подкачки в качестве буфера в файле /etc/hibernate/suspend2.conf находим и заполняем следующий пункт: SuspendDevice swap:/dev/hda3/swap_file Запускаем: # hibernate --no-suspend Смотрим: # cat /sys/power/suspend2/swap/headerlocations Мы можем получить что-то типа «swap:/dev/hda3:0xfd400». Тогда /etc/hibernate/suspend2.conf будет выглядеть следующим образом: SuspendDevice swap:/dev/hda3:0xfd400 Suspend2 запоминает абсолютное расположение файлов на жестком диске, поэтому в случае изменения местоположения файла подкачки (или если ты его удалил, а потом восстановил) необходимо вновь свериться с /sys/power/suspend2/swap/headerlocations, чтобы узнать его новые координаты, и внести соответствующие изменения в конфиг и загрузчик. Настройка загрузчикаИтак, мы откомпилировали ядро и поместили его в /boot, например, так: «cp arch/i386/boot/bzImage /boot/kernel-2.6.19.2suspend2» (имя - по твоему желанию). Теперь указываем его в загрузчике в опции kernel и добавляем туда строчку «resume2=указание на наш буфер (своп или файл)». Если ты используешь своп, это может выглядеть так: «resume2=swap:/dev/hdb4». Если же ты решил задействовать файл, сюда надо подставить значение из /sys/power/suspend2/resume2 с префиксом «file»: «resume2=file:/dev/hda1:0x10011f». Если своп-файл, то «resume2=swap:/dev/hda3:0xfd400» (берем значение из /sys/power/suspend2/swap/headerlocations). Вся секция (если своп у нас на /dev/hdb4) может выглядеть так (при использовании grub): title Wake UP!(Kernel 2.6.19.2 with Suspend2) root (hd0,0) kernel /boot/kernel-2.6.19.2suspend2 root=/dev/hdb1 init=/sbin/init \ quiet resume2=swap:/dev/hdb4 В lilo это же будет выглядеть следующим образом: image = /boot/kernel-2.6.19.2suspend2 label = Wake UP!(Kernel 2.6.19.2 with Suspend2) append = "resume2=swap:/dev/hdb4" Также рекомендуется иметь «запасную» секцию на случай, если ты не захочешь пробуждать пингвина (после засыпания) или подумаешь, что файловая система, используемая при работе заснувшим ядром, была каким-то образом изменена: title Boot without resume(Kernel 2.6.19.2 with Suspend2) root (hd0,0) kernel /boot/kernel-2.6.19.2suspend2 root=/dev/hdb1 init=/sbin/init \ quiet resume2=swap:/dev/hdb4 noresume2 Для lilo: image = /boot/kernel-2.6.19.2suspend2 label = Boot without resume(Kernel 2.6.19.2 with Suspend2) append = "resume2=swap:/dev/hdb4 noresume2" Не забудь: каждый раз после изменения lilo.conf нужно выполнять команду /sbin/lilo. Теперь ты всегда сможешь загрузить систему без пробуждения, выбрав строчку «Boot without resume». Итак, у нас все готово. Теперь нужно убедиться, что мы все сделали верно и можем использовать Suspend2. Для этого необходимо просто перезагрузиться с новым ядрышком (если ты сделал два пункта: без noresume2 и с ним, можно выбрать любой из них – Suspend2 сам распознает готовность системы к пробуждению) и просмотреть лог ядра: $ dmesg | grep Suspend2 Suspend2 Core. Suspend2 Userspace UI Support module loaded. Suspend2 Checksumming module loaded. Suspend2 Userspace Storage Manager module loaded. Suspend2 Compressor module loaded. Suspend2 Encryptor module loaded. Suspend2 Block I/O module loaded. Suspend2 Swap Allocator module loaded. Suspend2 2.2.9: SwapAllocator: Signature found. Suspend2 2.2.9: Resuming enabled. Suspend2 2.2.9: Normal swapspace found. Suspend2 2.2.9: No image found. Обрати внимание на строчку «Suspend2 2.2.9: Resuming enabled». Она показывает, что наш пингвин готов к заморозке/разморозке! Для апробирования этой фичи рекомендуется сначала усыпить систему без X'ов. Переходим на текстовую виртуальную консоль (<Alt-Ctrl-F1>) и закрываем X'ы, например, так: # /etc/init.d/xdm stop Или init 3, если у нас Red Hat, Fedora Core или Mandriva, потом командуем: # hibernate Если засыпание не состоялось (например, Suspend2 не смог выгрузить модуль, а он сообщит об этом на экране или в /var/log/hibernate.log), можно форсировать процесс: # hibernate --force Тогда Suspend2 выполнить сделать свою работу при любых обстоятельствах. Если же Suspend2 повис, смотрим его логи. Это может произойти, например, из-за несовместимого модуля, который мы забыли выгрузить. В таком случае перезагружаемся, включаем его название в выгружаемые модули (в файле конфигурации hibernate) и повторяем попытку. Теперь снова включаем компьютер, выбираем в загрузчике пункт Wake UP! (Kernel 2.6.19.2 with Suspend2) - и через небольшой промежуток времени (если все пошло по плану, конечно) мы оказываемся в той консоли, откуда ушли, с сохранением всего рабочего окружения. Стартуем X'ы (/etc/init.d/xdm start или init 5), открываем консоль и пробуем заснуть так: # hibernate Потрясен? Да, Suspend2 работает очень быстро. Например, у меня система на Celeron 2 ГГц с 512 метрами RAM и обычным IDE-диском с разделом подкачки на 512 Мб, графический адаптер Nvidia MX 440 с последней версией legacy-драйвера от Nvidia, и на засыпание в графической среде KDE я трачу около 30 секунд, а на просыпание – 22 секунды! С восстановлением, естественно, полного рабочего окружения KDE, открытых окон с загруженными документами и тому подобного. Если же Suspend2 по каким-то причинам не заработал, внимательно изучи надписи на экране, которые он выдает, а также лог. К твоим услугам поддержка на официальном сайте (www.suspend2.net/FAQ), информация в Wiki (wiki.suspend2.net), а также мейлинг-лист (www.suspend2.net/lists) и IRC-канал #suspend2 на irc.freenode.net, где тебе могут помочь. ЗаключениеСейчас существует три основных реализации спячки под Линукс – это рассмотренный нами Suspend2, swsusp и uswsusp. Причем swsusp (при поддержке Павла Мачека, стоявшего у истоков создания механизма спячки в Linux) входит, как ты мог заметить, в ванильные ядра начиная с ветки 2.6. Но он не получил должного признания, поскольку кроме основных недостатков (которые напрямую пересекаются с недочетами Suspend2) имеет еще ряд недоработок, в частности невозможность сохранения полного объема памяти в разделе подкачки. Ему на смену (начиная с версии ядер 2.6.17) пришел так называемый userland swsusp (uswsusp), поддерживаемый Линусом Торвальдсом. Эта модификация swsusp использует особое символьное устройство, через обращение к которому с помощью специальных утилит и осуществляется весь процесс спячки. Насколько это оправдано, покажет только время и практика. Спокойной тебе спячки! DVDНа прилагаемом к журналу диске ты найдешь полную версию этой статьи и весь необходимый софт. INFOЕсли ты заинтересовался, почитай документацию, идущую с исходниками ядра, в каталоге Documentation/power. WWW
|