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

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

Для этой цели я сделал модуль 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 . В противном случае, возможно, есть способ запустить сценарий непосредственно перед этой проверкой - сценарий, который заменяет .

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

Что вы можете мне посоветовать?

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

1
задан 14 May 2017 в 12:23
1 ответ

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

# systemctl edit systemd-logind.service

[Service]
Environment=SYSTEMD_BYPASS_HIBERNATION_MEMORY_CHECK=1

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

# 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 ).

info см. этот systemd запрос на извлечение и этот файл readme .

2
ответ дан 3 December 2019 в 20:24

Теги

Похожие вопросы