ユーザーがログインせずに起動時に外部ドライブを/ media / LABELに自動的にマウントしますか?


73

この質問は似ていますが、私が望むものの反対です。外部USBドライブを起動時に自動的にマウントし、だれもログインせずになどの場所にマウントしたい/media/<label>

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

ドライブがMPDなどにアクセス可能になり、SSHでログインしたときに使用可能になるようにします。 gnome-mountGnomeグラフィカルセッションにローカルでログインしている場合にのみ、物をマウントするようです。


4
すばらしい質問です。あなたに答えがあればいいのに、今はこれがどのように解決されるのか興味があります。
反転

1
回答を更新しました。
ライアントンプソン

1
記録的には、すでに行っているようにGnomeのインストールに問題はありませんが、ヘッドレスGUIレスサーバーのソリューションが最適です。
エンドリス

1
ARRRGHH ...私の答えのバグ。ランで。 /usr/local/sbin/udev-automounter.sh mount %kする必要があります/usr/local/sbin/udev-automounter.sh %k。ごめんなさい。
いんちきキホーテ2009年

1
OK、Update-3の時点では、スペースで動作します。これは、スペースをに変換する<LABEL>の「エンコードされた」バージョンを使用して行われます\x20。きれいではありませんが、機能します。udevはlabels-with-spacesをうまく処理していませんが、\x20'sの代わりにアンダースコアを使用する別のオプションがあります(少なくとも見栄えが良い)。スペース処理はシェルスクリプトに入れなければならないように見えます。
いんちきのキホーテ2009年

回答:


74
  • Ubuntu Server 11.10に関する注意:このスクリプトは、廃止されたvol_idコマンドが原因でUbuntu Server 11.10で失敗します。 vol_idはに置き換えられましたblkid。スクリプトを修正するには、スクリプトの「vol_id」を「blkid -o udev」に置き換えudev-auto-mount.shます。

私はこれについてしばらく頭を動かしてきましたが、実用的な解決策を見つけたと思います。これはDebianベースのシステムで開発およびテストされているため、Ubuntuでも動作するはずです。他のシステムにも同様に適応できるように、この仮定を指摘します。

  • プラグインにUSBドライブを自動的にマウントします。Firewireに適応するのにそれほど時間はかかりません。
  • UDEVを使用しているため、HAL / DeviceKit / GNOME-Anythingを使用することはありません。
  • /media/LABELデバイスをマウントするディレクトリを自動的に作成します。

  • ただし、他の自動マウンターと干渉する可能性があります。私はそれをテストすることはできません。Gnome-VFSがアクティブな場合、両方がマウントを試行する可能性があります... Gnome-VFSがマウントに失敗すると、デスクトップアイコンが構成されない可能性があります。Gnomeからのマウント解除は可能ですが、必要なgksudo場合もあれば同様の場合もあります。

システムの起動時にこれをテストしていませんが、システムがマウントの準備ができる前にUSBドライブをマウントしようとした場合に動作しない可能性があることがわかります。その場合は、おそらくマウントスクリプトをさらに微調整する必要があります。(私は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(および/lib/udev/rules.dKarmicで)保持され、数値順に処理されます。番号で始まらないファイルは、番号付きファイルの後に処理されます。私のシステムでは、HALルールはというファイルに格納されているため、HALに到達する前に90-hal.rulesルール89-local.rulesが処理されるようにルールを設定します。主に、これらのルールがの後に発生することを確認する必要があります60-persistent-storage.ruleslocal.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にそれをエスケープするように説得していないので、マウントスクリプトにそれを処理させます。

    この環境変数およびその他の環境変数は、vol_idコマンド(非推奨)を使用して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デバイスの親と一致するため、ここで使用します。対象のデバイスは、実際にはSUBSYSTEM == "scsi"になります。親USBデバイスと照合することにより、プログラムを内部ドライブに追加することを回避できます。

  4. RUN+="..."-一致ではなくアクション:このプログラムを実行するプログラムのリストに追加します。プログラムの引数で%k、デバイス名に展開され(例:sdc1not /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、それはdeviceにあり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 monitorman 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はデバイス名のみを送信します。

起動時にドライブのマウントに問題がある場合sleep 60は、このスクリプトに長い時間を設定して、スクリプトがドライブのマウントを試みる前にシステムが完全に起動するようにします。

チェック方法(psWebサーバーが実行されているかどうかを確認するための実行方法)についてはコメントで提案していますが、システムに合わせて調整することをお勧めします。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つのスクリプト。これは、デバイスをアンマウントし、マウントポイントディレクトリを削除するだけです。これを行う権限があると想定しているため、で実行する必要があります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

3
あなたは素晴らしい!:)
kolypto 2009年

1
auto-mount.shを手動で実行すると動作しますが、起動時ではなくドライブを接続した場合は動作しません。:/
エンドリス

そのため、問題はUDEVルールにあります。lemmeは、デバッグに役立つようにそのセクションを少し拡張します。
いんちきのキホーテ2009年

3
すべてのスクリプトをgithubでアセンブルしました:github.com/fatso83/Code-Snippets/tree/master/system-utils / ... これらはUbuntu 10.10で正常に動作し、自動アンマウントも含みます
-oligofren

1
参照:udev_237-man udev(Ubuntu_18.04)systemd-udevd.serviceにデフォルトのサンドボックスが適用されるため、ネットワークにアクセスしたり、ファイルシステムをマウント/アンマウントするプログラムの実行はudevルール内では許可されないことに注意してください。ソース:unix.stackexchange.com/questions/200194/...解決のために、見ていserverfault.com/questions/766506/...を
プロのバックアップ

9

他の人がネットについて提案している最後のオプションの1つはですがivman、これはに依存しpmountているようです。 pmount放棄され、ivmanほぼ同じです。

の代替ivmanhalevtであり、Karmicで利用可能です。これは、再実装ですivman(「読む」:「維持」および「pmountに依存しない」)。このパッケージはJauntyでは利用できませんが、アップグレードする予定がない場合は自分でビルドできる場合があります。

これらのツールはどちらもDBusおよびHALレイヤーの上にあり、それらからのイベントに応答します。どうやら両方ともシステムデーモンとして、またはユーザーセッションマウントマネージャー(Gnome-VFSとして)のいずれかとして実行できます- /etc/defaults/{ivman,halevt}ファイルはシステム設定を担当しています。

マウントポイントivmanを使用するように微調整するための手順次に示します/media/<LABEL>。それhalevtはそれを行うためのより簡単な方法を持っている可能性が高いですが、おそらく彼らはあなたが答えを見つけるのを助けるでしょう。


HALEVTの使用

更新:私のUDEVの回答では得られない自動魔法のCDマウントを取得するために、私はさらに詳しく調べましたhalevt。このブログ投稿は、プロセスについて多くを説明するのに役立ちました。halevtDebian Lenny用に自分のパッケージをコンパイルする必要がありました(残念ながら、すべての依存関係はlenny-backportsセクションにありました)。インストールすると、プロセスはほとんど恐ろしくありませんでした:

  1. システムhalevt-daemonが有効になっていることを確認します /etc/default/halevt
  2. システムhalevtユーザーがデバイスをマウントできる/etc/PolicyKit/PolicyKit.confようにします(以下を参照してください; ソース
  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"

ステップ1

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

ステップ2

で、セクション/etc/PolicyKit/PolicyKit.confにこれ追加し<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、これを追加の内側 `セクション:

<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マウント置換をセットアップすることに関するものなので、彼のサンプル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・デーモンを停止するには、これを追加します。

/etc/init.d/halevt stop

では/etc/gdm/PostSession/Default、システムhalevt・デーモンを再起動するためにこれを追加します。

/etc/init.d/halevt start

3
2013年にこれを読んでいる人は、HALが非推奨になったことを知っているはずです。また、上記のような一風変わったキホーテのようなudevベースのソリューションに頼るべきです。
オリゴフレン

6

時間が経つにつれて、簡単なソリューションが表示されます。

このソリューションは、この目的のために作成されたudevilソフトウェアパッケージに依存しており、udevルールをいじる必要はありません。おそらく簡単な解決策として(新しいユーザーや古いユーザーよりも)望ましいでしょう。

devmonudevilからのスクリプトは、udevとglibにのみ依存しながら、すべての魔法を実行します。初期設定を必要とせずに、ほとんどすぐに使用できます。

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

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

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


3

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

1
ありがとう。これは私が達成したかった最も簡単な方法でした。ntfsボリュームを使用してUbuntu Server 16で作業したこともあります
ChrisPrime

3

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

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


1
ただし、構成ファイルのラベルのリストに入力しない限り、Usbmountはラベルでマウントできません。
ジル14年

1
リストを維持せずにusbmountにラベルにマウントを追加する場合は、postesite.ch/2014/04/11/…を参照してください。
オリバーサウダー14

3

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イベントで自動的に表示および非表示になります。


私はそうあるif [ -n "$device_is_mounted" ]; thenべきだと思いますif [ -z "${MOUNTPT}" ]; thenか?
共振14年

2

あなたはPysdm試してみたいかもしれません


それは単なる別のfstabエディターですよね?
エンドリス

はい、しかし、「それはまた、ストレージ・デバイスの動的構成のためのudevルールを作成することができます」
Sathyajith Bhatさんは

「udevルールの作成」は何らかの形で役立ちますか?それがどういう意味なのか、私にはわかりません。ユーザーがローカルにログインせずに、以前は不明だったリムーバブルデバイスをマウントしますか?
エンドリス

申し訳ありませんが、udevルールに関する手がかりはありません。あなたはfredericiana.com/2006/03/15/writing-udev-rules-short-notesreactivated.net/writing_udev_rules.htmlを
サティアジスバート

2

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

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


不明なコマンド「gnome-volume-manager」。私はUbuntu Jauntyにいます。
エンドリス

/ usr / lib / gnome-volume-manager / gnome-volume-managerがありますが、何もしません。
エンドリス

ああなるほど。gnome-volume-managerというパッケージもあります。関連:crunchbanglinux.org/forums/topic/239/...
endolith

gnome-volume-managerはHALを使用して物事をマウントするように見えますか?そして「2009年現在、HALはDeviceKitを支持して廃止予定です。」Linuxのすべてが常にこのようになっているのはなぜですか?彼らは何かをほぼ正しく動作させ始め、それを外に出し、動作しない新しいものに置き換えます。
エンドリス

pmountはもう機能しません。> pmountは/ dev /ディスク/バイ・ラベル/ STORAGEエラー:デバイス/ dev / sdc1などを除去することはできないが togaware.com/linux/survivor/Using_Gnome_Volume_Manager.html
endolith

2

quack quixoteのudevベースのソリューションに関する私の編集した補遺は拒否されたので、ここに掲載します。最初に彼の投稿を参照してください。

あなたは時にudevのルールが行動したい場合はまず、任意のデバイスが(USB、FireWireの、とeSATAの両方を含んでいる)SCSIサブシステムを介して結合している、とudevのルールでのサブシステムの一致を変更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>コマンドを簡単に発行できるからです。ニーズに合わせて編集します:)


このスクリプトをどのように実行しますか?halevt現在のapt-getバージョンの最新のパッケージではないようです。
キャンプベル

ああ...たぶん、もし私がクワックキホーテのTOP / Accepted Answerエントリーをたどれば...ここでより完全な答えを持っているのはまだいいだろう:)
Campbeln

1

データを手動で入力する必要がないように、mountmanagerを使用して構成してみてください。

これは、ubuntuリポジトリの一部である必要があります。


ユニバースセクションを有効にする必要があります。
いんちきのキホーテ

apt:mountmanager?section = universe;)
エンドリス

それはちょうど私のためにfstabを設定するつもりですか?
エンドリス

@endolith:apt:universe?install = mountmanagerはもっと論理的ではないでしょうか?;)
ボビー

そのフォーマットは機能しますか?manpages.ubuntu.com/manpages/karmic/en/man8/apturl.8.html
endolith

-5

一度に1つのドライブのみがマウントされている場合、これを/etc/fstabファイルに編集するだけです。以下の線に沿ったもの:

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

これにより、起動時にマウントされ、権限を持つすべてのユーザーがアクセスできるようになります。複数のドライブがある場合でも、次の方法でこれを実行できます。

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

6
明らかに質問が尋ねるものではありません。
いんちきのキホーテ2009年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.