3

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

echo disk > /sys/power/state

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

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

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

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

2 ответа2

7

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

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

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

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

Возобновить настройку

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

[BIOS] ==> [Boot Loader] ==> [Ядро на временные rootfs - initramfs] ==> [Ядро на rootfs - диски]

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

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

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

Убедитесь, что ваш раздел подкачки смонтирован через 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 с возможностью возобновления (а также изменениями рейда, которые вы уже сделали). Debian предоставляет инструменты dracut и initramfs для генерации 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.

0

Файл /sys/power/resume .

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .