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 можно при помощи 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


Первое значение столба 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 ```

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

Литература

Категории: HowTo