Linux

在電源鍵上切換和休眠

  • August 27, 2020

我有一台筆記型電腦,我執行 Arch Linux。我的筆記型電腦有一個旋轉硬碟而不是 SSD,所以我討厭交換。但是,我需要一個休眠,並且我希望我的筆記型電腦在每次按下電源鍵或電池電量不足時休眠。我現在的想法是在開始swapon之前systemd-hibernate.service。(當然,swapoff覺醒後也可以。)

為此,我做了一個dev-sda7.swap單元。它的操作很簡單:

[Unit]

Description=Hibernate swapon
DefaultDependencies=false
TimeoutStopSec=infinity

[Swap]
What=/dev/sda7

我希望將它綁定到任何一個sleep.targethibernate.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)。

引用自:https://serverfault.com/questions/849800