从 systemd 触发 udev 规则

从 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

答案1

/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"

答案2

我几乎处于同样的情况,并且想为这个问题添加更多信息,因为它在谷歌上的突出地位,systemd udevadm trigger并且作为如何驯服这些驱动器中荒谬的默认值的总体总结。

当我意识到我的 Western Digital Blue 硬盘具有居高临下的、适得其反的、反 SMART 健康、电源浪费默认情况下启用废话,我遵循与OP几乎相同的过程。我禁用了固件功能,但还需要使用以下命令禁用 APM 和待机功能hdparm:如果没有这三者,猖獗的负载循环就会继续肆虐。

第一个区别是,因为我的hdparm.rules设置为仅在设备添加(启动)上调用,所以udevadm trigger除非我告诉它,否则对我不起作用哪个通过添加 来触发应用--action=add。这有效地模拟了恢复时 HD 的拔出/重新插入 - 这正是我所需要的。

但我最终遇到了与OP类似的困惑,无法弄清楚为什么我udevadm triggerhdparm rule在终端中重新加载我的工作,而不是从systemd service.看来我有不同的原因,其中:

  1. 在我们的系统中service,我们必须明确指定可执行文件的位置,ExecStart /bin/udevadm因为单元文件不知道$path
  2. 或许....我将它安装在 中systemd/user,它可能以我的身份运行,因此没有获得root所需的权限/sbin/hdparm

(我运行 Debian 8,但我不认为这些是特定于发行版的。)

相关内容