デスクトップ環境がない(Xorgがまったくない)Debian sidシステム(Wheezy)(およびArchについても同じ質問)があります。
SDカード、USBスティック、外付けHDDは、mount/umountを使用して、/etc/fstab
の適切なエントリを使用して手動でマウントできますが、これは説得力があり、制限があります。/media/<LABEL>
にマウントする場合異なる<LABEL>
を持つ各デバイスには独自のエントリが必要であり、各<LABEL>
ディレクトリも/media/
で手動で作成/削除する必要があります)。
では、挿入時に/media/<LABEL>
に自動的にマウントする(そして、プラグを抜くとすぐにファイルシステムからアンマウントする)ための最良の方法は何ですか?
理想的な解決策は次のとおりです。
/dev/
にsdax
、sdbx
、...によってudev
として追加されます)/media/
にディレクトリを作成します/media/<LABEL>
にマウントします(ファイルシステムがサポートされている場合)/media/
から削除します(キャッシュのためにホットプラグを抜いたときにデータが失われるのを防ぐために、デバイスは明らかに同期モードでマウントする必要があります)
autofs
、HAL
、udisks
、udisks2
などに関する情報を見つけましたが、どちらが非推奨または優先されるかは不明であり、とにかく、私は今まで、それを行うために私のシステムでそれらを簡単に構成する方法を理解していません...
ミニマリズム、エレガンス、KISS、* nix-minded、クレイジーで耐えられないXMLポリシーファイルはなく、最新のものが高く評価されています。
編集:私の質問をより明確にしようとしています
さて、久しぶりですが、今のところ見つけた最良の選択肢で質問に答えます。
最良の方法は、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
ルールの作成
最後に、/etc/udev/rules.d
にudev
ルールを追加します(例: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
に依存するすべてのディストリビューションで機能します。
これらの特定のドライブが接続されている間に、/dev/disk/by-uuid
ディレクトリを確認することをお勧めします。 ls -l
を使用すると、デバイス(/dev/sdb1
など)とそのUIDが表示されます。一致するものが見つかったら、それに応じて/etc/fstab
を更新し、/dev/sd*
を対応する/dev/disk/by-uuid/*
エントリに置き換えます。
詳細については、 スリープから復帰した後にUSBフラッシュドライブが新しいLinuxデバイス名を取得しないようにするにはどうすればよいですか? に対する私の回答を参照してください。
ヒントをありがとう。マウントスクリプトとアンマウントスクリプトを次のように簡略化しました。
マウント:
#!/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"
これは単純であり、典型的なユースケースであるはずです。