Гибернация

Материал из ALT Linux Wiki

Гибернация при использовании swap-файла

Справка от разработчиков ядра Linux:

В отличии от настройки гибернации для swap-раздела, настройка для swap-файла имеет ряд важных нюансов. Кроме указания UUID, требуется указать смещение (physiscal_offset) заголовка файла в файловой системе и записать эту информацию в загрузочный образ initrd.img.

Важные примечания по swap для гибернации:

  • Размер swap-файла должен быть по размеру ОЗУ или несколько больше.
    • Меньший объём допустим, но несёт риск потери данных при использовании гибернации с высокой заполненностью ОЗУ.
    • Если в сценарии использования нередкость высокая заполненность ОЗУ с вытеснением данных в swap, то размер области подкачки стоит сделать больше, чем размер ОЗУ. Это необходимо, чтобы при активации гибернации в момент высокой загруженности уместились данные как из ОЗУ, так и вытесненные в swap. Дополнительный размер потребуется вывести исходя из личного опыта использования системы. Как правило, достаточно +15% к объёму ОЗУ.
  • При наличии нескольких swap-файлов или разделов для гибернации допустимо использовать только одну область подкачки.

Подготовка к использованию гибернации

Заключается в получении UUID и значения смещения заголовка swap-файла относительно начала раздела. Значение UUID будет использоваться для параметра resume=UUID, которое будет помещено в загрузочную запись и загрузочный образ. Значение смещения заголовка требуется для параметра resume_offset, который так же, как и resume=UUID, необходимо указать в загрузочной записи.

Получение сведений об UUID

su-
findmnt -no UUID -T /swapfile
  • -n — убрать из вывода информацию о заголовках столбцов.
  • -o — столбец, из которого нужно вывести информацию. В данном случае это UUID.
  • -T — принимает путь до конкретной файловой системы.

В выводе окажется строка подобного вида: 507c4821-5c4b-4c9c-86c1-81e6d7761607

Определить смещение заголовка swap-файла

Команда на вывод таблицы с искомым значением physiscal_offset:

filefrag -v /swapfile

В выведенной таблице из столбца physiscal_offset взять первое числовое значение, исключая точки:

Altlinux hibernation swap a 10.png

Внесение значений в загрузочную запись

Отредактировать /etc/default/grub, внеся в строку GRUB_CMDLINE_LINUX_DEFAULT параметры resume=UUID и resume_offset с ранее полученными значениями:

GRUB_CMDLINE_LINUX_DEFAULT="resume=UUID=507c4821-5c4b-4c9c-86c1-81e6d7761607 resume_offset=11503616 quiet splash"

Примечание: Если по какой-то причине swap-файл был перемещён, потребуется изменить значение смещения на актуальное. Если файл был удалён, а затем пересоздан, то потребуется актуализировать его UUID.

Обновление загрузочного образа initrd.img

Чтобы загрузить операционную систему при выходе из гибернации, ядру на раннем этапе загрузки необходимо получить сведения, откуда загружать данные. Для этого необходимо внести в загрузочный образ ядра (initrd.img) сведения о UUID и physiscal_offset swap-файла.

Для этого в конец файла /etc/initrd.mk добавить следующую строку:

echo 'RESUME=UUID=507c4821-5c4b-4c9c-86c1-81e6d7761607 resume_offset=11503616' | tee -a /etc/initrd.mk

Теперь необходимо непосредственно пересоздать загрузочный образ, чтобы в него записались указанные значения. Это можно осуществить с помощью утилиты make-initrd. Образ будет пересоздан для конкретного ядра, поэтому нужно узнать полное название. Для этого выполнить:

uname -r

В выводе будет полное название ядра. Пример:

6.1.30-un-def-alt1

Команда на обновление образа:

make-initrd --kernel=6.1.30-un-def-alt1

После успешного завершения операции остаётся обновить загрузочную запись в GRUB:

update-grub

После перезагрузки всё будет готово для использования гибернации.

Гибернация при использовании раздела swap

Для корректного выхода из спящего режима при использовании раздела подкачки (swap) должен быть правильно установлен параметр загрузки resume=. Он указывает на раздел, с которого происходит восстановление после гибернации. Это актуально при создании раздела подкачки вручную.

Посмотреть текущие параметры загрузки ядра можно с помощью команды:

cat /proc/cmdline

Или другим способом:

journalctl -b | grep "Command line"
dmesg | grep "Command line"

Для добавления параметра загрузки resume= нужно определить идентификатор раздела подкачки:

su -
blkid | grep swap

Найти запись о разделе подкачки (идентификатор в Вашем случае будет другой):

/dev/sda3: UUID="b7fed2ff-45a7-41f1-a7a1-d24fa85bf5b1" TYPE="swap" PARTUUID="a1fbc912-01"

Отредактировать файл /etc/default/grub:

mcedit /etc/default/grub

Изменить параметр GRUB_CMDLINE_LINUX_DEFAULT (параметры в Вашем случае будут другие):

GRUB_CMDLINE_LINUX_DEFAULT=' resume=UUID=d6640971-3ae0-47db-b9b6-3d92377a4f16 panic=30 quiet loglevel=3 splash psi=1'

Сохранить файл F2 и закрыть текстовый редактор F10.

Обновить конфигурационный файл загрузчика:

update-grub

Что является аналогом команды grub-mkconfig -o /boot/grub/grub.cfg

После перезагрузки восстановление после спящего режима должно работать корректно.