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"
私はそれを確認できるようにいくつかのテストを行いました:
Udevから呼び出されたときにマウントが実行されない理由を誰かが知っていますか?
EDIT 28/08/14:スクリプトの最後に「grep -q/proc/mounts && echo success || echo failure」を追加して、スクリプトが終了する前にデバイスが実際にマウントされているかどうかをデバッグログで確認しました。スクリプトがudevによって呼び出された場合でも、デバイスisがその時点でマウントされているようです。したがって、実際の問題は、「udevから呼び出されたマウントスクリプトの終了後に、ブロックデバイスがマウント解除されているように見える」です。
systemd-udevdは独自のファイルシステム名前空間で実行され、デフォルトではudev .rules内で行われたマウントはホストに伝播しません。古いスクリプトを機能させるには、MountFlags=shared
に/usr/lib/systemd/system/systemd-udevd.service
を設定するか、/etc/systemd/system/
でそのコピーを作成および編集できます
詳細については、man 5 systemd.exec
、MountFlags
オプションを参照してください。
これを書いている時点では、他の回答は正しくありません(または古くなっています)。
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ユニットを起動する方法を示しています。
:=
の代わりに +=
ルールのRUN割り当て。
:=
演算子はリストの値を設定し、それ以上の変更を禁止します。