我有一台笔记本电脑,运行 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 论坛上的一些长篇讨论这有助于确立证据,但并未提供解决方案。
答案1
SYSTEMD_BYPASS_HIBERNATION_MEMORY_CHECK=1
可以通过设置服务来禁用 systemctl swap 验证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
。不过,您可能需要重新启动才能使 logind 环境生效(也许# systemctl daemon-reexec && systemctl reload systemd-logind
就足够了,我不确定)。
有关详细信息,请参阅此 systemd拉取请求和本自述文件。
还,确保交换内核参数按顺序排列(又名 resume 和 resume_offset)。