しばらく前にUSBスティックが接続されたときに実行するudevスクリプトを受け取りました。Ubuntu16.04(サーバー)マシン。 (私はこれを使ってvirtualboxゲストにインストールしました。)
さて、このスクリプトで別のことをしたいのです(ホストシステムにインストール)。 udevルールがあります。
#/etc/udev/rules.d/10-usbmount.rules
KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}!="?*", SUBSYSTEMS=="usb", RUN+="/bin/su <username> -c /home/<username>/automount"
automount
現在のスクリプトを呼び出します。
LOG_FILE=/home/<username>/usb_log
echo "New usb device detected at $DEVNAM doing stuff
mount $DEVNAME /home/<username>/flashes_folder &>> $LOG_FILE
#mount /dev/sdb1 /home/<username>/flashes_folder &>> $LOG_FILE
ret=$?
echo "$ret" >> $LOG_FILE
(からインポートここ) ログファイルには次の出力が含まれます。
New usb device detected at /dev/sdb doing stuff
mount: only root can do that
1
ディスクパスを明示的に/dev/sdb1
(コメントアウトされた行)入力すると、同じエラーが発生します(ディスクは実際には/ dev / sdb1です)。明らかに/bin/su <admin_username>
権限が不十分です。この問題をどのように解決できますか?
答え1
一般ユーザーがボリュームをマウントするには(デバイスファイルへのフルアクセス権がある場合でも)、エントリが/etc/fstab
必要です。これは明らかに動的デバイス名では機能しません。
udevはシンボリックリンクのみを追加できますが、ブロックデバイスの名前は変更できません。ただし、fstabエントリには実際の名前が必要です。
ただし、デバイス名を使用する代わりにファイルシステムUUIDを使用できます。 udevは、ユーザーがデバイスを読むことを可能にし、ユーザースクリプトがUUIDを決定できるようにシンボリックリンクを設定できます。
fstabエントリ
UUID=8186709a-ab1f-4d18-80bb-b219cb126398 /mnt/tmp ext4 defaults,noauto,user,nofail 0 0
マウントスクリプト
current_uuid=$(blkid --output export /dev/myusb | grep ^UUID=)
mount "$current_uuid"
デバイスマッパー
別のアプローチは、USBデバイス()の上にデバイスマッパーデバイスを配置することですman dmsetup
。利点は、この方法で静的名前を取得できることです(例:.)/dev/mapper/myusb
。しかし、USBスティックを取り外すと、DMデバイスがどのように反応するのかわかりません。この問題を処理するには、udevプルアウトルールが必要な場合があります。これははるかに複雑に見え、おそらく静的名前を使用する資格がないでしょう。
答え2
触れ/etc/fstab
ずに問題を解決しました。山プログラム。このプログラムは、複数のLinuxディストリビューションのパッケージリポジトリで利用できるようです。
Ubuntuでは、フォルダが自動的に作成され、/media
ディスクがこのフォルダにマウントされます。ディスクを外部にマウントする方法はないようですが、/media
個人的にはその点に同意します。
プログラムは、区画識別子(例えばsdb1
)をパラメーターとして使用します。$DEVNAME
ディスク識別子(例sdb
:)はudevスクリプトで提供できます。フラッシュディスクの場合、sdb1
ディスクの最初のパーティション()のみが適しています。
したがって、問題のスクリプトの作業バージョンは次のとおりです。
LOG_FILE=/home/<username>/usb_log
echo "New usb device detected at $DEVNAM doing stuff
pmount "{$DEVNAME}1" &>> $LOG_FILE
ret=$?
echo "$ret" >> $LOG_FILE
最後の注意:スクリプトはrootとして実行され、スクリプトファイルはrootに属している必要があります。 (Ubuntuから)