systemdでudevルールをトリガーする

systemdでudevルールをトリガーする

非常に積極的な電源管理機能を備えたハードドライブがあります。ロードサイクルが重大なレベルに上昇するのを防ぐために、udevルールを作成しました。

SUBSYSTEM=="block", SUBSYSTEMS=="scsi", ATTRS{model}=="TOSHIBA MK2555GS", RUN+="/usr/bin/hdparm -B 200 /dev/%k"

問題は、ノートブックをスリープモードで起動するとルールが実行されないことです。したがって、次のシステムサービスがあります。

[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サービスでは機能しません。これを行う方法はありますか?ところで、私はアーチLinuxを使用しています

答え1

/usr/lib/systemd/systemd-sleephdparmを実行するスクリプトを置くことができます。/dev/disk/by-uuid/代わりにhdparmを使用できます/dev/sda...

または試してみてください/bin/sh -c "/bin/hdparm -B 200 /dev/disk/by-uuid/XY"

答え2

私はほぼ同じ状況にあり、Googleでの有名性systemd udevadm triggerとそのようなドライブのとんでもないデフォルトを飼いならす方法の一般的な要約のため、この質問に詳細を追加したいと思いました。

私のWestern Digital Blueハードドライブが自慢して非生産的で、反SMARTの健康、パワーを持っていることに気づいたときごみナンセンスはデフォルトで有効になっており、OPとほぼ同じプロセスに従いました。ファームウェア機能を無効にしましたが、次のコマンドを使用してAPMおよびスタンバイ機能も無効にする必要がありましたhdparm。これら3つがないと、蔓延した負荷サイクルが引き続き発生します。

最初の違いは、デバイスが追加hdparm.rules(起動)時にのみ呼び出されるように設定されているため、udevadm trigger指示しないと機能しないことです。どのを追加してアプリケーションを起動します--action=add。これは、回復中にHDを取り外す/再接続することを効果的にシミュレートします。これがまさに私が必要なものです。

しかし、私はOPのような混乱udevadm triggerに陥っている理由hdparm rulesystemd service

  1. 私たちのシステムでは、ユニットファイルがそれを知らないので、service実行可能ファイルの場所を明示的に指定する必要があります。ExecStart /bin/udevadm$path
  2. そしておそらく....インストールしましたが、systemd/userおそらく私のように実行していたので、root必要な権限を取得できませんでした/sbin/hdparm

(私はDebian 8を実行していますが、これはディストリビューションに限定されていないと思います。)

関連情報