デスクトップ環境がなくても、/ media / <LABEL>にリムーバブルメディアを自動的にマウントする方法


7

私はDebianのsidシステム(Wheezy)を持っています(そしてarchについても同じ質問です)。

SDカード、USBメモリ、外付けHDDをmount / umountで手動でマウントすることができます。 /etc/fstab しかしこれは説得力があり、制限的です。 /media/<LABEL> それぞれが異なるデバイス <LABEL> 独自のエントリが必要です <LABEL> ディレクトリを手動で作成/削除する必要があります。 /media/ 同様に)。

だから、それらを自動的にマウントするための最良の方法は何ですか /media/<LABEL> 挿入時(そしてそれらが抜かれたらすぐにそれらをファイルシステムからアンマウントするため)?

理想的な解決策は次のようになります。

  1. リムーバブルメディアがプラグインされたことを検出する /dev/ として sdaxsdbx…… udev
  2. にディレクトリを作成する /media/ ラベル(リムーバブルメディアのラベル)に従って
  3. ディレクトリにマウントする /media/<LABEL> RWモードで(ファイルシステムがサポートされている場合)
  4. メディアが取り外されたかどうかを検出
  5. もしそうなら、ファイルシステムからそれをunmout
  6. から対応するディレクトリを削除します。 /media/

(キャッシングのためにホットプラグを抜いたときにデータが失われないように、デバイスは同期モードでマウントする必要があります。)

私はいくつかの情報を見つけました autofsHALudisksudisks2しかし、どれが廃止予定か推奨されているのかは明確ではありません。とにかく、これを行うために私のシステムで簡単に設定する方法を考え出していません...

ミニマリズム、優雅さ、KISS、気の利いた、忍耐強いXMLポリシーファイルがない、そして最新の高い評価を受けています。

編集: 私の質問をもっと明確にしようとしている


に質問を投稿しました unix.stackexchange.com/questions/44454 、もう少し答えがあるかもしれませんが、ここから削除する必要があるかどうかわかりませんか。
cedbeu

あなたは異なるサイトで同じ投稿をしました。
Francisco Tapia

回答:


3

わかりました、それは長い時間でした、しかし私は今のところ私が見つけた最もよい選択と私の質問にまだ答えます。

最善の方法は、 udev いくつかのスクリプト(ディレクトリを作成/削除し、リムーバブルデバイスをマウント/アンマウントする)に関連付けられ、 partition udev デバイスイベントタイプ。

1 - 追加/削除スクリプトの作成

このスクリプトを追加 storage-automount.sh/lib/udev/ 実行可能に設定します( sudo chmod +x /lib/udev/storage-automount.sh ):

#!/bin/sh

# set the mountpoint name according to partition or device name
mount_point=$ID_FS_LABEL
if [ -z $mount_point ]; then
    mount_point=${DEVNAME##*/}
fi

# if a plugdev group exist, retrieve its gid set & it as owner of mountpoint
plugdev_gid="$(grep plugdev /etc/group|cut -f3 -d:)"
if [ -z $plugdev_gid ]; then
    gid=''
else
    chown root:plugdev $mount_point
    gid=",gid=$plugdev_gid"
fi

# create the mountpoint directory in /media/ (if not empty)
if [ -n $mount_point ]; then
    mkdir -p /media/$mount_point
    # other options (breaks POSIX): noatime,nodiratime,nosuid,nodev
    mount -t $ID_FS_TYPE \
      -o rw,flush,user,uid=0$gid,umask=002,dmask=002,fmask=002 \
      $DEVNAME /media/$mount_point
fi

このスクリプトを追加 storage-autounmount.sh/lib/udev/ 実行可能に設定します( sudo chmod +x /lib/udev/storage-autounmount.sh ):

#!/bin/sh

# set the mountpoint name according to partition or device name
mount_point=$ID_FS_LABEL
if [ -z $mount_point ]; then
    mount_point=${DEVNAME##*/}
fi

# remove the mountpoint directory from /media/ (if not empty)
if [ -n $mount_point ]; then
    umount -l /media/$mount_point
    rm -R /media/$mount_point
fi

2 - を作成する udev これらのスクリプトをイベントに添付する規則

そして最後に、 udev 支配する /etc/udev/rules.d、 例えば 85-storage-automount.rules

ENV{DEVTYPE}=="partition", RUN+="/lib/udev/storage-automount.sh", ENV{REMOVE_CMD}="/lib/udev/storage-autounmount.sh"

以上です。

今、あなたがストレージデバイスを接続すると、ディレクトリが /media/ パーティション名に従って(私は覚えていませんが、NTFSパーティションでも動作していると思います)、パーティションはそこにマウントされます。あなたが持っていればそれはユーザーのためのR / Wです。 plugdev システム上でグループ化します。また、デバイスは、ホットプラグを抜いた場合のデータ損失のリスクを抑えるために同期モードでマウントされています。

デバイスが削除されると、それはマウント解除され、ディレクトリは /media

また、監視するためのツール udev イベントは udevadm monitorのようなオプションで --env または --property

$ udevadm monitor --env

これはDebianとArchの両方でテストされ、うまく機能していますが、おそらく依存しているすべてのディストリビューションでうまくいくでしょう。 udev


1

あなたはあなたのをチェックしたいかもしれません /dev/disk/by-uuid これらの特定のドライブがプラグインされている間、ディレクトリ。を使う ls -l デバイスが表示されます(例: /dev/sdb1 彼らのuuidsと一緒に)。一致が見つかったら、更新してください /etc/fstab それに応じて、交換 /dev/sd* 対応する /dev/disk/by-uuid/* エントリ。

詳細については、私の答えを参照してください スリープからの復帰後にUSBフラッシュドライブが新しい​​Linuxデバイス名を取得しないようにする方法を教えてください。


1
実際に、私が言ったように、デバイスは接続されています、私はどちらかを通して彼らのUUID / LABELを知っています blkid または /dev/disk/by-uuid ディレクトリ。手動でマウントすることもできます。今、私はすでにそれらを持っています /etc/fstab、実際に食べる label またはによって UUID両方とも正常に動作します。ブート時にのみマウントされるので(それは私が指定しない限り)、それは実際には役に立ちません。 noauto )しかし、それらを削除してシステムの実行中にそれらを挿入した場合、それらはで指定したディレクトリに自動的にアンマウント/マウントされません。 fstab...これは私の問題です。
cedbeu

私は取り外し可能なものに長年使用しているので、奇妙なもののように見えます(例:私のカメラのSDカード、MP3プレーヤーのようなモバイル機器、スマートフォン、タブレット...あなたは前にアンマウントし、そして再び挿入するときに再びマウントしますか?そうするべきです、そしてそれはそれでうまくいくはずです。
Izzy

1
それらをアンマウントして手動でマウントすれば、明らかにすべてうまくいきます。しかし、私の問題はそれらをアンマウントしてほしいということです( sync オプションイン fstab )それらをマウント 自動的に (そして user と同様 root 私はそれらを削除/挿入するとき。だから私はどちらかと思います AutoFSHALudisksudisks2 (または hotplug、たぶん…?
cedbeu

おそらく手動でマウント解除しなければならないことを見逃しているのでしょうか。おおまかに言って、一旦あなたがそれを抜いたならば、それはもうsyncされることができず、そしてどちらもきれいにアンマウントされない。だからシステムはいくつかのドライブエラーを想定しています - しかし多くの場合 "古いドライブ"を捨てるだけです 後に もう一度「新しいドライブ」に接続しました。そのため、自動マウントでは、古いマウントポイントがまだ使用されています。これにより、「新しい」ドライブが別の場所にマウントされます。
Izzy

のようなホットプラグ/アンプラグシステム hal (特に言及されているように)それがもう接続されていないなら、fsのデバイスをアンマウントするように気をつけるべきです。の sync オプションイン /etc/fstab この場合、ホットプラグを抜くときにデータが失われることはありませんが(手動でマウント解除する前に)、キャッシュを使用せずにデバイスのファイルを同期するために使用されます。
cedbeu

0

あなたのヒントをありがとう。私はあなたのマウントとアンマウントのスクリプトをこのように単純化しました:

マウント:

#!/bin/sh

udisks --mount $DEVNAME

アンマウント:

#!/bin/sh

udisks --unmount $DEVNAME

私の/etc/udev/rules.d/ファイルは次のようになっています。

# UDISKS_FILESYSTEM_SHARED
# ==1: mount filesystem to a shared directory (/media/VolumeName)
# ==0: mount filesystem to a private directory (/run/media/$USER/VolumeName)
# See udisks(8)
ENV{ID_FS_USAGE}=="filesystem|other|crypto",       ENV{UDISKS_FILESYSTEM_SHARED}="1"
ENV{DEVTYPE}=="partition", RUN+="/lib/udev/storage-automount.sh",     ENV{REMOVE_CMD}="/lib/udev/storage-autounmount.sh"

それは簡単で典型的なユースケースであるべきです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.