我有一个硬盘,它具有非常积极的电源管理功能。为了防止负载周期上升到临界值,我编写了一条 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 trigger
要hdparm rule
在终端中重新加载我的工作,而不是从systemd service
.看来我有不同的原因,其中:
- 在我们的系统中
service
,我们必须明确指定可执行文件的位置,ExecStart /bin/udevadm
因为单元文件不知道$path
; - 和或许....我将它安装在 中
systemd/user
,它可能以我的身份运行,因此没有获得root
所需的权限/sbin/hdparm
。
(我运行 Debian 8,但我不认为这些是特定于发行版的。)