Какая команда пользовательского пространства используется для выхода из режима гибернации?

Какая команда пользовательского пространства используется для выхода из режима гибернации?

В течение долгого времени я использовал

echo disk > /sys/power/state

Для перехода в спящий режим /dev/sda10и возобновления работы я использовал initrd моего дистрибутива Debian.

Но недавно я перешел на рейдовый массивкоторые требуют от меня использования полностью настраиваемого initramfs (Мне пришлось собрать его с нуля, поскольку попытка изменить существующий initrd не сработала)для настройки RAID-массива перед монтированием корневого раздела.

Есть 2 способа возобновления: либо ядро ​​может напрямую прочитать файловую систему подкачки с помощью resume=параметра ядра(и он возобновит работу до начала init) ; или ему нужно некоторое пространство пользователя(например, загрузка модулей)для того, чтобы иметь возможность получить доступ к разделу подкачки.

Так какая же команда пользовательского пространства нужна для возобновления работы? /dev/mapper/isw_qfyzrvbsusf_Volume0p9 ?

решение1

Короткий ответ: /sys/power/resume

Гораздо более длинный ответ, потому что сам по себе он не принесет много пользы, если вообще принесет. Большинство дистрибутивов рекомендуют инициировать возобновление из процесса init / PID 1 (раннее пользовательское пространство). Однако инструкции почти всегда сообщат вам о необходимости добавить аргумент строки ядра cmd в ваш загрузчик с целью возобновления. Причина этого в том, что почти в каждом случае инструмент сборки initramfs (dracut / mkinitcpio / initramfs-tools) сам запускается этим аргументом в конфигурации.

На основе вашего примера и дистрибутива я предполагаю, что вы используете низкоуровневый интерфейс ядра для приостановки (swsusp). Существует ряд других утилит, которые можно использовать для запуска процесса приостановки; все они по сути являются обертками вокруг первого элемента, swusp.

  • swusp- низкоуровневый интерфейс ядра; интерфейс пользовательского пространства через sysfs
  • uswswp- низкоуровневая оболочка приостановки программного обеспечения пользовательского пространства - предоставляет утилиты s2disk, s2ram (активно не поддерживается)
  • pm-utils- высокоуровневые скрипты для настройки процесса
  • systemd-приостановить- в системах systemd доступна цель приостановки, которая инициирует операцию приостановки через интерфейс ядра.

Конфигурация резюме

Упрощенная схема последовательности загрузки в Linux с использованием образа initramfs выглядит следующим образом:

[BIOS] ==> [Загрузчик] ==>[Ядро на временной rootfs - initramfs] ==> [Ядро на rootfs - диски]

В конце этапа initramfs есть небольшое окно, где может произойти возобновление; после того, как ядро ​​запустит PID 1 (systemd или init), загрузит драйверы для raid, но до монтирования реальных дисков.

Я привел пример типичной конфигурации возобновления. Это предполагает, что указанный вами путь возобновления является разделом подкачки; а не «обычным» разделом, содержащим файл подкачки. Файл подкачки требует дополнительной настройки. Метод systemd отличается - он использует правило udev на основе resume.target, которое запускает процесс возобновления. Стоит рассмотреть, если более традиционный подход с загрузчиком / образом initramfs не работает. Это прямое коррелирование с тем, как это делает система на основе init; но немного сложнее вручную вставить собственный скрипт и получить правильные взаимозависимости / относительную синхронизацию.

Суть в том, что момент времени, в который запускается возобновление, непосредственно предшествует моменту, когда ядро ​​монтирует «реальные» жесткие диски. Так что если ядро ​​может смонтировать всю файловую систему, у него также есть все возможности и информация, необходимые для монтирования только раздела подкачки.

Убедитесь, что раздел подкачки смонтирован через fstab; инструмент dracut initramfs специально ищет его и не включает модуль возобновления, если раздел подкачки отсутствует.

настроить загрузчик

Предполагая, что вы используете grub2, вам необходимо добавить resume=/dev/mapper/isw_qfyzrvbsusf_Volume0p9поле GRUB_CMDLINE_LINUX_DEFAULTв /etc/default/grub Обновить образ grub, обычно с помощью команды:sudo grub2-mkconfig -o /boot/grub2/grub.cfg

пересобрать initramfs

Вам необходимо перестроить образ initramfs с возможностью возобновления (а также изменения raid, которые вы уже сделали). Debian предоставляет как dracut, так и initramfs-tools для создания initramfs. Его необходимо перегенерировать с помощью модуля возобновления. С dracut добавьте аргумент командной строки --add resume. С update-initramfs, добавьте запись resume=/dev/mapper/isw_qfyzrvbsusf_Volume0p9в файл конфигурации/etc/initramfs-tools/conf.d/resume

Вот и все, если я правильно рассчитал вашу конфигурацию.

Редактировать; предполагая, что вы можете правильно рассчитать время, вы можете вывести основной / дополнительный номер устройства раздела подкачки в /sys/power/resume из сценария инициализации, чтобы запустить возобновление. Ваш образ initramfs (или initd) должен иметь поддержку возобновления, иначе этот элемент sysfs и представляемая им возможность не будут существовать. Смотритеhttps://bugs.launchpad.net/ubuntu/+source/initramfs-tools/+bug/983805

решение2

Файл — /sys/power/resume.

Чтобы запустить возобновление, в этот файл должен быть записан основной номер устройства, за которым следует второстепенный. Поэтому следующая команда может этого добиться:

echo `stat -c %t /dev/mapper/isw_*_Volume0p9`\:`stat -c %T /dev/mapper/isw_*_Volume0p9` > /sys/power/resume

Связанный контент