Как включить и настроить гибернацию в Ubuntu 24.04.4 так, чтобы система корректно сохраняла состояние и восстанавливалась после отключения питания?

Ubuntu установлена на LVM внутри LUKS; раздел под swap — в том же LVM. initrd создаётся с помощью drakut, в качестве ядра используется UKI (unified kernel image), загрузчик не применяется — ноутбук загружается из UEFI напрямую в ядро. Ядро собрано из исходников с отключённым режимом lockdown и имеет версию 7.0.0. <br/> Я пытался настроить гибернацию: при выполнении sudo systemctl hibernation ноутбук выключается, но после включения сеанс не восстанавливается.
  • 18 марта 2026 г. 10:01
Ответы на вопрос 2
Коротко — проблема почти всегда в том, что на момент восстановления initramfs не видит (не открывает) зашифрованный контейнер LUKS и не активирует LVM‑том со свопом, либо в командной строке ядра нет правильного параметра resume, либо в самом ядре отключена поддержка гибернации. Ниже — пошаговая инструкция и набор проверок/исправлений, которые обычно решают проблему в вашей конфигурации (LUKS → LVM → swap, initrd собирается dracut, загрузка через UKI).

1) Проверки на уровне ядра и свопа
- Убедитесь, что в конфиге ядра включены опции сна/гибернации:
  - проверьте .config используемого ядра: grep -E "CONFIG_PM|CONFIG_HIBERNATION" /path/to/kernel/.config
  - или если есть /boot/config-7.0.0: grep -E "CONFIG_PM|CONFIG_HIBERNATION" /boot/config-7.0.0
  Нужно, чтобы CONFIG_PM_SLEEP=y и CONFIG_HIBERNATION=y (или эквивалентные опции).
- Убедитесь, что у вас правильно оформлен swap и он достаточно велик:
  - sudo swapon --show
  - sudo blkid /dev/mapper/<VG>-<swapLV>
  - размер LV должен быть >= объёма оперативной памяти, иначе образ не поместится.

2) Узнать UUID swap (лучше использовать UUID)
- sudo blkid /dev/mapper/your-vg-swap
  Скопируйте UUID типа UUID=xxxxxxxx-xxxx-...

3) Правильный параметр resume в командной строке ядра
- Для LVM внутри LUKS нужно, чтобы initramfs до попытки восстановления:
  1) открыл LUKS-контейнер,
  2) активировал LVM,
  3) сделал доступным /dev/mapper/...swap,
  4) затем попытался прочитать образ гибернации со swap.
- В командной строке ядра (та, которую использует UKI) должен быть параметр resume, лучше по UUID: resume=UUID=xxxxxxxx-xxxx
  Альтернативно resume=/dev/mapper/your-vg-swap, но UUID предпочтительнее.

4) Обеспечить, чтобы dracut включал модулы для расшифровки и LVM и модуль resume
- Создайте файл /etc/dracut.conf.d/hibernate.conf (или измените существующий) с содержимым, например:
  add_dracutmodules+=" cryptlvm lvm resume "
  install_items+=" /etc/crypttab "
  # опционально, если нужно явно:
  hostonly="no"
- Пояснения:
  - cryptlvm/crypt/lvm — модули, позволяющие открыть LUKS и активировать LVM в initramfs.
  - resume — модуль, который использует параметр resume=... для поиска образа.
  - /etc/crypttab в initramfs нужен, если вы используете в нём имена/опции монтирования LUKS.

5) Убедиться, что /etc/crypttab корректен
- Пример строки для корневого LUKS-контейнера (если у вас один LUKS):
  cryptroot UUID=1111-2222-... none luks
  (имя cryptroot — как вы хотите; это приведёт к /dev/mapper/cryptroot)
- Если LVM поднимается только после открытия LUKS, dracut по /etc/crypttab правильно откроет контейнер.

6) Реггенерация initramfs (dracut) и пересборка UKI
- Сгенерируйте initramfs для вашего ядра:
  sudo dracut -f --kver 7.0.0
  (или указать путь: sudo dracut -f /boot/initramfs-7.0.0.img 7.0.0)
- Пересоберите UKI так, как вы это делали ранее, включая в него новый initramfs и указав/встроив в него нужную командную строку (resume=..., rd.luks.name=.../rd.luks.uuid=... при необходимости).
  - Важно: так как вы загружаете UKI напрямую через UEFI, командную строку ядра обычно встраивают в UKI при создании. Вам нужно при создании UKI добавить resume=UUID=... и (при необходимости) rd.luks.name=UUID:name или rd.luks.uuid=....
  - Пример параметров, которые часто нужны для dracut: rd.luks.name=<LUKS‑UUID>:cryptroot rd.luks.options=<опции> resume=UUID=<swap-uuid>

Примеры параметров командной строки (пример):
  resume=UUID=aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee rd.luks.name=1111-2222-3333-4444:cryptlvm

7) Тестирование и чтение логов
- После внесения изменений и пересборки UKI:
  - Перезагрузитесь и проверьте, что в /proc/cmdline появились resume=... и rd.luks.name=... (cat /proc/cmdline).
  - Выполните sudo systemctl hibernate
  - Включите ноутбук и если образ не восстановился — загрузился «с нуля» — посмотрите логи:
    - journalctl -b -1 -e   (журнал прошлой загрузки; там могут быть сообщения от initramfs/systemd о попытке resume)
    - dmesg | grep -i resume
    - journalctl -u systemd-suspend.service -b -1
  - В логах ищите фразы: “No resume device”, “Resume device not present”, “skipping resume”, “unable to find image”, “failed to resume from image”, или сообщения от dracut об отсутствии /dev/mapper/…swap.

8) Типичные ошибки и их причины
- Нет resume=... в /proc/cmdline — initramfs не знает, где искать образ.
- initramfs не включает cryptlvm/crypt/lvm/resume — LUKS не открыт или LVM не активирован до попытки resume.
- Неверное имя устройства: вы указали resume=/dev/mapper/vg-swap, но в initramfs LV может иметь другое имя (имена зависимы от /etc/crypttab и LVM). Лучше применять UUID.
- Swap меньше объёма RAM — образ не записался/не восстановился.
- Ядро собрано без CONFIG_HIBERNATION — hibernate выключается, но образ не сохраняется/не загружается.
- Secure Boot/lockdown — если Secure Boot активирован и UKI/ядро/инициализация не подписаны корректно, могут быть ограничения. Вы упомянули, что отключили lockdown в ядре, но если Secure Boot включён, убедитесь, что UKI/модули подписаны или отключите Secure Boot для теста.

9) Если после всех манипуляций проблема остаётся — пришлите:
- вывод sudo blkid для LUKS и swap LV,
- содержимое /etc/crypttab,
- содержимое /etc/dracut.conf.d/hibernate.conf (если есть),
- содержимое /proc/cmdline после загрузки (cat /proc/cmdline),
- вывод journalctl -b -1 -e после неудачного восстановления (или ключевые строки с ошибками).
С этими данными можно точно указать, на каком этапе initramfs пропускает restore.

Короткое резюме действия для вас прямо сейчас
1. Проверьте CONFIG_HIBERNATION в используемом ядре.
2. Узнайте UUID swap: sudo blkid /dev/mapper/…swap
3. Добавьте resume=UUID=… в командную строку ядра внутри UKI (и, при необходимости, rd.luks.name=…).
4. Настройте dracut: add_dracutmodules+=" cryptlvm lvm resume " и install_items+=" /etc/crypttab ".
5. sudo dracut -f --kver 7.0.0
6. Пересоберите UKI с новым initramfs + новой cmdline.
7. Тестируйте и смотрите логи (journalctl -b -1).

Если хотите, могу помочь конкретно: напишите как вы строите UKI (какая команда/скрипт), пришлите вывод blkid для swap и содержимое /etc/crypttab — и я напишу точную строку resume и пример dracut-конфигурации и команды по регенерации/пересборке UKI.
Первое что проверить — есть ли <code>resume=/dev/mapper/имя_vg-swap</code> в командной строке ядра. Раз у тебя UKI, параметры зашиты в образ, так что пересобирай с ним. Ну и в initrd должен быть механизм resume: для dracut это либо модуль <code>resume</code> , либо <code>systemd-hibernate-resume</code> если initrd на systemd. Проверь через <code>lsinitrd</code> что он реально там есть и что LUKS/LVM разблокируются до того как initrd пытается читать swap.
Похожие вопросы