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