Назад | Перейти на главную страницу

переключение и переход в спящий режим на клавише питания

У меня есть ноутбук, и я запускаю Arch Linux. В моем ноутбуке вращающийся жесткий диск, а не SSD, поэтому я ненавижу свопинг. Однако мне нужен один для перехода в спящий режим, и я хочу, чтобы мой ноутбук переходил в спящий режим каждый раз, когда нажимается кнопка питания или батарея разряжается. Моя идея сейчас - иметь swapon прямо перед systemd-hibernate.service начинается. (Конечно, было бы неплохо также swapoff сразу после пробуждения.)

Для этого я сделал dev-sda7.swap Блок. Его работа проста:

[Unit]

Description=Hibernate swapon
DefaultDependencies=false
TimeoutStopSec=infinity

[Swap]
What=/dev/sda7

Я надеялся привязать его к sleep.target, hibernate.target или systemd-hibernate.service чтобы он начинался непосредственно перед переходом в спящий режим и останавливался сразу после него. Однако все пошло не так гладко. На данный момент у меня есть dev-sda7.swap остановись, если я добавлю PartOf=sleep.target И у меня это началось прямо перед systemd-hibernate.service если я добавлю WantedBy=systemd-hibernate.service & Before=systemd-hibernate.service. Звучит как успех, но это не так.

logind.conf указывает HandlePowerKey=hibernate и, как я понимаю, вызывает systemctl hibernate. (Может, все сложнее, не знаю.) systemctl hibernate однако не выдаст start systemd-hibernate.service если не будет пройдена интегрированная проверка свопа, что не произойдет до тех пор, пока start systemd-hibernate.service выпущен. Надеюсь, вы видите здесь сложность.

Я хотел бы использовать логику systemd чтобы мой обмен начался. Итак, я так понимаю, мне нужно как-то удалить проверку свопа из logind. В противном случае, возможно, есть способ запустить сценарий непосредственно перед этой проверкой - сценарий, который swapon.

Специальный /etc/udev/rules.d/99-lowbat.rules указывает произвольную команду для запуска при низком уровне мощности, которая может быть systemctl start systemd-hibernate.service. Интересно, есть ли правило udev, которое запускает команду при нажатии клавиши питания. Тогда я могу вообще обойтись без логинда.

Что вы мне посоветуете?

У нас был довольно продолжительный разговор на форуме Arch Linux это помогло установить доказательства, но не предложило решения.

Проверка подкачки systemctl можно отключить, установив SYSTEMD_BYPASS_HIBERNATION_MEMORY_CHECK=1 для systemd-logind служба. Сделать это можно так:

# systemctl edit systemd-logind.service

[Service]
Environment=SYSTEMD_BYPASS_HIBERNATION_MEMORY_CHECK=1

Теперь, чтобы при необходимости менять местами / подкачки, вы можете добавить эту услугу:

# vim /etc/systemd/system/swap-to-hibernate.service

[Unit]
Description=Swapon/off when hibernating or resuming
DefaultDependencies=no
Before=systemd-hibernate.service systemd-hybrid-sleep.service
StopWhenUnneeded=yes
RefuseManualStart=yes
RefuseManualStop=yes

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/swapon /dev/sda7    # <--- can be file, too
ExecStop=/usr/bin/swapoff /dev/sda7   

[Install]
RequiredBy=systemd-hibernate.service systemd-hybrid-sleep.service

Затем просто включите его через # systemctl enable swap-to-hibernate.service. Возможно, вам придется перезагрузить компьютер, чтобы env logind вступил в силу (возможно, # systemctl daemon-reexec && systemctl reload systemd-logind хватит, не уверен).

Для получения дополнительной информации см. Этот systemd запрос на вытягивание и этот ридми.

Также, удостовериться параметры ядра подкачки в порядке (также известные как «resume» и «resume_offset»).