Обычный сон держит память под напряжением и садит батарею, а гибернация сбрасывает снимок системы на диск и выключает машину полностью. На ноутбуке это разные судьбы: закрытая крышка на неделю в рюкзаке может пережить только гибернацию. В Linux механизм называется suspend to disk, и он давно надёжен, но настройка через swap-файл окружена деталями: формат заголовка, смещение файла, параметры initramfs и капризы UEFI. В статье - рабочая процедура целиком: от подготовки swap-файла до проверки цикла сна и пробуждения.

Swap-файл против swap-раздела, почему файл выиграл

Исторически гибернацию делали на swap-раздел: он гарантированно непрерывен и всегда присутствует на диске к моменту загрузки. Swap-файл проще в эволюции: добавить или увеличить файл легче, чем переразметить диск. Современные ядра и systemd отлично работают с файлом на ext4, и единственное требование - знать смещение первого блока файла и включить его в resume. На Btrfs ситуация богаче из-за ограничений CoW, на современных ядрах файл на Btrfs годится лишь с NOCOW атрибутом, и это один из первых моментов, забываемых в полевой практике.

Размер выбирается по простой формуле: снимок памяти занимает до половины RAM плюс рабочий запасоём, и на машине с 16 ГБ привычная норма это swap-файл в 8-12 ГБ. Полное правило записывается в /sys/power/image_size: оно ограничивает образ гибернации указанным максимумом, и при большом файле сбытка тянуть не будет. Для полного покоя ставят файл равным RAM, хотя на практике образ заметно меньше.

Подготовка swap-файла шаг за шагом

Процедура на ext4 выглядит так: сначала создаётся файл нулевой фрагментации - fallocate -l 12G /swapf или медленный, но надёжный dd if=/dev/zero of=/swapf bs=1M count=12288; права выставляются в 600, форматируется mkswap /swapf, включается swapon /swapf и прописывается в /etc/fstab строкой /swapf none swap sw 0 0. Дальше два значения отправляются в конфигурацию загрузки: UUID раздела с файлом и смещение первого физического блока файла, которое возвращает filefrag -v /swapf в первой строке таблицы.

На Btrfs перед созданием файла в каталоге назначения включается chattr +C, затем создаётся файл и только потом область mkswap; нарушение порядка даёт файл с CoW, и swapon любезно откажет. На старых ядрах swap на Btrfs не работал вовсе; сегодня работает, но с оговорками, и в тикете на починку вы быстро поймёте почему все эти приставки описаны в документации внимательно.

Подключение resume в загрузку и initramfs

Механика пробуждения требует, чтобы ядро на ранней стадии загрузки знало, где лежит свежий образ: два параметра командной строки resume=UUID=... и resume_offset=<число> добавляются в настройки загрузчика. В GRUB это строка GRUB_CMDLINE_LINUX_DEFAULT в /etc/default/grub с последующим update-grub, в systemd-boot - запись options в соответствующем файле loader. После этого пересобирается initramfs с поддержкой resume: в Debian и Ubuntu заботу берёт на себя update-initramfs -u, а в системах вроде mkinitcpio проверяется хук resume в списке HOOKS.

Проверка, что механика встала: cat /sys/power/state перечислит disk среди доступных режимов, а systemctl hibernate сам выполнит цикл. Без параметров resume ядро при пробуждении просто загрузится заново и потерянное состояние не восстановится - чаще всего именно это и бывает, когда люди говорят "гибернация не работает". Проверка стартует логом: journalctl -b -u systemd-hibernate дождётся вас после пробуждения.

UEFI, Secure Boot и иные тонкие места

С включённым Secure Boot гибернация работает: ядро подписывает образ и проверяет его при пробуждении, и вам не нужно ничего выдумывать, кроме одного: повреждённый образ вместо загрузки приведёт к чистому старту. Это спроектировано так, а не сломано - чужой ноутбук с подписанным образом чужой машины не проснётся. Со включённым шифрованием swap требования строже: ключ либо фиксированный и задан при выключении, либо консоль спросит пароль ещё до resume; самая гладкая схема на современных установках это LUKS-контейнер, приём который связывает всё вместе.

Тонкое место второе - специализированные set-флаги памяти: у системы с очень большим объёмом ОЗУ сброс полного образа занимает десятки секунд, и зажатие image_size в /sys/power/image_size регулирует размер снимка жёстко. Проблема обратной стороны - слишком маленький потолок: образ не влезает, и гибернация гасится ошибкой до выключения. Золотая середина равна размеру подкачки минус резерв, и она почти никогда не возникает у людей, которые сделали swap-файл примерно равным памяти.

Доводка сна на каждый день

Гибернация востребована не только по команде: замечательная привычка называется suspend-then-hibernate в systemd. Машина сначала засыпает в оперативку, а через заданный таймаут (например 60 минут) просыпается сама ровно настолько, чтобы сбросить образ на диск и выключиться окончательно. Включается это правкой SleepAction=hibernate и таймера HibernateDelaySec в /etc/systemd/sleep.conf. Результат ощущается как идеальный сценарий: короткий перерыв - мгновенное пробуждение, длинный перерыв - нулевой расход батареи.

Крайние диагностические приёмы из практики: если система просыпается мгновенно, не делая дисковой паузы, значит образ не обнаружен и не поднят - смотрите параметры cmdline. Если пробуждение встаёт на черном экране с мигающим курсором, проверяйте, что драйвер GPU инициализировался раньше чтения образа: параметры resumeв kms-режиме и строгий порядок загрузки модулей через initramfs решают большинство таких случаев без паники.

Завершение, зрелая пацификация электропитания

После правильной настройки сон на диск перестаёт быть трюком и становится обычным режимом, благодаря которому ноутбук вообще перестаёт думать об энергии. Откройте крышку через неделю - всё на месте, окна в том же положении, а заряд такой, как будто машина и не закрывалась. Это и есть собственно то, что мы ставили: технологическая невидимость, ради которой всё и делается.

Проверка, что всё работает, контрольный прогон

Не ждите пятницы, проверьте сразу. План простой: открыто несколько приложений и пара документов, заряда выше половины, и боковым зрением журнал journalctl -f в соседнем терминале. Вызывается systemctl hibernate: экран гаснет, диск шуршит секунды, машина выключается. При включении появляется сначала привычный POST, затем чтение образа из swap, и через десятки секунд вы оказываетесь в точности там, где остановились. Любое другое поведение считывается по журналу и не является загадкой: resume не найден - параметры загрузчика, машина не просыпается до конца - обычно видеодрайвер или жёсткий PWM на старых подсветках.

Второй контрольный заход - циклы: три подряд сна и пробуждения ловят утечку ресурсов в драйверах, и на стабильной конфигурации циклы проходят бесконечно. Третий заход продвинутый: сон в середине загрузки большого файла по сети - обновление там и прочая рутина невозобновляема, но сама система обязана вернуться без потери состояния. После трёх таких прогонов смело доверяйте гибернации ноутбук на выходные.

Когда гибернация не срабатывает, разбор отказов

Самое частое объяснение забытой настройки хранится в строчке /sys/power/disk: значение platform там самое безопасное, а вариант shutdown попросту выключит машину, не изобразив образа. Пользователи systemd ставят значение в конфиге sleep.conf, где строка HibernateMode=platform говорит железу заниматься сохранением состояния привычным способом. Второй по распространению отказ - слишком маленький лимит образа: файл подкачки есть, но записать туда быструю память машины не удаётся, и journalctl -u systemd-hibernate скажет про нехватку места честным текстом.

Третий тип неполадки - пробуждение с барышнями: чёрный экран после успешного чтения образа. Обычно виновата графическая инициализация, а честное лечение состоит в принудительной задержке восстановления KMS: опции модуля типа i915.enable_psr=0 на старых iGPU устраняют половину известных случаев. Четвёртый класс - внезапные пробуждения: лифт через /proc/acpi/wakeup перечисляет устройства, которые могут будить машину, и настоящий покой наступает после того, как дребезжащие USB-мыши и крышки Ethernet отправлены туда, где им положено быть, - в disabled.

Что гибернация даёт современному ноутбуку

Смотрите на используемую схему: в офисе машина дышит suspend и мгновенно готова, в пути хозяин сворачивает крышку и не ждёт счетов за аккумулятор, дома машина остаётся в чулане из полной разрядки - и возвращается к работе ровно в том состоянии, в котором была прервана. Этот порядок освобождает и от регулярного ритуала "закрыл работу перед сном", что звучит банально, но меняет отношение к машине: она перестаёт быть организмом требующего ухода и становится просто инструментом, который всегда готов.

И маленькое замечание в заключение: держите setup-документацию под рукой - два параметра resume и resume_offset в тексте рядом с процедурой чинят половину всех забытых конфигураций после чистовой переустановки системы. Человеку с хорошей памятью операция не нужна, остальным она спасает вечер.

Связка с LUKS и TPM, куда помещается шифрование

У большинства ноутбуков диск зашифрован, и гибернация вступает в игру только через имеющийся слой: swap-файл живёт поверх LUKS, и образ сна автоматически оказывается зашифрованным тем же блочным устройством. Последствие очевидное: проснуться без ввода ключевой фразы нельзя, и это естественная цена безопасности. Альтернатива есть: systemd-cryptenroll умеет связывать ключи с TPM, и на ноутбуках с модулем TPM2 чтение образа из сна не требует парольных плясок - железо подтверждает измерения прошивки и отпускает ключ только родной системе.

Эта ветка описана в соседней статье этой серии про TPM и LUKS, и тем, кто строит ноутбук для одного себя, стоит взглянуть туда прямо сейчас, потому что сон на диск и TPM-разблокировка слагаются в лучший бытовой сценарий безопасности из существующих.

Мелочи последнего шага, дисциплина fstab и контроль места

Два правила сохранят воскресенья. Первое: после каждого обновления ядра проверяйте, что initramfs был пересобран - в современных дистрибутивах это хук пакета, и ручное вмешательство обычно не требуется; проверка лёгкая: загляните в момент обновления в вывод менеджера пакетов и удостоверьтесь, что там прозвучало update-initramfs. Второе: не давите диск до упора - образ сна должен поместиться в файл подкачки, даже когда выгружается вся ваша RAM с куском кэша; три процента запаса на устройстве к заполнению это минимум комфортного пространства, о котором потом не надо думать.

И в качестве финишной прямой: после такой настройки добавьте гибернацию в меню крышки и автоматические сценарии power manager: machine закрывается в определённый час или по событию, а вы не замечаете ничего, кроме мягкого света шнурового индикатора и спокойствия относительно утреннего заряда. Для этого всё и делалось.

Отдельная благодарность старым добрым привычкам: swap-файл, initramfs и пара строчек в конфигурации загрузчика - и ноутбук обретает паузу, за которую его владельцу не приходится платить ни временем, ни зарядом. Это редкий случай, когда настройка не добавляет сложности, а снимает её.

В конце пути остаётся простая привычка проверять конфигурацию после каждого обновления системы, и ещё один вечер на становление окупается сотнями спокойно закрытых крышек. Это и был изначальный замысел всей истории о сне на диск.
Всё остальное - это уже просто привычка, которая образуется сама.
Закрывайте крышку спокойно.
И пусть он будет спокойным.
На этом история со сном на диск закончена, и впереди у неё годы тихой работы, как и полагается всему настроенному когда-то правильно.
Спокойной ночи.