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を介して呼び出された場合、マウントスクリプトの終了後にブロックデバイスがアンマウントされたように見える」ということです。
set -xv
たりexec >> "$HOME"/mount.log 2>&1
することで.sh
?
mkdir "$mount_dir"
が、なぜあなたはそうしますrmdir "/media/$device_name"
か?どこにされて$mount_dir
設定されていますか?