web-dev-qa-db-ja.com

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

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

面倒で面倒なこともありますが、すべてのデータをfstabに入力する必要はありませんが、プラグインするものや将来パーティションがどのように変わるか予測できないためです。

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

72
endolith
  • 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の参照


背景(UDEV?Whuzzat?)

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

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

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

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

Udevのルール

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>で識別してから、この情報をマウントを実行するスクリプトに渡します。具体的には、この規則は一致しています。

  1. 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
    
  2. ACTION=="add" - addイベントにのみ一致します...

  3. SUBSYSTEMS=="usb" - USBバス上にあるデバイスだけに一致します。ここではSUBSYSTEMSを使用しています。これは私たちのデバイスの親に対して一致するからです。私たちが興味を持っているデバイスは実際にはSUBSYSTEM == "scsi"です。親のUSBデバイスと照合することで、内蔵ドライブにプログラムを追加することを避けられます。

  4. 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つのスクリプト...


これが最初のスクリプトです。実行するプログラムは短時間で完了する必要があるため、これは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
73
quack quixote

他の人がネットで提案している最後の選択肢の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にはもっと簡単な方法があるようですが、おそらくそれらはあなたが答えを見つけるのを手助けするでしょう。


HALEVTを使った作業

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

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

新しい設定をチェックするためにHALデーモンとHALEVTデーモンを再起動する必要がある場合は、これを使用して正しい順序でそれらを取得します。

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

ステップ1

START_DAEMON=yes/etc/default/halevtを確認してください。

ステップ2

/etc/PolicyKit/PolicyKit.confで、これをinside<config></config>セクションに追加します。

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

ステップ3

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

ステップ4

スクリプトは良いですが/bin/bashを実行する必要があります。 /bin/dashが呼び出されるとき、実際には/bin/shを使用するシステムもあります。スクリプトの一番上の行を変更して、正しい行が表示されるようにします。

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

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

ステップ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>

ステップ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

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

このソリューションは、この目的のために書かれた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

6
Costin Gușă

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

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

3
Pierz

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

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イベントで消えます。

3
chotchki
2
Sathyajith Bhat

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パッケージもあります。これはあなたが望むことを行いますが、通常の自動マウントを妨げる可能性があります。

2
Ryan Thompson

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リポジトリの一部であるべきです。

1
Abhinav