web-dev-qa-db-ja.com

udevルールでUSBドライブをマウントする方法は?

USBドライブを自動マウントするスクリプトをバックグラウンドで実行するルールをudevで設定しました。なんとかスクリプトを実行できましたが、何らかの理由でマウントに失敗しています。

ルール:

ACTION=="add", KERNEL=="sd[a-z]*", RUN+="/etc/mntUsbChk.sh &"

このスクリプトでは:

#!/bin/sh

sleep 2

mkdir /mnt/usb

foundUsb=false

if [ -e /dev/sda1 ]; then
 mount /dev/sda1 /mnt/usb
 $foundUsb=true
fi

if [ -e /dev/sdb1 ]; then
  mount /dev/sdb1 /mnt/usb
  $foundUsb=true
fi

if [ -e /dev/sdc1 ]; then
  mount /dev/sdc1 /mnt/usb
  $foundUsb=true
fi

if [ $foundUsb -eq false ]; then
 exit
fi

echo "USB MOUNTED"

[1610.868626] FAT-fs(sdb1):ボリュームが正しくマウント解除されなかった。一部のデータが破損している可能性があります。 fsckを実行してください。

編集:詳細:USBを接続した後に/mnt/usbフォルダーが作成されたため、スクリプトは確実に実行されていました。

また、ルールを有効にする前にUSBを接続した後、手動でmount /dev/sda1 /mnt/usbを入力すると、ルールを正常にマウントできました。ルールudevにマウントできない理由がわかりません。

2
GeneCode

このスクリプトは失敗します/mnt/usb もう存在している。これが問題の原因かどうかはわかりませんが、スクリプトのエラーは確かです。

mount /mnt/usb

代わりに使用:

mount -p /mnt/usb

から man mount

-p、-parents

存在する場合はエラーなし、必要に応じて親ディレクトリを作成

2
Tim

追加時にUSBドライブがsda1、sdb1、sdc1になる保証はありません。そこではもっと良いロジックが必要になるかもしれませんが、問題とはまったく無関係です。

質問については、以下の既存のリンクを参照してください。 LinuxがFATをマウントするために、なぜFATを「ダーティ」としてマークするのですか?

私の理解では、WindowsマシンからUSBをプルするだけで、イジェクトしてもドライブのダーティビットはクリアされません。 Linuxは、ダーティビットが設定されると最悪の事態を想定します。ここでは、fsckを自動的に実行して、このエラーメッセージのダーティビットが存在する場合はそれをクリアし、再度マウントに進むことができると想定しています。 umountまたはfsckの呼び出しでダーティビットがクリアされるかどうかはわかりませんが。

これが正しい方向に向かっていることを願っています。

1
MalformedPacket

十分に文書化されていませんが、Udevルールからmountを実行することは想定されていません。

代替案については 同様の質問に対する私の回答 を参照してください。

0
Metamorphic