web-dev-qa-db-ja.com

デスクトップ環境なしで、挿入時にリムーバブルメディアを/ media / <LABEL>に自動的にマウントするにはどうすればよいですか?

デスクトップ環境がない(Xorgがまったくない)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. rWモードでディレクトリ/media/<LABEL>にマウントします(ファイルシステムがサポートされている場合)
  4. メディアが抜かれているかどうかを検出する
  5. その場合は、ファイルシステムからマウスを外します
  6. 対応するディレクトリを/media/から削除します

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

autofsHALudisksudisks2などに関する情報を見つけましたが、どちらが非推奨または優先されるかは不明であり、とにかく、私は今まで、それを行うために私のシステムでそれらを簡単に構成する方法を理解していません...

ミニマリズム、エレガンス、KISS、* nix-minded、クレイジーで耐えられないXMLポリシーファイルはなく、最新のものが高く評価されています。

編集:私の質問をより明確にしようとしています

8
cedbeu

さて、久しぶりですが、今のところ見つけた最良の選択肢で質問に答えます。

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

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ルールの作成

最後に、/etc/udev/rules.dudevルールを追加します(例:85-storage-automount.rules)。

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

以上です。

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

デバイスが削除されると、マウントが解除され、ディレクトリが/mediaから削除されます。

また、udevイベントを監視するツールはudevadm monitorで、--env--propertyなどのオプションがあります。

$ udevadm monitor --env

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

4
cedbeu

これらの特定のドライブが接続されている間に、/dev/disk/by-uuidディレクトリを確認することをお勧めします。 ls -lを使用すると、デバイス(/dev/sdb1など)とそのUIDが表示されます。一致するものが見つかったら、それに応じて/etc/fstabを更新し、/dev/sd*を対応する/dev/disk/by-uuid/*エントリに置き換えます。

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

1
Izzy

ヒントをありがとう。マウントスクリプトとアンマウントスクリプトを次のように簡略化しました。

マウント:

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

これは単純であり、典型的なユースケースであるはずです。

0
Max Power