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が呼び出されたときにマウントが実行されない理由を知っている人はいますか?
28/08/14 編集:スクリプトの最後に「grep -q /proc/mounts && echo Success || echo failure」を追加してデバッグログを確認し、スクリプトが終了する前にデバイスが実際にマウントされていることを確認しました。デバイスのようですはいudevがスクリプトを呼び出しても、この時点ではインストールになります。実際の問題は、「udevを介して呼び出すときにマウントスクリプトが終了した後、私のブロックデバイスがアンマウントされているように見えます」です。
ベストアンサー1
systemd-udevdは独自のファイルシステムの名前空間で実行され、デフォルトではマウントはudevで実行されます。ルールはホストに伝播されません。前のスクリプトを機能させるには、次の場所でコピーを設定するかMountFlags=shared
(より良い方法で)作成して編集できます。/usr/lib/systemd/system/systemd-udevd.service
/etc/systemd/system/
オプションman 5 systemd.exec
の詳細については、参考資料を参照してください。MountFlags