Коротко — проблема почти всегда в том, что на момент восстановления 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.