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

927
user2284570

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

echo disk > /sys/power/state 

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

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

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

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

3

2 ответа на вопрос

7
Argonauts

The short answer is /sys/power/resume

Much longer answer, because that by itself won't do much if any good. Most distros recommend initiating a resume from the init / PID 1 process (early user space). However, the instructions will almost invariably inform you to add a kernel cmd line argument to your boot loader with the resume target. The reason for this is in almost every case that the initramfs build tool (dracut / mkinitcpio / initramfs-tools) is itself triggered by that argument in the configuration.

Based on your example and distro I'm assuming you are using the low level kernel interface for suspend (swsusp). There are a number of other utilities that can be used to start the suspend process; all of them are fundamentally wrappers around the first item, swusp.

  • swusp - low level kernel interface; user space interface is through sysfs
  • uswswp - low level userspace software suspend wrapper - provides s2disk, s2ram utilities (not actively maintained)
  • pm-utils - high level scripts to configure the process
  • systemd-suspend - on systemd systems a suspend target is available which will initiate the suspend operation via the kernel interface.

Resume Configuration

An oversimplified outline of the boot sequence in linux with using an initramfs image is:

[BIOS] ==> [Boot Loader] ==>[Kernel on temp rootfs - initramfs] ==> [Kernel on rootfs - drives]

There is a small window at the end of the initramfs stage where the resume can occur; after the kernel has started PID 1 (systemd or init), loaded the drivers for the raid, but before mounting the actual drives.

I've provided an example of a typical resume configuration. This assumes that the resume path you provided is a swap partition; and not a 'normal' partition containing a swap file. A swap file requires additional configuration. The systemd method is different - it uses a udev rule based on resume.target which triggers the resume process. It's worth looking into if the more traditional bootloader / initramfs image approach doesn't work. This is a direct corelary to the way that an init based system would do it; but a bit trickier to manually insert your own script and get the inter-dependencies / relative timing correct.

The bottom line is that the point in time at which the resume is triggered is immediately prior to when the kernel mounts the 'real' hard drives. So if the kernel can mount the entire fs, it also has all of the capability and information required to mount just the swap partition.

Make sure that your swap partition is mounted via fstab; the dracut initramfs tool specifically looks for it and does not include the resume module if the swap partition is not there.

configure bootloader

Assuming that you are using grub2, you need to append resume=/dev/mapper/isw_qfyzrvbsusf_Volume0p9 to the GRUB_CMDLINE_LINUX_DEFAULT field in /etc/default/grub Update your grub image, usually with command: sudo grub2-mkconfig -o /boot/grub2/grub.cfg

rebuild initramfs

You need to rebuild the initramfs image with the resume capability (as well as the raid modifications you've already made). Debian provides both dracut and initramfs-tools to generate initramfs. It must be regenerated with the resume module. With dracut, add the command line argument --add resume. With update-initramfs, add the entry resume=/dev/mapper/isw_qfyzrvbsusf_Volume0p9 to the config file /etc/initramfs-tools/conf.d/resume

That should be it; assuming I made some correct assumptions about your configuration.

Edit; assuming you can time it correctly, you can echo the major / minor device number of the swap partition to /sys/power/resume from an init script to trigger the resume. Your initramfs (or initd) image needs to have resume support in it, or that sysfs item and the capability it represents won't exist. See https://bugs.launchpad.net/ubuntu/+source/initramfs-tools/+bug/983805

`перестроить initramfs`. ** Вы действительно читали мой вопрос? ** Я не могу использовать что-либо из дистрибутива, поставляемого initramfs, так как для того, чтобы настроить мой raid массив **, мне нужно поддерживать собственный initrd с нуля вручную ** * (я не могу использовать какой-либо скрипт из моего дистрибутива) *. Так что же нужно написать в `/ sys / power / resume`? user2284570 8 лет назад 0
Это должно быть сделано из initramfs. Вы сказали, что настроили его, предположительно, с помощью утилиты, и в этом случае вы можете сделать это снова - на этот раз с поддержкой возобновления. Argonauts 8 лет назад 0
Я не использовал никакой утилиты * (помните, что initrd - это просто сжатый архив, содержащий легкие rootfs) *. Я действительно создал rootfs initrd с нуля. Это означает написание всех сценариев оболочки запуска и выбор каждого файла и папки, которые он должен содержать по одному. ** Итак, мой вопрос о том, что стоит за сценариями, используемыми дистрибутивами linux для возобновления ** * (поддержка возобновления включена в initrd) *. user2284570 8 лет назад 0
Вы заявили, что используете initrd, а затем переключились на загрузку на основе initramfs - они не эквивалентны. Так что это? Какую версию Debian вы используете? Вы используете systemd? Образ initrd должен иметь встроенное резюме независимо от того, как вы его сгенерировали. Большая часть этого образа является двоичным файлом ядра, и его необходимо генерировать с поддержкой возобновления; никакие сценарии не предоставят такую ​​возможность, если начальное загрузочное ядро ​​не предоставляет такую ​​возможность (предоставляется через sysfs). Argonauts 8 лет назад 0
Опять же, нет такой вещи, как поддержка резюме * (поскольку я пишу / init` вручную с нуля) *. То, что я имею, это `/ sys монтируемый` перед корневым разделом и каждой записью` / sys / power / `.so, что будет минимальным сценарием оболочки, который вызовет возобновление. В противном случае да, / sysfs / полностью доступен в моих пользовательских initramfs. и на самом деле я использую дарбан. но инициализация systemd или sysv здесь не имеет значения, так как монтирование корневого раздела не должно выполняться. Реальным решением является добавление ʻecho -n "$ major: $ minor"> / sys / power / resume`along [this] (http://stackoverflow.com/a/29347598/2284570) в `/ init`. user2284570 8 лет назад 0
Я дал ссылку в ответ на метод, чтобы сделать это. Вы должны быть осторожны, чтобы сделать это в нужной точке последовательности загрузки. Поскольку systemd или init не имеют значения, ваш скрипт init не может быть вызван до тех пор, пока не будет запущен PID 1; который, по-видимому, в вашем случае является init, а не systemd. Argonauts 8 лет назад 0
`нельзя вызвать до тех пор, пока не будет запущен PID 1`nsensense. Первая программа в initrd имеет ᴘɪᴅ 1 * (`/ init`systemd или нет) *. Вернее, первый двоичный файл пользовательского пространства, выполняемый ядром, всегда имеет ᴘɪᴅ 1. Вы не монтируете никакие файловые системы с жесткого диска. user2284570 8 лет назад 0
Надеюсь, эта информация помогла как-то. Вы, кажется, называете мой ответ глупостью, а затем соглашаетесь с этим. Странная реакция. Argonauts 8 лет назад 0
Комментарий это чепуха. и без надлежащего переформатирования я напишу ответ сам в следующий уик-энд. Похоже, вы неправильно понимаете некоторые вещи, касающиеся initrd / initramfs. user2284570 8 лет назад 0
Смысл комментария в том, что то, что вы используете для PID 1, играет роль в том, для чего вы можете его использовать. Вы можете использовать ls в качестве PID 1, но он предлагает мало полезных возможностей в этом контексте. Как вы можете знать или не знать, все другие процессы, включая оболочку, в которую вызываются ваши скрипты, являются дочерними для PID 1, и это требует, чтобы PID 1 был запущен до выполнения вашего скрипта, и это просто так, чушь или иным образом. В общем, если вы ищете конкретные ответы на свои вопросы, предоставьте конкретные сведения, особенно когда они запрашиваются. Argonauts 8 лет назад 0
В моем случае `/ init` является сценарием оболочки, поэтому` / sys / power / resume` будет написано pid 1 * (echo - встроенная команда оболочки) *. user2284570 8 лет назад 0
Хорошо, мне не нужно было много объяснений. Но что нужно сделать, чтобы добиться того, что мне нужно. Поэтому я опубликовал свой собственный ответ, который кажется более понятным. user2284570 8 лет назад 0
0
user2284570

The file is/sys/power/resume.

In order to trigger the resume, the major of the device followed by the minor, must be written to that file. So the following command can achieve it :

echo `stat -c %t /dev/mapper/isw_*_Volume0p9`\:`stat -c %T /dev/mapper/isw_*_Volume0p9` > /sys/power/resume 
Вы также можете сделать `echo / dev / mapper / isw _ * _ Volume0p9> / sys / power / resume`, и ядро ​​автоматически определит правильные основные / второстепенные номера устройств. Hitechcomputergeek 7 лет назад 1