Arch-Linux

從 systemd 觸發 udev 規則

  • December 1, 2015

我有一個具有非常積極的電源管理的硬碟。為了防止負載週期上升到臨界值,我編寫了一個 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. 似乎我有不同的原因,它們是:

  1. 在我們的service中,我們必須明確指定執行檔的位置,ExecStart /bin/udevadm因為單元文件不知道$path
  2. 也許….我安裝了它,它可能systemd/user像我一樣執行,因此沒有獲得root所需的權限/sbin/hdparm

(我執行 Debian 8,但我不相信這是特定於發行版的。)

引用自:https://unix.stackexchange.com/questions/99120