マウントはudevによって呼び出されたときに実行されません


16

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によって呼び出された場合でも、その時点でデバイスマウントされているようです。したがって、実際の問題は、「udevを介して呼び出された場合、マウントスクリプトの終了後にブロックデバイスがアンマウントされたように見える」ということです。


これはポイントの横にあるかもしれませんmkdir "$mount_dir"が、なぜあなたはそうしますrmdir "/media/$device_name"か?どこにされて$mount_dir設定されていますか?
G-Manが「Reinstate Monica」と言う14

申し訳ありませんが、これはタイプミスですが、私は元のコードにエイリアシングいくつかの非常に無用の変数を使用して、私は明確化のためにここでそれらを削除
magva

古い学校のデバッグを試しましたか?例えば、ファイルに入れset -xvたりexec >> "$HOME"/mount.log 2>&1することで.sh
G-Manが「Reinstate Monica」と言う14

1
私はそれをしましたが、私が取得したログによると、スクリプトがudevによって呼び出されるとマウントが実行されます。udevのからして、コマンドラインからの呼び出しの間にログに違いはありません...実際にはかなり不可解だということ
magva

1
その場合、コマンドラインから実行するときにスクリプトも失敗します
magva 14

回答:


22

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

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


「ホストに伝播しない」とはどういう意味ですか?
sebelk 16

2
私は、彼らが「ルート」名前空間に伝播しないuser83388手段と考えてい@sebelk
マーク・

2

この記事の執筆時点では、他の回答は間違っています(または古くなっています)。

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

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

UdevSYSTEMD_WANTS変数を使用してSystemdユニットを起動する方法を示すこのanwserも参照してください。


-1

ルールの:=代わりに+=RUN割り当てを使用してみてください。

:=オペレータは、リストの値を設定し、さらに変更を許可しません。


おかげで、マウントはまだ機能しません:(
magva 14

1
たぶんあなたの場合ではありませんが、私のシステムではマウントは/ bin / mountにあります。「コマンド-vマウント」を試してください。
XAE

1
私のシステムでは、「command -v mount」によって返されるパスは/ usr / bin / mountです。/ bin / mount実行可能ファイルも持っていることに気づきましたが、udevから呼び出されたときにも
機能しません
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.