Использование гибернации systemctl
и заставить ее работать в сложных случаях
Для меня pm-hibernate
всегда не получается. После некоторых настроек я смог перейти в спящий режим, используя интерфейс systemd (init system в 16.04 и выше). Мне также удалось заставить его работать 17.04 с файлом подкачки. Это тематическое исследование может быть полезно для других с проблемами.
Первая попытка:
sudo systemctl hibernate
Если это не удается, начните устранение неполадок: в состоянии гибернации (HTD или ACPI S4) состояние машины записывается на диск, поэтому для его сохранения не требуется никакого питания. Состояние записывается либо в раздел подкачки, либо в файл подкачки. Примечание: если вы используете Btrfs, НЕ пытайтесь использовать файл подкачки, так как это может привести к повреждению файловой системы.
Ваш раздел подкачки или файл подкачки может потребоваться иметь тот же размер , как RAM , чтобы позволить спящий режим, но есть хороший шанс , что вы будете в состоянии гибернации , если он , по крайней мере 2/5 размер оперативной памяти, в соответствии с вики - страницу Arch , поэтому попробуйте другие шаги, прежде чем увеличивать размер свопа.
Если ваша проблема заключается в том, что вы получаете чистую загрузку вместо ожидаемого возобновления, как минимум вам, скорее всего, потребуется установить параметр загрузки, чтобы найти образ диска
Найдите свой раздел подкачки:
grep swap /etc/fstab
для меня это возвращает (частичный вывод)
# swap was on /dev/mmcblk0p3 during installation
где /dev/mmcblk0p3
указывается раздел
Добавьте параметр загрузки:
sudoedit /etc/default/grub
В начале строки GRUB_CMDLINE_LINUX_DEFAULT
добавьте resume=/dev/YourSwapPartition
раздел в кавычки (замените на раздел, который вы определили ранее). Используя мой пример:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=/dev/mmcblk0p3"
Каждый раз, когда вы изменяете этот файл, вы должны запускать, sudo update-grub
иначе изменения не будут иметь никакого эффекта.
Теперь вам нужно перезагрузиться. Затем вы можете попробовать перейти в спящий режим, введя команду:
sudo systemctl hibernate
Для возобновления нажмите кнопку питания, и система загрузится.
Если у вас все еще есть проблемы, начните отладку.
Ниже я привожу мой пример в качестве примера, но подробную информацию об отладке S-состояний можно найти в этом блоге, а также в этом .
Установите еще несколько параметров загрузки, чтобы получить больше информации. Удалите quiet
и splash
и добавьте, initcall_debug
и no_console_suspend
это приведет к тому, что системные вызовы init будут напечатаны на консоли, чтобы вы могли наблюдать, что происходит не так. Я установил это:
GRUB_CMDLINE_LINUX_DEFAULT="resume=/dev/mmcblk0p3 no_console_suspend initcall_debug"
Что помогло мне увидеть, что пошло не так при выходе из спящего режима.
В моем случае после возобновления я потерял WiFi, и ядро явно было расстроено, так как большинство команд (например, чтение чего-либо из /sys
, перезагрузка модулей или любая systemctl
команда) не работали бы - процесс, казалось бы, запускался и просто зависал (все это было бы нормализовался после перезагрузки конечно). Наблюдая за тем, как система очень медленно выключалась и читая все сообщения отладки, я заметил, что с «brcm» было много проблем, поэтому я догадался, что виноват мой модуль беспроводного драйвера Broadcom. Конечно же, я скорректировал процедуру гибернации, чтобы сначала выгрузить модуль:
sudo modprobe -r brcmfmac
sudo systemctl hibernate
на резюме я вставляю модуль
sudo modprobe brcmfmac
И все работало отлично. Я также должен занести в черный список btsdio
модуль, который кажется несовместимым сbrcmfmac
Обновление: гибернация с использованием файла подкачки 17.04.
Еще раз с помощью вики-страницы Arch и некоторыми дополнительными изменениями мне удалось заставить работать спящий режим 17.04 с файлом подкачки. Для этого потребовался дополнительный загрузочный параметр, resume_offset=n
где n - это первое число physical_offset
в выводе sudo filefrag -v /swapfile
:
$ sudo filefrag -v /swapfile
Filesystem type is: ef53
File size of /swapfile is 1425873920 (348114 blocks of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 32767: 34816.. 67583: 32768:
1: 32768.. 63487: 67584.. 98303: 30720:
....
Поэтому дополнительным параметром загрузки в моем случае является resume_offset=34816
. Вам все еще нужно установить загрузочный параметр для возобновления раздела. Это будет корневой раздел (или любой другой раздел, в котором находится ваш файл подкачки). Теперь мои параметры:
GRUB_CMDLINE_LINUX_DEFAULT="no_console_suspend initcall_debug resume=/dev/mmcblk1p2 resume_offset=34816"
Где /dev/mmcblk1p2
мой корневой раздел (у вас, скорее всего, будет что-то вроде /dev/sda2
).
Во время возобновления я видел загрузку изображения успешно, но в моем случае (просто пример - YMMVAPD) тогда еще несколько драйверов ( i2c_designware
) выдавали некоторые ошибки, и я получал полное зависание системы при возобновлении. Гибернация работает, если я выгружаю эти модули в дополнение к brcmfmac
, но система быстро становится непригодной для использования без этих модулей. Поэтому я создал своего рода скрипт для выгрузки неисправных модулей и немедленной их вставки при возобновлении:
# remove buggy modules
modprobe -r brcmfmac i2c_designware_platform i2c_designware_core &&
# hibernate
echo disk > /sys/power/state
# reinsert
modprobe i2c_designware_core i2c_designware_platform brcmfmac
Когда я хочу впасть в спячку, я бегу sudo bash script
. Это прекрасно работает.
TL; DR
Используйте systemd, установите загрузочный параметр для возобновления свопинга, идентифицируйте ошибочные драйверы и выгрузите их перед началом спящего режима. Если система не может работать долго без этих модулей или вам нужно выгрузить несколько, может быть проще использовать простой скрипт для запуска гибернации.