linux – ユーザーがログインしなくても起動時に外付けドライブを/media/LABELに自動的にマウントしますか?

external-hard-drive linux mount ubuntu usb-flash-drive

この質問は似ていますが、私が欲しいものとは正反対です。外付けUSBドライブを起動時に自動的に/media/<label>のような場所に、誰もログインしなくてもマウントできるようにしたいのです

fstabに全てのデータを入力しなければならないのは、部分的には面倒で面倒だからですが、大抵の場合、何を突っ込むか、将来的にパーティションがどのように変化するかを予測できないからです

ドライブは MPD のようなものにアクセスでき、SSH でログインしたときに利用できるようにしたいのです。gnome-mount は、ローカルで Gnome のグラフィカルなセッションにログインしているときにしかマウントできないようです

  74  endolith  2009-10-11


ベストアンサー

  • Ubuntu Server 11.10用の注意事項: このスクリプトは、旧式のvol_idコマンドのため、Ubuntu Server 11.10では失敗します。vol_idblkidに置き換えられました。スクリプトを修正するには、udev-auto-mount.shスクリプトの “vol_id “を “blkid -o udev “に置き換えてください

しばらくの間、このことで頭を悩ませていましたが、動作する解決策を見つけたと思います。これは Debian ベースのシステムで開発・テストされたものなので、Ubuntu でも動作するはずです。他のシステムにも適応できるように、前提条件を指摘しておきます

  • プラグインにUSBドライブを自動的にマウントしてくれますし、Firewireに適応させるのにもそれほど時間はかからないはずです
  • UDEVを使っているので、HAL/DeviceKit/GNOME-Anythingをいじる必要はありません
  • デバイスをマウントするための/media/LABELディレクトリを自動的に作成します
  • しかし、他のオートマウンタと干渉するかもしれません。Gnome-VFS がアクティブな状態では、両方ともマウントを試みるかもしれません… もし Gnome-VFS がマウントに失敗した場合、デスクトップアイコンを設定しないかもしれません。Gnome からのアンマウントは可能なはずですが、gksudo などが必要かもしれません

システム起動時にはテストしていませんが、システムがマウントできる状態になる前に USB ドライブをマウントしようとした場合に動作しない可能性があります。そのような場合は、おそらくマウントスクリプトに1つ追加の微調整が必要になるでしょう。(何かアドバイスがあるかどうかを確認するために、ServerFaultでチェックしていますが、向こうではあまり興味がありません)

それに続けよう


UDEV references:


背景(UDEV? Whuzzat?

UDEV はカーネルのホットプラグシステムです。これは、起動時とシステム実行中に追加されたデバイスのために、適切なデバイスとデバイスシンボリックリンク (/dev/disk/by-label/<LABEL> など) を自動的に設定するものです

D-Bus と HAL は、デスクトップ環境のようなリスナーにハードウェアのイベントを送信するために使われます。つまり、GNOME にログインして CD を挿入したり USB ドライブを接続したりすると、そのイベントはこのチェーンに沿って送られます

kernel -> udev -> dbus -> hal -> gnome-vfs/nautilus (mount)

そして、ドライブがマウントされます。しかし、ヘッドレスシステムでは、オートマウントの利点を得るためにログインする必要はありません

Udev Rules

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"
  • \の後にスペースがないことを確認してください

  • Firewire対応のため、SUBSYSTEMS=="usb"SUBSYSTEMS=="usb|ieee1394"に変更

  • デバイスを常に特定のユーザが所有するようにしたい場合は、OWNER="username" 句を追加します。特定のユーザが所有するファイルだけが必要な場合は、代わりにマウントスクリプトを微調整してください

ルールを読む

これは、実行するプログラムをデバイスの実行プログラムリストに追加します。USBパーティションデバイスを<LABEL>で識別し、この情報をマウントを実行するスクリプトに渡します。具体的には、このルールはマッチングしています

  1. ENV{ID_FS_LABEL_ENC}=="?*" — 以前のシステムルールで設定された環境変数。非ファイルシステムには存在しないので、それをチェックします。本当はマウントポイントに ID_FS_LABEL を使いたいのですが、UDEV がエスケープしてくれないので、マウントスクリプトに任せることにしました

    これと他の環境変数は、vol_id コマンド (deprecated) を使って udev が取得します。これはパーティションの詳細を素早く見るのに便利なツールです

    $ 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
    
  2. ACTION=="add"add イベントにのみマッチする

  3. SUBSYSTEMS=="usb" — USB バス上にあるデバイスにのみマッチします。ここで SUBSYSTEMS を使うのは、これがデバイスの親デバイスにマッチするからです。親 USB デバイスにマッチすることで、内部ドライブへのプログラムの追加を避けることができます

  4. RUN+="..." — マッチではなくアクション: このプログラムを実行するプログラムのリストに追加します。プログラムの引数では、%kはデバイス名に展開され(/dev/sdc1ではなくsdc1など)、$env{FOO}は環境変数FOOの内容を取得します

ルールのテスト

最初の参照リンク(上)は優れたUDEVのチュートリアルですが、少し古くなっています。あなたのルールをテストするために実行されるプログラム (特に udevtest) は、キャッチオールの 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'

最後の数行(この例では下から3番目)にある RUN+= ルールのスクリプト名を探してください。このデバイスに使用される引数を見ることができます。このコマンドを実行して、引数が正しいかどうかを確認することができます

UDEVのイベントをリアルタイムで監視することもできます: sudo udevadm monitorを実行してください (スイッチの詳細についてはman udevadmを参照してください)。そして、新しいデバイスを接続して、イベントがスクロールするのを見るだけです。(おそらく、本当に低レベルの詳細を知りたいのでなければ、やりすぎかもしれませんが…)

ルールの再読み込み

ルールが正しく読み込まれていることを確認したら、新しいルールが有効になるように、UDEV にルールをリロードするように指示する必要があります。これらの方法のいずれかを使ってください (最初の方法がうまくいかない場合は、2番目の方法を使うべきですが、最初の方法を試してみてください)

  • 実行 sudo udevadm control --reload-rules

  • 実行 sudo /etc/init.d/udev reload

  • reboot


スクリプト!実は2つのスクリプト

これが最初のスクリプトです。実行するプログラムはすぐに完了させる必要があるので、これは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 を自分で見つけることができるようになりました

起動時にドライブのマウントに問題がある場合、このスクリプトに長い sleep 60 を記述することで、スクリプトがドライブをマウントしようとする前にシステムが立ち上がるまでの時間を与えることができます

私はコメントの中で、(ウェブサーバが動いているかどうかを確認するためにpsを実行する)方法を提案しましたが、あなたのシステムに合わせて微調整したいと思うでしょう。あなたが使っているかもしれないほとんどのネットワークサーバは、この目的には十分だと思います — nfsd, smbd, apache, etc.もちろん、サービスが実行されていない場合、マウントスクリプトが失敗するというリスクがあります

#!/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

スーパーボーナスクリーンアップスクリプト!

もう一つのスクリプト。これはデバイスをアンマウントし、マウントポイントディレクトリを削除するだけです。これを行うには privs を持っていることを前提としているので、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

74  quack quixote  2009-11-03


ネット上で他の人が提案している最終的な選択肢の一つはivmanですが、これはpmountに依存しているようで、あなたが既に述べたように動作しません。pmountは放棄されており、ivmanはほぼ同じです

ivman の代わりは halevt で、Karmic で利用可能です。これは ivman の再実装です (読み方: “メンテナンスされている” と “pmount に依存しない” です)。このパッケージは Jaunty 上では利用できませんが、アップグレードの予定がなければ自分でビルドすることができるかもしれません

これらのツールはどちらも DBus と HAL 層の上にあり、それらからのイベントに反応します。どちらもシステムデーモンとして、あるいは (Gome-VFS のような) ユーザセッションマウントマネージャとして動作するようです — /etc/defaults/{ivman,halevt} ファイルはシステム設定を担当します

ivmanをいじって/media/<LABEL>のマウントポイントを使うための説明です。halevt にはもっと簡単な方法があるかもしれませんが、もしかしたら答えが見つかるかもしれません


HALEVTとの連携

更新: 私のUDEVの回答にはない自動CDマウントを取得するために、halevtをもっと深く調べてみました。この ブログ記事 を見つけました。私は、Debian Lenny 用の halevt パッケージを自分でコンパイルする必要がありました (幸いにも、すべての依存関係は lenny-backports セクションにありました)。一度インストールしてしまえば、プロセスのほとんどは恐ろしくありませんでした

  1. /etc/default/halevt で system halevt-daemon が有効になっていることを確認してください
  2. システム halevt ユーザが /etc/PolicyKit/PolicyKit.conf にデバイスをマウントできるようにします (下記参照; source)
  3. HAL ポリシーを変更して、/etc/hal/fdi/policy/preferences.fdi の優先マウントポイントにボリュームラベルをコピーするようにします (後述)
  4. CD/DVD のサポートが必要な場合は、上記のブログ記事から eject.hal スクリプト を取得し、修正して /usr/local/bin に保存してください
  5. halevt システム設定を変更して、/etc/halevt/halevt.xmlでマウントを有効にします
  6. ログインマネージャのセッション前後のスクリプトにコードを追加して、誰かがログオンしたときにシステムの halevt-daemon を停止し、彼らがログオフしたときにそれを再起動します

新しい設定を確認するために HAL デーモンや HALEVT デーモンを再起動する必要がある場合は、これを使って正しい順番にしてください

sudo sh -c "/etc/init.d/halevt stop ; /etc/init.d/hal restart ; /etc/init.d/halevt start"

Step 1

START_DAEMON=yes/etc/default/halevtにあることを確認してください

Step 2

/etc/PolicyKit/PolicyKit.confでは、<config></config>の中に追加します

<match action="org.freedesktop.hal.storage.mount-removable">
<match user="halevt">
<return result="yes"/>
</match>
</match>

Step 3

/etc/hal/fdi/policy/preferences.fdiでは、これを ` セクションの中に追加します

<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>

Step 4

スクリプトは良いのですが、/bin/bashを実行する必要があります; システムによっては、/bin/shが呼ばれたときに実際に/bin/dashを使うことがあります。そのため、スクリプトの一番上の行を変更して、正しいものが得られるようにしてください

#!/bin/sh         <------ old first line

#!/bin/bash       <------ new first line

Step 5

ここが面白いところです。お使いのシステムは基本的な/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 &amp; hal.block.is_volume = true  &amp; hal.volume.is_disc = true &amp; 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>

Step 6

システムの 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

9  quack quixote  2009-11-03


時間が経つにつれて、より簡単な解決策が現れてきます

このソリューションは、この目的のために書かれた udevil ソフトウェアパッケージに依存しており、 udev のルールをいじる必要はありません。おそらく、(新しいユーザや古いユーザにとっては) 直球勝負のソリューションとして好ましいでしょう

udevil の devmon スクリプトは、 udev と glib にのみ依存しながら、すべてのマジックを実行します。初期設定を必要とせずに、ほとんどすぐに動作します

私がワークステーションで行ったことは、このようにrc.localからdevmonを呼び出すことだけでした。 rc.local の代わりに pleaserun のような自動化されたツールを使って init スクリプトを作成するのではなく、devmon 2>&1 >> /var/log/devmon & のように init スクリプトに埋め込んだ方が快適でしょう。https://unix.stackexchange.com/a/124609/42673

実行した後、プラグインしたストレージは検査され(パーティションを探し、見つかった場合はファイルシステムのラベルを見ます)、/media/FILESYSTEM_LABELにマウントされます。 これよりもシンプルなものは想像できませんが、有名な (in)systemd が将来的にこの機能を組み込むことになるかもしれません

udevil At A Glance (github.io/udevil) スクリプト: devmon (igurublog/script-devmon)

7  Costin Gușă  2013-07-08


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

3  mrm  2010-08-15


Debian ベースのシステム (Ubuntu など) には、usbmount パッケージがあり、自動的に USB ドライブをマウントしてくれます。それは基本的にはすでに概説されているように udev ベースのアプローチを使用しています – それだけで単純なパッケージのインストールです。オリジナル のパッケージの作者は、もう手詰まりのようですが、Ubuntu/Debian はまだそれを維持しているようです (そんなに複雑ではないと思います) – 最新のリリースではまだ利用可能です

インストールされたスクリプトは、適切なマウントポイントを提供するように設定することができます (/etc/usbmount/usbmount.conf)

3  Pierz  2013-05-20


クワックキホーテの優れた除去方法を洗い流すために

先ほど作成した 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 イベントで自動的に表示されたり消えたりするようになります

3  chotchki  2010-10-30


Pysdmを試してみてはいかがでしょうか

2  Sathyajith Bhat  2009-10-29


etc/rc.local に su username -c gnome-volume-manager を入れてみてください。単に gnome-volume-manager を起動しているだけで十分かもしれません

編集: Ubuntuデスクトップでもgnome-volume-managerはデフォルトのディストリビューションの一部ではなくなったようです

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 パッケージもありますが、これはあなたが望むことをしますが、通常のオートマウンティングに干渉する可能性があります

2  Ryan C. Thompson  2009-10-11


quack quixoteさんのudevベースの解法について、私の編集した補遺が却下されたので、ここに載せておきます。まずは彼の投稿を参照してください

まず第一に、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>コマンドを簡単に発行することができるからです。ニーズに合わせて編集します 🙂

2  DanielSmedegaardBuus  2015-01-16


データを手動で入力する必要がないように、mountmanager で設定してみてください

ubuntuのリポジトリの一部になるはずです

1  Abhinav  2009-10-11


一度に1つのドライブしかマウントしていない場合は、/etc/fstabファイルにこれを編集してください。の行に沿って何かを書いてください

/dev/sdb1     /mnt/usbdrive     ext3     defaults 0   0

これにより、起動時にマウントされ、perms があれば誰でもアクセスできるようになるはずです。複数のドライブがある場合でも、これは

/dev/sdb1     /mnt/usbdrive1     ext3     defaults 0   0
/dev/sdc1     /mnt/usbdrive2     ext3     defaults 0   0

-5  Jack M.  2009-10-30


タイトルとURLをコピーしました