2017-07-19 53 views
2

私は現在、コンピュータに自動的に接続されたUSBドライブをマウントしようとしています。 私の目標は、USBデバイスを持っている場合はラベルを付け、そうでない場合はuuidを使ってUSBデバイスをマウントすることです。udevのルールとシェルスクリプトからusbドライブを自動マウント

ACTION=="add", KERNEL=="sd?[0-9]", SUBSYSTEM=="block", RUN+="/usr/local/bin/add.sh" 

スクリプトが追加イベントがブロック・サブシステムに追加するたびに呼び出されます。私は/etc/udev/rules.d/10-usb-detect.rulesでudevのルールを記述し、それを行うには

しかし、スクリプトからファイルシステムをマウントしようとすると、udevルールはうまく動作しますが、うまくいきません。 奇妙なことは、スクリプトからのmountコマンドが常に$?= 0を返すため、論理的にはファイルシステムをマウントする必要がありますが、そうでないことです。

は、ここに私のスクリプトです:

#!/bin/bash 

LOG_FILE=<path_to_file> 

echo "New usb device detected at $DEVNAME" >> $LOG_FILE 

echo "mount $DEVNAME /media/usb/test" >> $LOG_FILE 

mount $DEVNAME /media/usb/test &>> $LOG_FILE 

ret=$? 
echo "$ret" >> $LOG_FILE 

if [ $ret == "0" ]; then 
    echo "$DEVNAME mounted at /media/usb/test" >> $LOG_FILE 
else 
    echo "Failed to mount $DEVNAME at /media/usb/test" >> $LOG_FILE 
fi 

echo "" >> $LOG_FILE 

は、私は/メディア/ USB /テストは存在しないとしようと、私は、mountコマンドから予想されるエラーを持っています。 しかし、フォルダが存在する場合、mountコマンドはファイルシステムがマウントされていなくても0を返します。ここ

は、ログファイルの出力である:

New usb device detected at /dev/sdc1 
mount /dev/sdc1 /media/usb/test 
mount: mount point /media/usb/test does not exist 
32 
Failed to mount /dev/sdc1 at /media/usb/test 

New usb device detected at /dev/sdc1 
mount /dev/sdc1 /media/usb/test 
0 
/dev/sdc1 mounted at /media/usb/test 

の/ dev/SDC1は、マウントは、私は、コマンドラインからファイルシステムをマウントするときに、私は正確な0

を返しても装着されていません絶対に問題はなく、ファイルシステムは必要に応じてマウントされます。

誰かがこれをどのようにデバッグできるかについての手掛かりはありますか?

スクリプトがudevから呼び出されるのは、コマンドラインから呼び出すと動作するためです。

答えて

2

私はこの問題を特定したと思います。 明らかに、udevは特定の名前空間を使用していますが、実際にはsystemd-udevdサービスのpidは/proc/<daemon_pid>/mountinfoの内容を出力してマウントポイントを見ることができます。

$ cat /proc/240/mountinfo 
[...] 
228 43 8:17//media/usb/test rw,relatime - vfat /dev/sdb1 rw,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro 

$ df 
Sys. de fichiers blocs de 1K Utilisé Disponible Uti% Monté sur 
udev     1975740  0 1975740 0% /dev 
tmpfs     397376  5916  391460 2% /run 
/dev/sda2   75733088 69473400 2389532 97%/
tmpfs    1986868 111860 1875008 6% /dev/shm 
tmpfs     5120  4  5116 1% /run/lock 
tmpfs    1986868  0 1986868 0% /sys/fs/cgroup 
tmpfs     397372  28  397344 1% /run/user/112 
tmpfs     397372  24  397348 1% /run/user/1001 

解決策は、udevにrootユーザー空間でスクリプトを強制的に実行させることです。 ここで見つけた解決策を試しましたhttps://unix.stackexchange.com/questions/330094/udev-rule-to-mount-disk-does-not-work

ただし、私のシステムには/usr/lib/systemd/system/systemd-udevd.serviceファイルがありません。私は、コンテンツ

MountFlags=shared 

でファイル/etc/systemd/system/systemd-udevd.serviceを作成した。しかし、このソリューションで、私のシステムはもはや起動することができません。

rootユーザー空間でスクリプトを実行する方法と、ユーザーとマウントポイントを共有する方法が分かっていますか?

PS:最後にファイルが/lib/systemd/system/systemd-udevd.serviceに位置していた:私は正確に私は64ビットのDebian 9

解決編集を実行していますよ。私は/etc/systemd/system/systemd-udevd.service でそれを複製しMountFlags=sharedMountFlags=slaveを変更し、今では完璧に動作します:)

0

コマンドに-t FILESYSTEMTYPE引数を追加してファイルシステムタイプを指定すると、flieシステムタイプの問題が改善される可能性があります。 mount -t FILESYSTEMTYPE /device_name /mount_point

また、イベントを記録する方法を変更しようとすると、毎回コマンド出力をリダイレクトする必要がないように、execコマンドを使用して情報を記録してください。 exec > $LOG_FILE 2>&1

はまた、デバイスは、あなたが成功として終了ステータスを取得していてもマウントされますしない理由を私はわからない

mount -t vfat $DEVNAME /media/usb/test 
if [ $? -eq 0 ]; then 
echo " $DEVNAME Mounted" 
else 
echo " $DEVNAME not Mounted" 
fi 

mount $DEVNAME /media/usb/test &>> $LOG_FILE 
ret=$? 
echo "$ret" >> $LOG_FILE 
if [ $ret == "0" ]; then 
echo "$DEVNAME mounted at /media/usb/test" >> $LOG_FILE 
else 
echo "Failed to mount $DEVNAME at /media/usb/test" >> $LOG_FILE 
fi 

を置き換えることができます。実際の問題を捉えるためにコードを最適化しようとしています。

+0

こんにちは、 それは-t typeオプションを使用して、何も変更しませんでした。 お勧めのおかげで、スクリプトの出力を記録するこのトリックはわかりませんでした;) – Arkaik

+0

私はそれを行いましたが、何も変わりませんでした。 "-eq"は "=="よりも優れていますか? また、mountコマンドに-vオプションを追加しました。mount:/ dev/sdj1は/ media/usb/testにマウントされています。 また、USBキーが再度接続されるたびに、/ dev/sdx文字がインクリメントされます。以前の文字でボリュームがマウントされていないため、使用しないでください。 – Arkaik

+0

-eqが数値比較に使用されます。私も同じ数ヶ月前にやっていて、どんな問題にも直面していませんでした。マウントコマンドが0を返しても、あなたのデバイスがマウントされない理由は、最も驚くべきことです。 システムを再起動してもう一度試して、ここにログを投稿できますか?そうでなければ、これについて専門家のアドバイスが必要になるようです。 – user7345878

関連する問題