Гибернация в Linux — это не «ещё один режим сна», а полноценное выключение с сохранением содержимого памяти в swap. Ноутбук перестаёт потреблять энергию, а после включения возвращает открытые окна и сеансы. Работает это только при согласованной настройке: достаточный swap, правильный параметр resume=, обновлённый initramfs и поддержка со стороны прошивки. Ниже — проверенная последовательность для Debian, Ubuntu, Linux Mint, Fedora и Arch.

Чем гибернация отличается от сна

Обычный сон (S3 или современный s2idle) отключает экран и большинство устройств, но продолжает питать оперативную память. Гибернация (S4) записывает образ памяти на диск и выключает питание полностью. Есть и промежуточный вариант: система засыпает, а через заданное время сама уходит в гибернацию.

cat /sys/power/state
cat /sys/power/disk
cat /sys/power/resume
swapon --show
free -h

/sys/power/state должен содержать слово disk. Если там только freeze и mem, ядро или прошивка не предлагают гибернацию. /sys/power/disk показывает режимы платформы, а /sys/power/resume — устройство, с которого ядро попытается восстановить образ.

Сколько нужно swap

Для гибернации объём swap должен вмещать образ памяти. На практике берут не меньше объёма RAM плюс запас: при 8 ГБ ставят 10–12 ГБ, при 16 ГБ — 20 ГБ, при 32 ГБ — 36–40 ГБ. Запас нужен потому, что в образ попадает не только занятая память, но и служебные структуры, а сжатие образа не гарантировано.

  • Отдельный swap-раздел проще для resume=UUID= и не зависит от файловой системы.
  • Swap-файл гибче: его можно увеличить без переразметки диска.
  • zram экономит RAM, но не подходит для гибернации: он живёт в памяти и исчезает при выключении.
  • Шифрованный swap с одноразовым ключом гибернацию не переживёт — после выключения ключ потерян.

Создание swap-файла

Для ext4 подойдёт fallocate. Файл должен лежать на локальном диске, а не на сетевой ФС.

sudo fallocate -l 20G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
sudo swapon --show

В Btrfs swap-файл создают специальной командой: обычный fallocate там не годится из-за особенностей COW.

sudo mkdir -p /swap
sudo btrfs filesystem mkswapfile --size 20G /swap/swapfile
sudo swapon /swap/swapfile
echo '/swap/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
sudo btrfs filesystem show /

После перезагрузки проверьте, что swap подключился: swapon --show должен показать файл и его размер. Если запись в /etc/fstab ошибочна, система может уйти в аварийный режим — держите под рукой загрузочную флешку.

Параметры resume= и resume_offset=

Для swap-раздела ядру достаточно UUID раздела. Для swap-файла нужен UUID корневой файловой системы и физическое смещение первого экстента.

sudo findmnt -no UUID /
sudo filefrag -v /swapfile | awk '$1=="0:" {gsub(/\.\./,"",$4); print $4}'
cat /proc/cmdline

Подставьте UUID корня и полученное смещение в параметры ядра. В Debian, Ubuntu и Mint правят /etc/default/grub, затем обновляют grub и initramfs.

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=UUID=11111111-2222-3333-4444-555555555555 resume_offset=123456"
sudo update-grub
sudo update-initramfs -u -k all
sudo reboot

В Fedora команда обновления другая, а initramfs пересобирает dracut. В Arch добавляют hook resume в mkinitcpio.conf после udev и выполняют mkinitcpio -P. Ошибка в UUID или смещении приводит к тому, что система просто не находит образ и загружается с нуля — данные при этом не теряются, но и сеанс не возвращается.

Проверка гибернации

Сначала убедитесь, что ядро видит swap и режим disk, затем попробуйте уйти в гибернацию вручную.

sudo systemctl hibernate
journalctl -k -b 0 | grep -iE "hibernat|resume|swap"
journalctl --list-boots
sudo systemctl suspend-then-hibernate

После пробуждения журнал текущей загрузки покажет, был ли образ записан и прочитан; --list-boots поможет найти предыдущую попытку, если система загрузилась заново. Если systemctl hibernate завершается ошибкой «Not enough swap space for hibernation», увеличьте swap или уменьшите объём занятой памяти. Сообщение о недоступности режима обычно означает, что в /sys/power/state нет disk. Если ноутбук после команды выключается, но при включении загружается заново, ищите в журнале строки об образе: они подскажут, на каком этапе восстановление прервалось.

Крышка, гибридный сон и таймеры

Поведение при закрытии крышки задаёт systemd-logind. Правьте не основной файл, а drop-in — обновления пакета его не затрут.

sudo mkdir -p /etc/systemd/logind.conf.d
sudo tee /etc/systemd/logind.conf.d/99-lid.conf <<'EOF'
[Login]
HandleLidSwitch=suspend
HandleLidSwitchExternalPower=suspend
HandleLidSwitchDocked=ignore
EOF
systemctl restart systemd-logind

Для сценария «поспать полчаса, потом гибернация» настройте секцию [Sleep] в /etc/systemd/sleep.conf: AllowHibernation=yes и HibernateDelaySec=30min. Команда systemctl suspend-then-hibernate сначала погружает систему в сон, а по таймеру переводит в гибернацию. Гибридный сон systemctl hybrid-sleep пишет образ на диск, но оставляет память под питанием — это страховка на случай внезапного отключения батареи.

Если гибернация не работает

  • Secure Boot и lockdown: при включённой проверке подписи ядро может запрещать гибернацию. Проверьте mokutil --sb-state и журнал ядра.
  • Мало swap: образ не помещается, ядро отказывается засыпать.
  • Неверный resume=: система загружается с нуля, в журнале нет строк о восстановлении.
  • initramfs не обновлён: модуль resume не попал в образ, и ядро не умеет прочитать swap.
  • Прошивка ноутбука не поддерживает S4: некоторые модели умеют только современный ждущий режим.
  • Шифрованный swap со случайным ключом: после выключения ключа нет, образ не удастся расшифровать.
mokutil --sb-state
cat /proc/cmdline
dmesg | grep -iE "ACPI.*supports S|hibernat"
journalctl -k | grep -i "PM: Image"

Эти четыре команды дают почти всю картину: статус Secure Boot, фактические параметры ядра, поддержку состояний прошивкой и сообщения о записи образа. Если в dmesg нет упоминания S4, настройка со стороны ОС уже ничего не изменит.

Итог

Гибернация требует дисциплины: swap не меньше объёма памяти, корректный resume=, обновлённый initramfs и проверка после каждой смены ядра. Настройка занимает один вечер, зато ноутбук перестаёт разряжаться в рюкзаке, а рабочий сеанс переживает выключение. Начните с проверки /sys/power/state и объёма swap, затем добавьте параметры загрузки и протестируйте systemctl hibernate до того, как полагаться на неё в поездке.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Поделиться: Telegram ВКонтакте