從 systemd 觸發 udev 規則
我有一個具有非常積極的電源管理的硬碟。為了防止負載週期上升到臨界值,我編寫了一個 udev 規則:
SUBSYSTEM=="block", SUBSYSTEMS=="scsi", ATTRS{model}=="TOSHIBA MK2555GS", RUN+="/usr/bin/hdparm -B 200 /dev/%k"
問題是,在我將筆記本從睡眠中喚醒後,不會觸發此規則。因此,我有以下 systemd 服務:
[Unit] Description=root resume actions After=suspend.target [Service] Type=simple ExecStart=/bin/hdparm -B 200 /dev/sda [Install] WantedBy=suspend.target
我希望
ExecStart
命令類似於/bin/udevadm trigger --subsystem-match="block"
. 所以我不必明確說明核心名稱。如果我手動執行此命令,則電源管理已正確調整,但它不適用於 systemd 服務。有沒有辦法做到這一點?順便說一句,我正在使用 arch-linux
您可以放置一個
/usr/lib/systemd/systemd-sleep
執行 hdparm 的腳本。你可以使用 hdparm 來/dev/disk/by-uuid/
代替/dev/sda...
或者嘗試使用
/bin/sh -c "/bin/hdparm -B 200 /dev/disk/by-uuid/XY"
我處於幾乎相同的情況,並且想為這個問題添加更多資訊,因為它在Google上的突出地位
systemd udevadm trigger
以及如何馴服這些驅動器中荒謬的預設值的總體總結。一旦我意識到我的 Western Digital Blue 驅動器預設啟用了傲慢、適得其反、反智能健康、浪費電力的廢話,我就遵循了與 OP 幾乎相同的過程。我禁用了韌體功能,但還需要使用禁用 APM 和待機
hdparm
;沒有所有 3,猖獗的負載循環繼續瘋狂執行。第一個區別是,因為我
hdparm.rules
設置為僅在設備添加(啟動)上呼叫,所以除非我告訴它要應用哪個觸發器,udevadm trigger
否則對我不起作用,通過添加. 這有效地模擬了恢復時取消/重新插入 HD - 這正是我所需要的。--action=add
但我最終對 OP 產生了類似的困惑,無法弄清楚為什麼我
udevadm trigger
要在終端中重新載入我的hdparm rule
工作,而不是從systemd service
. 似乎我有不同的原因,它們是:
- 在我們的
service
中,我們必須明確指定執行檔的位置,ExecStart /bin/udevadm
因為單元文件不知道$path
;- 也許….我安裝了它,它可能
systemd/user
像我一樣執行,因此沒有獲得root
所需的權限/sbin/hdparm
。(我執行 Debian 8,但我不相信這是特定於發行版的。)