この質問 は似ていますが、欲しいものとは反対のものです。誰もログインしていなくても、外付けUSBドライブを起動時に自動的に/media/<label>
のような場所にマウントしたいのです。
面倒で面倒なこともありますが、すべてのデータをfstabに入力する必要はありませんが、プラグインするものや将来パーティションがどのように変わるか予測できないためです。
ドライブが MPD のようなものにアクセスできるようにし、SSHでログインしたときに利用できるようにします。 gnome-mount
は、あなたがローカルでGnomeグラフィカルセッションにログインしているときにだけ、ものをマウントするようです。
vol_id
コマンドが原因で、Ubuntu Server 11.10で失敗します。 vol_id
はblkid
に置き換えられました。スクリプトを修正するには、udev-auto-mount.sh
スクリプトの「vol_id」を「blkid -o udev」に置き換えます。私はしばらくの間、これに頭を悩ませてきました、そして、私は実用的な解決策を見つけたと思います。これはDebianベースのシステムで開発されテストされているので、Ubuntuでも動作するはずです。それが他のシステムにも適応できるようにするために私はそれが作る仮定を指摘するつもりです。
/media/LABEL
ディレクトリが自動的に作成されます。gksudo
などが必要かもしれません。私はシステム起動時にこれをテストしていませんが、システムがマウントする準備ができる前にそれがUSBドライブをマウントしようとした場合、それがうまくいかないかもしれないことを見ることができる唯一の理由です。その場合は、おそらくマウントスクリプトに1つ追加の調整が必要になります。 (私は ServerFault で何かアドバイスがあるかどうかを調べていますが、それについてはあまり興味がありません。)
それに、それで。
UDEVはカーネルのホットプラグシステムです。起動時にも、システムの実行中に追加されたデバイスに対しても、適切なデバイスとデバイスシンボリックリンク(例:/dev/disk/by-label/<LABEL>
)を自動的に設定します。
D-BusとHALはデスクトップ環境のようなリスナーにハードウェアイベントを送るために使われます。そのため、GNOMEにログインしてCDを挿入するかUSBドライブを接続すると、そのイベントは次のようになります。
kernel -> udev -> dbus -> hal -> gnome-vfs/nautilus (mount)
そして、あなたのドライブはマウントされます。しかし、ヘッドレスシステムでは、自動マウントの利点を得るためにログインする必要はありません。
UDEVでは、デバイスの挿入時にルールを作成したりプログラムを実行したりできるため、これは理想的な選択肢です。私たちは、Debian/Ubuntuの既存のルールを利用して、/dev/disk/by-label/<LABEL>
シンボリックリンクを私たちに設定させ、そして私たちのためにデバイスをマウントする別のルールを追加するつもりです。
UDEVの規則は/etc/udev/rules.d
(およびKarmicでは/lib/udev/rules.d
)に保持され、数値順に処理されます。番号で始まっていないファイルは番号付きファイルの後に処理されます。私のシステムでは、HALルールは90-hal.rules
というファイルに入っているので、自分のルールを89-local.rules
に入れて、それらがHALに到達する前に処理されるようにします。主に、これらの規則が60-persistent-storage.rules
の後にくるようにする必要があります。 local.rules
で十分かもしれません。
これを新しいルールファイルに入れてください:
# /etc/udev/rules.d/local.rules
# /etc/udev/rules.d/89-local.rules
# ADD rule: if we have a valid ID_FS_LABEL_ENC, and it's USB, mkdir and mount
ENV{ID_FS_LABEL_ENC}=="?*", ACTION=="add", SUBSYSTEMS=="usb", \
RUN+="/usr/local/sbin/udev-automounter.sh %k"
\
の後にスペースがないこと、ちょうどnewline
(\n
)があることを確認してください。
FirewireサポートのためにSUBSYSTEMS=="usb"
をSUBSYSTEMS=="usb|ieee1394"
に変更してください。
デバイスを常に特定のユーザーが所有するようにしたい場合は、OWNER="username"
句を追加します。特定のユーザーが所有するファイルだけが必要な場合は、代わりにマウントスクリプトを微調整してください。
これにより、実行するプログラムがデバイスの実行プログラムリストに追加されます。 USBパーティションデバイスを<LABEL>
で識別してから、この情報をマウントを実行するスクリプトに渡します。具体的には、この規則は一致しています。
ENV{ID_FS_LABEL_ENC}=="?*"
- 以前のシステムルールによって設定された環境変数。非ファイルシステムには存在しないので、それをチェックします。実際にはマウントポイントにID_FS_LABEL
を使いたいのですが、UDEVにそれをエスケープするようには思わせないので、マウントスクリプトにそれを処理させます。
この環境変数およびその他の環境変数は、udevによってvol_id
コマンドを使用して取得されます( deprecated )。パーティションに関するすばやく詳細を確認するのに便利なツールです。
$ Sudo vol_id /dev/sdc1
ID_FS_TYPE=ext2
ID_FS_UUID=a40d282a-4a24-4593-a0ab-6f2600f920dd
ID_FS_LABEL=Travel Dawgs
ID_FS_LABEL_ENC=Travel\x20Dawgs
ID_FS_LABEL_SAFE=Travel_Dawgs
ACTION=="add"
- add
イベントにのみ一致します...
SUBSYSTEMS=="usb"
- USBバス上にあるデバイスだけに一致します。ここではSUBSYSTEMS
を使用しています。これは私たちのデバイスの親に対して一致するからです。私たちが興味を持っているデバイスは実際にはSUBSYSTEM == "scsi"です。親のUSBデバイスと照合することで、内蔵ドライブにプログラムを追加することを避けられます。
RUN+="..."
- 一致ではなく、アクション:実行するプログラムのリストにこのプログラムを追加してください。プログラムの引数では、%k
はデバイス名(例えばsdc1
ではなく/dev/sdc1
)に展開され、$env{FOO}
は環境変数FOOの内容を取得します。
最初の参照リンク(上)は優れたUDEVチュートリアルですが、少し古くなっています。ルールをテストするために実行されるプログラム(特にudevtest
)は、catch-all udevadm
ユーティリティに置き換えられました。
ルールを追加したら、デバイスを接続します。数秒待ってから、割り当てられているデバイスを確認します。
$ ls -l /dev/disk/by-label/*
lrwxrwxrwx 1 root root 10 2009-10-25 07:27 label_Foo -> ../../sda1
lrwxrwxrwx 1 root root 10 2009-10-25 07:27 label_Bar -> ../../sdb1
lrwxrwxrwx 1 root root 10 2009-10-25 07:27 label_Baz -> ../../sdc1
取り外し可能ドライブにlabel_Baz
が含まれている場合、それはデバイスsdc1
上にあります。これを実行して、最後の方の出力を見てください。
$ Sudo udevadm test /sys/block/sdc/sdc1
parse_file: reading (...) (many lines about files it reads)
import_uevent_var: import into environment: (...) (many lines about env variables)
(...) (many lines tracing rule matches & programs run)
update_link: found 1 devices with name 'disk/by-label/LABEL_BAZ'
update_link: found '/block/sdc/sdc1' for 'disk/by-label/LABEL_BAZ'
update_link: compare (our own) priority of '/block/sdc/sdc1' 0 >= 0
update_link: 'disk/by-label/LABEL_BAZ' with target 'sdc1' has the highest priority 0, create it
udevtest: run: '/usr/local/sbin/udev-automounter.sh sdc1 LABEL_BAZ'
udevtest: run: 'socket:/org/freedesktop/hal/udev_event'
udevtest: run: 'socket:@/org/kernel/udev/monitor'
最後の数行で、このRUN+=
ルールからスクリプト名を探します(この例では下から3番目)。この装置に使用される引数を見ることができます。このコマンドを実行して、引数が正しいことを確認できます。それがあなたのコマンドラインで動作するなら、それはデバイスが挿入されたときに自動的に動作するはずです。
UDEVイベントをリアルタイムで監視することもできます。Sudo udevadm monitor
を実行します(スイッチの詳細についてはman udevadm
を参照)。それから新しいデバイスを接続してイベントがスクロールするのを見てください。 (あなたが本当に低レベルの詳細に陥っていない限り、おそらくやり過ぎるでしょう…)
ルールが正しく読まれていることを確認したら、新しいルールが有効になるように、UDEVにそのルールをリロードするように指示する必要があります。これらの方法のいずれかを使用してください(最初の方法でうまくいかない場合は、2番目の方法でも構いませんが、最初の方法を試してください)。
Sudo udevadm control --reload-rules
を実行する
Sudo /etc/init.d/udev reload
を実行する
リブート
これが最初のスクリプトです。実行するプログラムは短時間で完了する必要があるため、これは2番目のスクリプトをバックグラウンドで回転させるだけです。これを/usr/local/sbin/udev-automounter.sh
に入れます。
#!/bin/sh
#
# USAGE: usb-automounter.sh DEVICE
# DEVICE is the actual device node at /dev/DEVICE
/usr/local/sbin/udev-auto-mount.sh ${1} &
これが2番目のスクリプトですこれはもう少し入力チェックを行います。これを/usr/local/sbin/udev-auto-mount.sh
に入れてください。以下のマウントオプションを微調整することをお勧めします。このスクリプトは現在、パーティションLABELをそれ自身で見つけることを処理します。 UDEVはDEVICE名のみを送信します。
起動時にドライブのマウントに問題がある場合は、このスクリプトにNice long sleep 60
を設定して、スクリプトが実行を試みる前にシステムが起動するまでの時間を確保することができます。ドライブをマウントしてください。
どのようにチェックするかについてのコメントで提案をしました(ウェブサーバが動いているかどうか見るためにps
を走らせてください)、しかしあなたはあなたのシステムのためにそれを微調整したいでしょう。 nfsd、smbd、Apacheなど、ほとんどのネットワークサーバーでこの目的に十分であると私は思います。もちろん、サービスが実行されていないとマウントスクリプトが失敗する可能性があります。特定のファイルの存在はより良い解決策になるでしょう。
#!/bin/sh
#
# USAGE: udev-auto-mount.sh DEVICE
# DEVICE is the actual device node at /dev/DEVICE
#
# This script takes a device name, looks up the partition label and
# type, creates /media/LABEL and mounts the partition. Mount options
# are hard-coded below.
DEVICE=$1
# check input
if [ -z "$DEVICE" ]; then
exit 1
fi
# test that this device isn't already mounted
device_is_mounted=`grep ${DEVICE} /etc/mtab`
if [ -n "$device_is_mounted" ]; then
echo "error: seems /dev/${DEVICE} is already mounted"
exit 1
fi
# If there's a problem at boot-time, this is where we'd put
# some test to check that we're booting, and then run
# sleep 60
# so the system is ready for the mount below.
#
# An example to experiment with:
# Assume the system is "booted enough" if the HTTPD server is running.
# If it isn't, sleep for half a minute before checking again.
#
# The risk: if the server fails for some reason, this mount script
# will just keep waiting for it to show up. A better solution would
# be to check for some file that exists after the boot process is complete.
#
# HTTPD_UP=`ps -ax | grep httpd | grep -v grep`
# while [ -z "$HTTPD_UP" ]; do
# sleep 30
# HTTPD_UP=`ps -ax | grep httpd | grep -v grep`
# done
# pull in useful variables from vol_id, quote everything Just In Case
eval `/sbin/vol_id /dev/${DEVICE} | sed 's/^/export /; s/=/="/; s/$/"/'`
if [ -z "$ID_FS_LABEL" ] || [ -z "$ID_FS_TYPE" ]; then
echo "error: ID_FS_LABEL is empty! did vol_id break? tried /dev/${DEVICE}"
exit 1
fi
# test mountpoint - it shouldn't exist
if [ ! -e "/media/${ID_FS_LABEL}" ]; then
# make the mountpoint
mkdir "/media/${ID_FS_LABEL}"
# mount the device
#
# If expecting thumbdrives, you probably want
# mount -t auto -o sync,noatime [...]
#
# If drive is VFAT/NFTS, this mounts the filesystem such that all files
# are owned by a std user instead of by root. Change to your user's UID
# (listed in /etc/passwd). You may also want "gid=1000" and/or "umask=022", eg:
# mount -t auto -o uid=1000,gid=1000 [...]
#
#
case "$ID_FS_TYPE" in
vfat) mount -t vfat -o sync,noatime,uid=1000 /dev/${DEVICE} "/media/${ID_FS_LABEL}"
;;
# I like the locale setting for ntfs
ntfs) mount -t auto -o sync,noatime,uid=1000,locale=en_US.UTF-8 /dev/${DEVICE} "/media/${ID_FS_LABEL}"
;;
# ext2/3/4 don't like uid option
ext*) mount -t auto -o sync,noatime /dev/${DEVICE} "/media/${ID_FS_LABEL}"
;;
esac
# all done here, return successful
exit 0
fi
exit 1
もう1つのスクリプトこれは、デバイスをアンマウントしてマウントポイントディレクトリを削除するだけです。これにはprivがあると仮定しているので、Sudo
を付けて実行する必要があります。このスクリプトはコマンドラインのフルマウントポイントを取得します。例えば:
$ /usr/local/sbin/udev-unmounter.sh "/media/My Random Disk"
これを/usr/local/sbin/udev-unmounter.sh
に入れます。
#!/bin/sh
#
# USAGE: udev-unmounter.sh MOUNTPT
# MOUNTPT is a mountpoint we want to unmount and delete.
MOUNTPT="$1"
if [ -z "$MOUNTPT" ]; then
exit 1
fi
# test mountpoint - it should exist
if [ -e "${MOUNTPT}" ]; then
# very naive; just run and pray
umount -l "${MOUNTPT}" && rmdir "${MOUNTPT}" && exit 0
echo "error: ${MOUNTPT} failed to unmount."
exit 1
fi
echo "error: ${MOUNTPT} does not exist"
exit 1
他の人がネットで提案している最後の選択肢の1つはivman
ですが、それはpmount
に依存しているように見えますが、これはすでに上手くいきません。 pmount
は放棄され、ivman
はほぼ同じです。
ivman
の代わりがhalevt
であり、それはKarmicで利用可能です。これはivman
の再実装です(read: "maintain"、 "pmountには依存しません")。このパッケージはJauntyでは利用できませんが、アップグレードを計画していないのであれば自分でビルドすることができるかもしれません。
これらのツールは両方ともDBusおよびHALレイヤの上にあり、それらからのイベントに応答します。どちらもシステムデーモンとしてもユーザーセッションマウントマネージャ(la Gnome-VFS)としても実行できます - /etc/defaults/{ivman,halevt}
ファイルはシステム設定を担当します。
これはivman
を調整して/media/<LABEL>
マウントポイントを使うためのいくつかの指示 です。 halevt
にはもっと簡単な方法があるようですが、おそらくそれらはあなたが答えを見つけるのを手助けするでしょう。
更新:私のUDEV回答では提供されていない、自動CDマウントも取得するために、私はhalevt
を詳しく見ました。私はこの ブログ記事 を見つけました。これはプロセスについて多くのことを説明するのを助けました。私はDebian Lenny用に自分自身のhalevt
パッケージをコンパイルしなければなりませんでした(幸いなことにすべての依存関係はlenny-backportsセクションにありました)。いったんインストールされると、そのプロセスはほとんど恐ろしくありませんでした。
/etc/default/halevt
でシステムhalevt-daemonが有効になっていることを確認してください/etc/PolicyKit/PolicyKit.conf
でデバイスをマウントすることを許可します(下記参照; source )。/etc/hal/fdi/policy/preferences.fdi
の優先マウントポイントにコピーするようにHALポリシーを変更します(下記参照)。eject.hal
スクリプト を入手し、変更して/usr/local/bin
に保存してください。/etc/halevt/halevt.xml
内のマウントを有効にするようにhalevtシステム設定を変更します新しい設定をチェックするためにHALデーモンとHALEVTデーモンを再起動する必要がある場合は、これを使用して正しい順序でそれらを取得します。
Sudo sh -c "/etc/init.d/halevt stop ; /etc/init.d/hal restart ; /etc/init.d/halevt start"
START_DAEMON=yes
の/etc/default/halevt
を確認してください。
/etc/PolicyKit/PolicyKit.conf
で、これをinside<config></config>
セクションに追加します。
<match action="org.freedesktop.hal.storage.mount-removable">
<match user="halevt">
<return result="yes"/>
</match>
</match>
/etc/hal/fdi/policy/preferences.fdi
で、これにinside`セクションを追加します。
<match key="volume.label" empty="false">
<match key="volume.label" is_absolute_path="false">
<merge key="volume.policy.desired_mount_point" type="copy_property">volume.label</merge>
</match>
</match>
スクリプトは良いですが/bin/bash
を実行する必要があります。 /bin/dash
が呼び出されるとき、実際には/bin/sh
を使用するシステムもあります。スクリプトの一番上の行を変更して、正しい行が表示されるようにします。
#!/bin/sh <------ old first line
#!/bin/bash <------ new first line
これは楽しい部分です。あなたのシステムはすでに基本的な/etc/halevt/halevt.xml
を提供しているかもしれないので、あなたはあなた自身の使用のためにこれを調整する必要があるでしょう。私の場合、私のシステムはすでに基本的な取り外し可能なマウントを提供していましたが、私はCDROMマウントと取り出しボタンのサポートを追加しなければなりませんでした。
私が述べたブログ投稿はあなた自身の微調整を見るために 良い例のXML設定 を持っています。それは主に作者のfluxbox
環境のためのgnome-mount置換をセットアップすることに関するものです、それで彼の例のXMLはあなたが望む以上のことをします、しかしそれはあなたが何ができるかについて感じるための素晴らしい方法です。 /usr/share/doc/halevt/examples
にはいくつかの良い例もあります。
私はすべてがうまくいく前にSudo sh -c "mkdir /var/halevt ; chown halevt:plugdev /var/halevt"
を実行しなければなりませんでした。
CD/DVDの自動マウントを機能させるための追加機能は次のとおりです。
<!-- CD/DVD mount -->
<halevt:Device match="hal.block.device & hal.block.is_volume = true & hal.volume.is_disc = true & hal.volume.disc.has_data = true">
<halevt:Property name="hal.volume.is_mounted">
<halevt:Action value="true" exec="halevt-mount -u $hal.udi$ -p $hal.volume.policy.desired_mount_point$ -m 002"/>
</halevt:Property>
</halevt:Device>
<!-- CD/DVD eject button support -->
<halevt:Device match="hal.storage.drive_type = cdrom">
<halevt:Condition name="EjectPressed" exec='/usr/local/bin/eject.hal $hal.block.device$'/>
</halevt:Device>
システムhalevt-daemonが動作したら、GNOMEにログインしたときにそれを無効にし、ログアウトしたときに再起動する必要があります。 (GDM以外のログインマネージャについては、 この質問に対する私の答え を参照してください。)これは理論的なことではありませんが、うまくいくはずです。
/etc/gdm/PreSession/Default
に、システムhalevt-daemonを停止するためにこれを追加してください:
/etc/init.d/halevt stop
/etc/gdm/PostSession/Default
に、システムhalevt-daemonを再起動するためにこれを追加してください:
/etc/init.d/halevt start
時間が経つにつれて、より簡単な解決策が現れます。
このソリューションは、この目的のために書かれたudevilソフトウェアパッケージに依存しており、udevルールをいじる必要はありません。それはおそらく直接的な解決策として(新旧のユーザーにとって)望ましいです。
Udevilのdevmon
スクリプトは、udevとglibにのみ依存しながら、すべての魔法を行います。初期設定を必要とせずに、箱から出してすぐに動作します。
私のワークステーションで私がしたことは、rc.local
からdevmonを呼び出すことだけでした。devmon 2>&1 >> /var/log/devmon &
あなたの快適さのためにそれを作成するためにpleaserun
のような自動化ツールを使ってこれをrc.local
の代わりにinitスクリプトに埋め込むことを望むかもしれません: https://unix.stackexchange.com/a/124609/42673
それを実行した後、私が接続したストレージは検査され(パーティションを探し、見つかった場合はそれらのファイルシステムのラベルを調べます)、それから/media/FILESYSTEM_LABEL
にマウントされます。
(in)有名なシステムが将来のある時点でこの機能を組み込もうとしていたことを除いて、それよりも単純なことは想像できませんでした。
一目でわかる( github.io/udevil )
スクリプト:devmon( igurublog/script-devmon )
Debianベースのシステム(Ubuntuなど)では、USBドライブを自動的にマウントする usbmount パッケージがあります。すでに概説したように、基本的にはudevベースのアプローチを使用します - それは単に単純なパッケージインストールです。 オリジナルの パッケージの作者はSteamを使い果たしたようですが、Ubuntu/Debianはまだそれを維持しているようです(私はそれはそれほど複雑ではないと思います) - 最新のリリースではまだ利用可能です。
インストールされたスクリプトは適切なマウントポイントを提供するように設定することができます(/etc/usbmount/usbmount.conf)。
quack quixoteの答えはUbuntu Lucid Lynx(10.04)では動作しません - /sbin/vol_id
コマンドはありません。
空想でudevを使うよりは、これをあなたの/etc/rc.localに入れてください:
for dev in $(ls -1 /dev/disk/by-label/* | grep -v EFI) ; do
label=$(basename $dev)
mkdir -p /media/$label
$(mount | grep -q /media/$label) || mount $dev /media/$label
done
Quack Quixoteの優れた駆除方法を消去するには:
先ほど作成したudevルールファイル(/etc/udev/rules.d)に次の行を追加してください。 "
ENV{ID_FS_LABEL_ENC}=="?*", ACTION=="remove", SUBSYSTEMS=="usb", \
RUN+="/usr/local/sbin/udev-autounmounter.sh %k"
次に、次のスクリプトを作成し、実行可能ファイル(/usr/local/sbin/udev-autounmounter.sh)を次の内容でchmodします。
#!/bin/sh
#
# USAGE: usb-autounmounter.sh DEVICE
# DEVICE is the actual device node at /dev/DEVICE
/usr/local/sbin/udev-auto-unmount.sh ${1} &
最後にアンマウントスクリプト自身(udev-auto-unmount.sh):
#!/bin/sh
#
# USAGE: udev-auto-unmount.sh DEVICE
# DEVICE is the actual device node at /dev/DEVICE
#
# This script takes a device name, looks up the partition label and
# type, creates /media/LABEL and mounts the partition. Mount options
# are hard-coded below.
DEVICE=$1
# check input
if [ -z "$DEVICE" ]; then
exit 1
fi
#test that the device is already mounted
MOUNTPT=`mount | grep ${DEVICE} | cut -d ' ' -f 3`
if [ -z "${MOUNTPT}" ]; then
echo "error: the device is not already mounted"
exit 1
fi
# test mountpoint - it should exist
if [ -e "${MOUNTPT}" ]; then
# very naive; just run and pray
umount -l "${MOUNTPT}" && rmdir "${MOUNTPT}" && exit 0
echo "error: ${MOUNTPT} failed to unmount."
exit 1
fi
echo "error: ${MOUNTPT} does not exist"
exit 1
そのため、他の指示で、ディレクトリは自動的に現れて、udevイベントで消えます。
あなたは Pysdmを試してみることをお勧めします
su username -c gnome-volume-manager
を/etc/rc.localに入れてみることができます。単にgnome-volume-managerを実行するだけで十分かもしれません。
編集:それはgnome - ボリュームマネージャはもはやUbuntuのデスクトップ上であっても、デフォルトディストリビューションの一部ではないようです。
wajig policy gnome-volume-manager
gnome-volume-manager:
Installed: (none)
Candidate: 2.24.0-0ubuntu1
Version table:
2.24.0-0ubuntu1 0
500 http://ubuntu.secs.oakland.edu jaunty/universe Packages
しかし、もしあなたがそれをインストールすれば、それはまだうまくいくでしょう。それは試みに値します。うまくいかない場合は、もう一度取り外します。
usbmount
パッケージもあります。これはあなたが望むことを行いますが、通常の自動マウントを妨げる可能性があります。
Quack quixoteのudevベースのソリューションに対する私の編集された補遺は却下されたので、ここに載せるつもりです。まず彼の投稿を参照してください。
まず第一に、anyデバイスがSCSIサブシステム(USB、FireWire、eSATAの両方を含む)経由で接続されているときにudevルールを機能させたい場合udevルール内のSUBSYSTEMSの一致をSUBSYSTEMS=="scsi"
に変更します。
ただし、システムの実行中に内蔵ドライブをホットプラグすると、内蔵ドライブも含めて、これによってほとんどすべてが自動的にマウントされるので注意が必要です。
第二に、これは私が使っているスクリプトで、その記事の中のすべてのスクリプトを置き換えます。マウントされたブロックデバイスが削除されるとすぐに/ media /に作成されたマウントポイントを自動的にクリーンアップします - 手動の介入の必要はありません。さらに、バックグラウンドで実行するために別のスクリプトを呼び出すのではなく、端末から実行されない場合(たとえば、udevを介して実行された場合)にバックグラウンドで自分自身を置きます。
マウントされたデバイスが消えるまでinotifywaitを使って待機し、作成したディレクトリを削除します。そのため、あなたのシステムにinotify-toolsがインストールされている必要があります。 Debianベースのディストリビューション(Ubuntuを含む)では、Sudo apt-get install inotify-tools
で十分です。
#!/bin/bash
#
# Auto-mounter script, to be executed by udev on the addition of a
# mass storage device.
#
# Takes one argument; the base block device partition, e.g. "sdb3".
#
# Creates a mountpoint for the partition using its FS label, in
# /media/{fslabel} and mounts it there, read-only, unsynced.
#
# If the filesystem has no label, "Untitled" is used instead.
#
# If another filesystem is already mounted at that location, the
# newcomer will be mounted with an integer number appended to its
# label.
MOUNT_OPTS="ro,noatime,nodiratime"
# If we're called from a non-tty and not explicitly told to continue,
# we call ourselves in a subshell and thus return immediately (udev
# gets impatient):
if [[ "$2" != "backgrounded" ]] && ! tty &> /dev/null; then
($0 $1 backgrounded &)
exit
fi
# Determine the desired mountpoint from the label of the fs on the partition:
MOUNTPOINT="/media/$(blkid /dev/$1 | grep LABEL | sed -E 's:^.+LABEL="([^"]+).+:\1:')"
# If it had no label, use "Untitled":
[[ "$MOUNTPOINT" = "/media/" ]] && MOUNTPOINT="/media/Untitled"
# If something's already mounted there, append a number:
if [[ -e "$MOUNTPOINT" ]] && mountpoint "$MOUNTPOINT" &> /dev/null; then
NUM=1
while mountpoint "$MOUNTPOINT $NUM" &> /dev/null; do NUM=$((NUM+1)); done
MOUNTPOINT="$MOUNTPOINT $NUM"
fi
# Create the mountpoint and mount there:
mkdir "$MOUNTPOINT" && mount -o $MOUNT_OPTS /dev/$1 "$MOUNTPOINT"
# Wait until the device is removed (the block device is "deleted"):
inotifywait -e delete /dev/$1
# Then clean up. If it fails, retry every second for up to 5 mins:
TRIES=0
while [[ -e "$MOUNTPOINT" ]] && [[ $TRIES -lt 300 ]]; do
rmdir "$MOUNTPOINT"
sleep 1s
TRIES=$((TRIES+1))
done
同期せずにデバイスをマウントし、読み取り専用にすることに気付くでしょう。これは、99%の時間が使用されているからです。私のユースケースは外付けドライブからの読み取りであり、書き込みが必要なときはいつでもサーバー上でアクティブになり、mount -o remount,rw <mountpoint>
コマンドを簡単に発行できます。あなたのニーズに合うように編集してください:)
手動でデータを入力する必要がないように、mountmanagerで設定してみてください。
それはubuntuリポジトリの一部であるべきです。