udevルール内でrootとしてマウントを実行する

udevルール内でrootとしてマウントを実行する

しばらく前に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から)

関連情報