У меня есть ноутбук, и я запускаю 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»).