Использование гибернации на Linux с задействованием swap-файла.
Вступление.
Официальная справка:
- https://www.kernel.org/doc/html/latest/power/swsusp.html
- https://www.kernel.org/doc/html/latest/power/swsusp-and-swap-files.html
Использование режима сна (гибернации) при задействовании swap в виде файла, а не раздела, имеет ряд нюансов и требует предварительной настройки. О ней и пойдёт речь в данной заметке.
Пример подготовки использования гибернации со swap-файлом, описываемый в заметке, основан на ALT Workstation K 10.1 с файловой системой ext4.
О непосредственном создании swap в виде файла можно посмотреть здесь: https://noostyche.ru/blog/2020/07/21/ispolzovanie-swap-fayla-vmesto-swap-razdela/
Примечание: Размер swap-файла должен быть по размеру ОЗУ или больше. Меньший объём допустим, но несёт риск потери данных при использовании гибернации с высокой заполненностью ОЗУ.
Примечание: При наличии нескольких swap-фалов или разделов для гибернации допустимо использовать только один swap-файл.
Внесение сведений о swap-файле в загрузочную запись GRUB.
В загрузочную запись нужно добавить сведения о swap-файле, а именно его UUID и смещение заголовка (physiscal_offset) относительно начала раздела, чтобы точно локализовать размещение swap-файла в файловой системе.
Перейти в режим суперпользователя и выполнить все последующие команды:
su -
Определить UUID у swapfile:
findmnt -no UUID -T /swapfile
-n — убрать из вывода информацию о заголовках столбцов.
-o — столбец, из которого нужно вывести информацию. В данном случае это UUID.
-T — принимает путь до конкретной файловой системы.
В выводе окажется строка подобного вида:
bc08b765-a084-4418-9a9b-b9b4d49eb6bc
Определить смещение заголовка относительно начала раздела:
filefrag -v /swapfile
Из вывода в столбце physiscal_offset взять числовое значение, исключая точки:
Это значение будет использоваться для параметра resume_offset.
Вся необходимая информация по swap-файлу собрана, теперь её необходимо внести в /etc/default/grub, добавив полученные значения UUID и physiscal_offset в строку GRUB_CMDLINE_LINUX_DEFAULT:
GRUB_CMDLINE_LINUX_DEFAULT="resume=
UUID=
bc08b765-a084-4418-9a9b-b9b4d49eb6bc resume_offset=139264 quiet splash"
Примечание: Если по какой-то причине swap-файл будет изменён, то как минимум потребуется изменить значение смещения на актуальное. Если файл был удалён, то потребуется актуализировать и UUID.
Обновление загрузочного образа initrd.img.
Чтобы ядро на раннем этапе загрузки системы имело представление о том, откуда и какие данные загружать для выхода из гибернации, необходимо внести в загрузочный образ ядра (initrd.img) сведения о UUID и смещении swap-файла (resume_offset).
Для этого в конец файла /etc/initrd.mk добавить следующую строку:
echo 'RESUME=UUID=bc08b765-a084-4418-9a9b-b9b4d49eb6bc resume_offset=139264' | tee -a /etc/initrd.mk
После требуется пересоздать загрузочный образ, чтобы в него вошли указанные данные. Это можно осуществить с помощью утилиты make-initrd. Более подробно о ней можно почитать здесь: https://www.altlinux.org/Make-initrd
Образ будет пересоздан для конкретного ядра, поэтому нужно узнать полное название. Для этого выполнить:
uname -r
В выводе будет полное название ядра. Пример:
5.15.96-un-def-alt1
Команда на обновление образа:
make-initrd --kernel=
5.15.96-un-def-alt1
Обновить загрузочную запись в GRUB:
update-grub
После перезагрузки можно использовать гибернацию (режим сна).