web-dev-qa-db-ja.com

udevから呼び出されたときにマウントが実行されない

USBフラッシュドライブをマウントおよびアンマウントするためのudevルールをいくつか作成しようとしました。当面のルールは非常にシンプルです。

ACTION=="add",KERNEL=="sd[b-z]",RUN+="/root/scripts/plug_flash_drive.sh %k"
ACTION=="remove",KERNEL=="sd[b-z]",RUN+="/root/scripts/unplug_flash_drive.sh %k"

plug_flash_drive.shも非常に簡単です。

device_name=$1
mount_options="umask=000,utf8"
if [ ! -e "/media/$device_name" ]; then
    mkdir "/media/$device_name"
fi
sleep 1
/usr/bin/mount "/dev/$device_name" "/media/$device_name" -o "$mount_options"

unplug_flash_drive.sh:

device_name=$1

umount "/dev/$device_name"
rmdir "/media/$device_name"

私はそれを確認できるようにいくつかのテストを行いました:

  • 接続すると、フラッシュドライブが検出されます。/devにファイルが作成されます
  • plug_flash_drive.shはudevによって呼び出されます
  • スクリプトのmkdir部分が機能します
  • ただし、スクリプトの「マウント」部分が実行されていないため、ドライブがマウントされていません
  • コマンドラインでスクリプトを呼び出すと、完全に機能します

Udevから呼び出されたときにマウントが実行されない理由を誰かが知っていますか?

EDIT 28/08/14:スクリプトの最後に「grep -q/proc/mounts && echo success || echo failure」を追加して、スクリプトが終了する前にデバイスが実際にマウントされているかどうかをデバッグログで確認しました。スクリプトがudevによって呼び出された場合でも、デバイスisがその時点でマウントされているようです。したがって、実際の問題は、「udevから呼び出されたマウントスクリプトの終了後に、ブロックデバイスがマウント解除されているように見える」です。

17
magva

systemd-udevdは独自のファイルシステム名前空間で実行され、デフォルトではudev .rules内で行われたマウントはホストに伝播しません。古いスクリプトを機能させるには、MountFlags=shared/usr/lib/systemd/system/systemd-udevd.serviceを設定するか、/etc/systemd/system/でそのコピーを作成および編集できます

詳細については、man 5 systemd.execMountFlagsオプションを参照してください。

22
user83388

これを書いている時点では、他の回答は正しくありません(または古くなっています)。

Systemdサービスからmountを実行しないでください。 MountFlagsおよびPrivateMounts行をsystemd-udevd.serviceでコメント化した後でも、FuseプロセスはSystemdによって強制終了されるため、ルールはNTFSやexFATなどのFuseファイルシステムでは機能しません。

このArchWikiページ を参照してください。これには、いくつかのより良いオプションがリストされています。私の好みは、GitHubにある dev-media-automount と呼ばれる小さなプロジェクトで、単純にUdevルールからSystemdサービスを再起動します。これは、名前空間と子プロセスに対するUdevのさまざまな面倒な制限を回避する便利な方法です。

this anwser も参照してください。これは、SYSTEMD_WANTS Udev変数を使用してSystemdユニットを起動する方法を示しています。

2
Metamorphic

:= の代わりに +=ルールのRUN割り当て。

:=演算子はリストの値を設定し、それ以上の変更を禁止します。

0
xae