ブロックデバイスの変更アクションにバインドされ、特定のスクリプトを実行する既存のudevルールを移行しています。
SUBSYSTEM=="block", ENV{DEVNAME}=="/dev/sr0", ACTION=="change", RUN+="/usr/local/bin/script"
この構成では、udevはID_CDROM_MEDIA-0
やID_FS_LABEL
などのハードウェアデバイスに関連付けられた環境変数を渡しました。それ以来、ハードウェアの変更時にsystemdを使用してサービスを開始するようにudevルールを更新しました。
SUBSYSTEM=="block", ENV{DEVNAME}=="/dev/sr0", ACTION=="change", TAG+="systemd", ENV{SYSTEMD_WANTS}=="drive-change.service"
Systemdサービスファイル:
[Unit]
Description=changes to dvd drive
[Service]
Type=oneshot
ExecStart=/usr/local/bin/script
[Install]
WantedBy=multi-user.target
この時点で、サービスは変更イベントで実行されますが、udevのRUNコマンドによって渡された環境変数はサービスの実行に渡されません。
Udevからsystemdの実行環境に環境を渡すことは可能ですか、それともパラメーターを明示的に渡す必要がありますか?
Udevからsystemdに環境を渡す方法は見つかりませんでしたが、udevデータベースに環境プロパティを照会することは可能です。 udevadm info
コマンド 両方の--query
および--export
環境プロパティのみをクエリし、評価可能な形式で出力できるパラメータ。
Systemdインスタンス変数とudevadm
コマンドを組み合わせて、環境変数を初期化しました。
SUBSYSTEM=="block", ENV{DEVNAME}=="/dev/sr0", ACTION=="change", TAG+="systemd", ENV{SYSTEMD_WANTS}=="drive-change@%E{DEVNAME}.service"
このudevルールは、次のサービスファイルを実行し、DEVNAME
変数をインスタンス変数としてサービスに渡します。
[Unit]
Description=changes to dvd drive
[Service]
Type=oneshot
ExecStart=/usr/local/bin/script %I
[Install]
WantedBy=multi-user.target
このインスタンス変数を使用してudev要素の環境プロパティを評価し、問題を解決しました。
#!/bin/sh
# Systemd passes the DEVNAME as the first parameter to the script
eval $(udevadm info --query=env --export $1)
# The rest of the script that depends on the udev environment
...