在電源鍵上切換和休眠
我有一台筆記型電腦,我執行 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
. 不過,您可能必須重新啟動才能使 logind env 生效(也許# systemctl daemon-reexec && systemctl reload systemd-logind
就足夠了,我不確定)。有關更多資訊,請參閱此 systemd拉取請求和此自述文件。
另外,確保交換核心參數是有序的(又名 resume 和 resume_offset)。