我有一台笔记本电脑,我运行Arch Linux。 我的笔记本电脑有一个旋转的硬盘,而不是一个固态硬盘,所以我讨厌交换。 但是,我需要一个hibernate,并且每次按下电源键或电池电量不足时,我都希望笔记本电脑进入hibernate状态。 我现在的想法是在systemd-hibernate.service启动之前有swapon 。 (当然,觉醒后也可以swapoff 。)
为此,我做了一个dev-sda7.swap单元。 其操作简单明了:
[Unit] Description=Hibernate swapon DefaultDependencies=false TimeoutStopSec=infinity [Swap] What=/dev/sda7
我希望将它绑定到sleep.target , hibernate.target或systemd-hibernate.service以便在hibernate之前启动它,并在刚刚停止之后停止。 但事情并没有那么顺利。 现在我有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规则,当按下电源键时运行一个命令。 然后我可以完全没有logind。
你能告诉我什么?
我们在Arch Linux论坛上进行了一些讨论 ,帮助build立了证据,但没有提供任何解决scheme。