Настройка гибернации на Ubuntu 24.04 (LVM + swapfile)#

Недавно мне достался рабочий ноутбук с предустановленной Ubuntu 24.04.
Система свежая, всё работает стабильно, но гибернация по умолчанию не была настроена.

Конфигурация ноутбука#

  • UEFI
  • Secure Boot — отключён
  • 32 ГБ RAM
  • Корень на LVM (/dev/mapper/ubuntu–vg-ubuntu–lv)
  • Без шифрования (без LUKS)
  • Без отдельного swap-раздела

Было решено настроить гибернацию через swap-файл без создания дополнительного раздела.

Шаг 1. Создание swap-файла#

Так как RAM — 32 ГБ, был создан swap-файл 36 ГБ:

sudo swapoff -a
sudo fallocate -l 36G /swapfile

Если fallocate не подходит:

sudo dd if=/dev/zero of=/swapfile bs=1M count=36864 status=progress

Далее:

sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

Добавляем в fstab:

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

Проверка:

swapon --show

Шаг 2. Получение resume_offset (ключевой момент при LVM)#

Получаем физический offset первого блока swap-файла:

sudo filefrag -v /swapfile | awk '$1=="0:" {print $4}' | sed 's/\.\.//'

или

sudo filefrag -v /swapfile

В выводе нужна строка вида:

0:  123456..  ...

Число 123456 — это и есть resume_offset.


Шаг 3. Получаем UUID корневого тома#

findmnt -no SOURCE /

Пример:

/dev/mapper/ubuntu--vg-ubuntu--lv

Далее:

sudo blkid /dev/mapper/ubuntu--vg-ubuntu--lv

Копируем UUID.


Шаг 4. Настройка GRUB#

Редактируем:

sudo nano /etc/default/grub

Было:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

Стало:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=UUID=ВАШ_UUID resume_offset=ВАШ_OFFSET"

Применяем:

sudo update-grub
sudo update-initramfs -u

Шаг 5. Проверка поддержки гибернации#

cat /sys/power/state

Если видим:

freeze mem disk

— гибернация поддерживается.


Шаг 6. Тест#

systemctl hibernate

После включения ноутбук восстанавливает предыдущую сессию.


Настройка реакции на закрытие крышки (systemd-logind)#

Редактируем:

sudo nano /etc/systemd/logind.conf.d/lid-action.conf

Меняем параметры:

HandleLidSwitch=hibernate
HandleLidSwitchExternalPower=suspend
HandleLidSwitchDocked=ignore

Перезапускаем сервис:

sudo systemctl restart systemd-logind

Теперь при закрытии крышки ноутбук уходит в гибернацию.

Итог#

  • Гибернация работает через swap-файл
  • LVM корректно учтён через resume_offset
  • Закрытие крышки переводит ноутбук в hibernate
  • Отдельный swap-раздел не потребовался