В течение долгого времени я использовал
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