HowTo, linux

Fedora: гибернация

Вы закрываете крышку ноутбука и он выключается. «Но то не то что я ожидаю!» — воскликните вы. Да. Так и есть. Потому что уже много времени подряд гибернация работает из рук вон плохо. Эдакое бедствие в линупсе.

Сначала рассмотрим теорию, а после — практику сна базе дистрибутива Fedora 26.

Основные режимы энергосбережения, которые чаще всего упоминаются пользователями::

  • ждущий режим — это когда отключается питание внешних устройств, но при этом сохраняется питание памяти, что позволяет относительно быстро восстанавливать рабочее состояние системы  В спецификации аппаратного обеспечения указано пять уровней энергосохранения. И разработчики различных операционных систем часто выбирают различающиеся между собой уровни.
  • Спящий режим — это особая разновидность выключения компьютера при котором слепок содержимого оперативной памяти сохраняется на диске. При повторной загрузке ОС проверяет, есть ли слепок памяти. И если да, то восстанавливает слепок в оперативную память и начинает с того места, на котором вы остановились ранее.
  • гибридный спящий режим — это тот же ждущий режим при котором содержимое оперативной памяти сохраняется в энергонезависимой памяти на случай отключения питания (windows-only)

И если со ждущим режимом все более-менее понятно и он работает в большинстве современных дистрибутивов, то со спящим режимом не все так гладко. Попытавшись увести систему в спячку и нажав на кнопку питания для пробуждения вы просто заново загрузите систему.

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

Требования к разбиению дисков

Для возможности работы гибернации необходимо чтобы:

  • В вашей системе присутствовал только один файл или раздел подкачки. Комбинировать несколько файлов, разделов или файл  и раздел нельзя — гибернация работать не будет.
  • Размер раздела (файла подкачки был как минимум равен или превышал размер оперативной памяти (но это не гарантирует успешного срабатывания в случае, когда система активно используется свопом).

Гибернации через раздел подкачки

Необходимо отредактировать файл /etc/defaults/grub и указать в параметре GRUB_CMDLINE_LINUX опцию resume, которая укажет, на раздел, который является свопом.

GRUB_CMDLINE_LINUX="rd.lvm.lv=rfremix/root rd.lvm.lv=rfremix/swap rhgb quiet usbcore.autosuspend=-1 resume=UUID=7d55bdde-03ef-4adf-a1c3-9b85e2a7f4be"

Параметр resume может быть записан в нескольких вариантах:

Перегенерация конфига grub2 на efi-системах

sudo grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg

Ссылка на раздел

resume=/dev/...[/code[

Указываем раздел, на котором находится подкачка
<h3>UUID раздела</h3>
resume=UUID=<uuid>

Получить uuid можно при помощи blkid.

Предварительно чистим кеш блочных устройств.

sudo blkid -g

И лишь затем получаем идентификатор.

sudo blkid /dev/...

Узнать имя устройства, которое вам интересно можно при помощи команды lsblk.

Гибернация через файл подкачки

Практически ничем не отличается от гибернации через раздел за исключением следующих нюансов

В качестве параметра resume указываем раздел, на котором расположен файл подкачки. А дальше требуется добавить опцию resume_offset, которая содержит смещение файла в файловой системе.

GRUB_CMDLINE_LINUX="rd.lvm.lv=rfremix/root rd.lvm.lv=rfremix/swap rhgb quiet usbcore.autosuspend=-1 resume=UUID=7d55bdde-03ef-4adf-a1c3-9b85e2a7f4be  resume_offset=123456"

Как получить значение параметра resume_offset

sudo filefrag -v /hibfile
Filesystem type is: ef53
File size of /hibfile is 2147479552 (524287 blocks of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..   32767:    3342336..   3375103:  32768:
   1:    32768..   65535:    3375104..   3407871:  32768:
   2:    65536..   98303:    3407872..   3440639:  32768:
   3:    98304..  131071:    3440640..   3473407:  32768:
   4:   131072..  163839:    3473408..   3506175:  32768:
   5:   163840..  196607:    3506176..   3538943:  32768:
   6:   196608..  229375:    3538944..   3571711:  32768:
   7:   229376..  262143:    3571712..   3604479:  32768:
   8:   262144..  294911:    3604480..   3637247:  32768:
   9:   294912..  327679:    3637248..   3670015:  32768:
  10:   327680..  360447:    3772416..   3805183:  32768:    3670016:
  11:   360448..  393215:    3805184..   3837951:  32768:
  12:   393216..  425983:    3837952..   3870719:  32768:
  13:   425984..  458751:    3870720..   3903487:  32768:
  14:   458752..  491519:    3903488..   3936255:  32768:
  15:   491520..  524286:    3936256..   3969022:  32767:             last,eof
/hibfile: 2 extents found
<span 				data-mce-type="bookmark" 				id="mce_SELREST_start" 				data-mce-style="overflow:hidden;line-height:0" 				style="overflow:hidden;line-height:0" 			></span>

Первое значение столба physical_offset в первой строке и есть то, что нам надо - смещение файла. Именно его требуется подставить в параметр resume_offset.

Как создать файл подкачки

Сгенерировать пустой файл нужного размера заполненный нулями (XX - требуемый размер в байтах).

sudo dd if=/dev/zero of=/swapfile bs=1024 count=XX

Задать нужные разрешения и подключить сгенерировать стыруктуры файла.

sudo chmod 600 /swapfile && sudo mkswap /swapfile

Активируем новый своп.

sudo swapoff -a
sudo swapon /swapfile

В файле /etc/fstab потребуется деактивировать (закомментировать или удалить) все записи, которые относятся к другим своп-файлам или разделам и добавить строчку, которая будет инициализировать только что созданный.

/swapfile none swap sw 0 0

Можно ли использовать отдельный своп для гибернации и отдельный для подкачки?

Это вполне логичный вопрос. Допустим, что наш своп равен или больше размера оперативной памяти. Что произойдет если мы попытаемся перевести систему в спящий режим когда пустое место в подкачке меньше, нежели занимаемая оперативная память? Ничего. Получим сообщение об ошибке в dmesg.

Конечно же нам захочется для улучшения надежности работы системы сделать отдельную подкачку и файл (раздел) для гибернации, который не будет подключен через swapon.

Увы, при попытке реализации такой схемы мы увидим сообщение об ошибке

PM: Cannot find swap device, try swapon -a

Эта ошибка наглядно показывает, что код управления питанием пока еще очень сильно переплетен с кодом управления памятью.

Литература

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

w

Connecting to %s