Зимова сплячка з використанням systemctl
та налагодженні її роботи у важких випадках
Для мене pm-hibernate
завжди не вдається. Після деяких перетворень я зміг перезимувати, використовуючи інтерфейс systemd (система init 16.04 і вище). Також мені вдалося змусити його працювати 17.04 із файлом swap. Це тематичне дослідження може бути корисним для інших, хто має проблеми.
Перша спроба:
sudo systemctl hibernate
Якщо це не вдалося, почніть усунення несправностей: у сплячому стані (HTD або ACPI S4) стан машини записується на диск, щоб не було необхідного живлення для його збереження. Стан записується або в розділ swap, або у файл swap. Примітка: якщо ви використовуєте BTRFS, НЕ намагайтеся використовувати файл swap, оскільки це може спричинити пошкодження файлової системи
Ваш розділ підкачки або файл підкачки може знадобитися мати той же розмір , як 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
це призведе до друку системних дзвінків на консолі, щоб ви могли спостерігати, що відбувається не так. Я встановив це:
GRUB_CMDLINE_LINUX_DEFAULT="resume=/dev/mmcblk0p3 no_console_suspend initcall_debug"
Що допомогло мені побачити, що пішло не так у резюме зі сплячки.
У моєму випадку після резюме я втратив Wi-Fi, і ядро явно було засмучене, оскільки більшість команд (наприклад, читання чогось із /sys
, перезавантаження модулів чи будь-якої systemctl
команди) не працюватимуть - процес, здається, запуститься і просто зависне (все це було б повернувся в норму після перезавантаження звичайно). Спостерігаючи за тим, як система дуже повільно вимикається і читаючи всі повідомлення про налагодження, я помітив, що з "brcm" було багато проблем, тому я здогадався, що в цьому винен мій модуль бездротового драйвера Broadcom. Впевнений, що я налагодив процедуру сплячки, щоб спочатку вивантажити модуль:
sudo modprobe -r brcmfmac
sudo systemctl hibernate
після резюме я знову вставляю модуль
sudo modprobe brcmfmac
І все спрацювало чудово. Мені також доводиться вносити в чорний список btsdio
модуль, який видається несуміснимbrcmfmac
Оновлення: Зимова сплячка за допомогою файлу swap 17.04.
Знову за допомогою сторінки вікі Arch та деяким додатковим поворотом мені вдалося перейти у сплячку до роботи 17.04 із файлом swap. Для цього знадобився додатковий параметр завантаження, 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
. Ще потрібно встановити параметр завантаження для відновлення розділу. Це буде кореневий розділ (або будь-який розділ, на якому розташований ваш файл swap) Мої параметри тепер:
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, встановіть параметр завантаження для відновлення після swap, визначте помилки драйверів та вивантажте їх перед початком сплячки. Якщо система не може довго працювати без цих модулів або вам потрібно розвантажити декілька, можливо, простіше використовувати простий скрипт, щоб ініціювати сплячку.