Содержание
Что это и как это работает?
Спящий режим (hibernate) – энергосберегающий режим операционной системы компьютера, позволяющий сохранять содержимое оперативной памяти на энергонезависимое устройство хранения данных (жесткий диск) перед выключением питания.
При засыпании все данные процессов вытесняются в swap файл, а также в swap сохраняются некоторые настройки устройств, и после этого система переходит в режим с полным отключением питания.
При включении компьютера система начинает загружаться как обычно, но если в процессе загрузки ядро обнаруживает образ памяти сохраненный в swap, то загрузка в нормальном режиме прекращается и начинается восстановление состояния оперативной памяти из swap-а. Кроме этого восстанавливаются настройки устройств (видеоадаптер, сетевые карты, и пр.).
И вот именно с восстановлением работоспособности устройств компьютера и связаны все основные проблемы с режимом сна. Не всегда драйвера устройств позволяют осуществить необходимые действия по сохранению и восстановление настроек после сна. И это может приводить к зависанию компьютера после попытки проснуться.
Еще одна неприятность этого режима проявляется при больших объемах оперативной запоминающей памяти компьютера. Речь идет об объемах оперативной памяти от 8Gb и выше (что в последние годы встречается все чаще). Если памяти много, то и много придется сохранять в swap при засыпании и соответственно вычитывать из swap при просыпании. Из за этого засыпание и просыпания могут занять довольно значительное время. Может оказаться, что вам проще и гораздо быстрее все-таки сохранить свою работу и выключить нормально компьютер, а потом, после обычной загрузки, открыть свои рабочие файлы заново.
Именно из-за озвученных выше особенностей режима сна в последних версиях Ubuntu по умолчанию этот режим энергосбережения отключен.
Настройка
Для поддержки работы данного режима у вас должен присутствовать swap-раздел или (рекомендуется) swap-файл.
Рекомендации по созданию swap-раздела можно просмотреть здесь.
Вариант со swap-файлом является более удобным в использовании (но чуть более сложным при создании) т.к. он не занимает отдельный раздел, легко удаляется, его размер можно легко изменить (без необходимости менять разметку диска и двигать/изменять размеры других разделов).
Но учтите, не на любой файловой системе можно создать (и использовать) swap-файл: из за некоторых особенностей организации размещения файлов на диске swap-файл нельзя использовать на файловой системе btrfs (без специальных ухищрений).
Создание swap-файла
Про рекомендуемый размер swap-файла можно узнать здесь.
Создайте файл размером 4 ГБ в корневом каталоге (убедитесь, что у вас хватает свободного места):
sudo dd if=/dev/zero of=/swapfile bs=1M count=4096
Дайте файлу необходимые права и создайте в нем область подкачки:
sudo chmod 600 /swapfile && sudo mkswap /swapfile
Вручную подключите файл как swap:
sudo swapoff -a sudo swapon /swapfile
Допишите строку в fstab, чтобы созданный swap подключался автоматически при запуске системы.
echo "/swapfile swap swap defaults,pri=<Приоритет (от 0 до 32767)> 0 0"| sudo tee -a /etc/fstab
Настройка гибернации в swap-файл
Узнайте UUID корневого раздела (с помощью mount можно узнать, какой из разделов является корнем):
mount | grep " / " sudo blkid
Укажите первый физический блок swap-файла. Его можно узнать с помощью
swap-offset
из пакетаuswsusp
:sudo swap-offset /swapfile
Запишите ваши параметры в файл настроек initramfs:
echo "resume=UUID=<your UUID> resume_offset=<your offset>" | sudo tee /etc/initramfs-tools/conf.d/resume
и в конфиг GRUB:
sudo nano /etc/default/grub
В строку
GRUB_CMDLINE_LINUX_DEFAULT
добавьте параметры без кавычек и знаков ><:resume=UUID=<your UUID> resume_offset=<youroffset>
Обновите настройки GRUB и сгенерируйте новый initramfs:
sudo update-grub sudo update-initramfs -u
Перезагрузитесь.
Проверьте работу гибернации с помощью команды pm-hibernate
из пакета pm-utils
:
sudo pm-hibernate
Если у вас все работает - переходите к следующему пункту.
Если нет — воспользуйтесь утилитой uswsusp
.
sudo s2disk
Если у вас все заработало - радуйтесь, если нет - придется конфигурировать uswsusp
:
sudo dpkg-reconfigure -pmedium uswsusp
На вопрос «Продолжить без работоспособного пространства подкачки?» в случае использования swap-файла отвечаем «Да», пространство подкачки в диалоге указываем по UUID (/dev/disk/by-uuid/<your UUID>), раздел не шифруем (иначе может случиться подобное описанному здесь). После этого автоматически будет сформирован uswsusp.conf с необходимыми параметрами. Пробуем опять:
sudo s2disk
Если заработало, заменяем вызов pm-hibernate
на s2disk
:
echo "SLEEP_MODULE=uswsusp" | sudo tee -a /etc/pm/config.d/module
Снова проверьте гибернацию (возможно, перед этим потребуется перезагрузка):
sudo pm-hibernate
Если не заработало с uswsusp
, используйте TuxOnIce - он обычно работает без проблем.
Если гибернация заработала, то остается только активировать кнопку «Спящий режим» в меню выключения. Для этого:
Измените настройки policitykit:
sudo nano /var/lib/polkit-1/localauthority/10-vendor.d/com.ubuntu.desktop.pkla
Найдите блоки, посвященные hibernate:
[Disable hibernate by default in upower] Identity=unix-user:* Action=org.freedesktop.upower.hibernate ResultActive=no [Disable hibernate by default in logind] Identity=unix-user:* Action=org.freedesktop.login1.hibernate ResultActive=no
и измените в них параметр ResultActive с no на yes.
Перезапустите X-сервер.
Если гибернация работает по вызову pm-hibernate
, но не работает по кнопке «Спящий режим» в меню выключения, то, возможно, проблема в том, что эта кнопка вызывает команду systemctl hibernate
, которая по умолчанию не поддерживает uswsusp
(подробно эта проблема в LXDE описана здесь).
Для решения этой проблемы внесите правки в конфигурационный файл:
sudo cp /lib/systemd/system/systemd-hibernate.service /etc/systemd/system/ sudo nano /etc/systemd/system/systemd-hibernate.service
Замените в нём параметр ExecStart с
ExecStart=/lib/systemd/systemd-sleep hibernate
на
ExecStart=/bin/sh -c 's2disk && run-parts --regex .\* -a post /lib/systemd/system-sleep'