私は、Debian sidシステム(Wheezy)(Archでも同じ)を使用していますが、デスクトップ環境はありません(Xorgはまったくありません)。
mount
/umount
と/media/
の適切なエントリを使用して、SDカード、USBスティック、外付けHDDをラベルで/etc/fstab
の指定したディレクトリに手動でマウントできます、またはブート時に自動的に、しかしこれは魅力的であり、私のニーズに十分に限定的で動的ではありません:/media/<LABEL>
にマウントしたい場合、異なる<LABEL>
の各デバイスには独自のエントリが必要です、および各<LABEL>
サブディレクトリは、/media/
でも手動で作成/削除する必要があります)。
だから、それらをマウントする最良の方法は何ですか自動的に挿入時に/media/<LABEL>
に(そして、それらが取り外されるとすぐにそれらをファイルシステムからアンマウントしますそれがデータにとってどれほど危険であるかに関係なく)?
理想的なソリューションは:
sdax
、sdbx
、udev
によって/dev/
に追加されたとき)/media/
にディレクトリを作成しますRW
モード(flush
の場合)で、vfat
モードでディレクトリ/media/<LABEL>
にマウントします(ファイルシステムがサポートしている場合)。/media/
から対応するディレクトリを削除します(キャッシュのためにホットプラグを抜いたときのデータ損失を避けるために、デバイスは明らかに同期モードでマウントする必要がありますedit:sync
は- vfat
リムーバブルメディアには大きすぎる so flush
妥協案として作成された 、sync
よりも安全性が低いが、フラッシュメモリのライフサイクルに応じてリスクが少ない)
autofs
、HAL
、udisks
、udisks2
、usbmount
などに関する情報を見つけましたが、どれが非推奨または推奨されているか不明です、そしてとにかく、それを行うために自分のシステムでそれらを簡単に構成する方法を今まで理解していませんでした...
わかりました。久しぶりですが、今のところ見つけた最良の選択肢で質問に答えます。要約すると、udev
ルールを作成し、いくつかのスクリプトに関連付けて(ディレクトリを作成/削除し、リムーバブルデバイスをマウント解除/マウントする)、udev
デバイスイベントタイプ= partition
にアタッチします。
1-追加/削除スクリプトの作成
次のスクリプトstorage-automount.sh
を/lib/udev/
に保存し、実行可能にします(Sudo chmod a+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 it's 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 a+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
に依存するすべてのディストリビューションで動作する可能性があります。
pmount
を探していると思います。
挿入時に自動マウントが必要な場合は、 DebianでのUSBスティックの自動マウント を参照してください。
システムで disks2 を使用している場合は、リムーバブルストレージデバイスの挿入に対応するために推奨される方法です。 Udiskの設定のヒントについては Arch Wiki を参照してください。
それ以外の場合、新しいデバイスが表示されたときに反応するプログラムは dev であるため、自動マウントは devルール によってトリガーされます。 sbmount パッケージは、USBストレージデバイスやその他いくつかを自動的にマウントするudevルールを提供します。 udevルールからmount
を呼び出す Fuseファイルシステムでは機能しません (ntfs-3gなど)、必要に応じてudisksを使用します。
因果関係はそのように機能しないため、メディアが削除されたときに自動的にマウントを解除することはできません。メディアは、マウント解除する前に削除する必要があります。読み取り専用メディアの場合は、削除後にアンマウントしても問題ありませんが、突然消えたファイルシステムでファイルが開かれていると、一部のアプリケーションが混乱する可能性があります。書き込み可能なメディアの場合、マウントされたファイルシステムを取り外すと、データが破損する可能性があります。
ここに私が最近それをした方法があります、そして私は今このアプローチに非常に満足しています。これはUbuntu 12.04 + gentoo向けですが、udevとautofsをインストールできるディストリビューションであれば動作するはずです。
前提条件:udev + autofsをインストールしておく必要があります。
ステップ1)
次の「/etc/udev/rules.d/90-usbsd-auto.rules」ファイルを作成します(もちろん、「。rules」で終わる限り、任意の名前を使用できます)。 :
# Add symlink /dev/usbdisks/<label> to /dev/sd[a-z][1-9]
# if partition has a label
# Add symlink /media/usb/<label> to /media/autousb/<label>
# for automounter support
ACTION=="add", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}=="?*", \
SYMLINK+="usbdisks/$env{ID_FS_LABEL_ENC}", MODE:="0660", \
RUN+="/bin/rm /media/usb/$env{ID_FS_LABEL_ENC}", \
RUN+="/bin/ln -sf /media/autousb/$env{ID_FS_LABEL_ENC} /media/usb/$env{ID_FS_LABEL_ENC}"
# Fallback: If partition has a NO label, use kernel name (sd[a-z][1-9])
ACTION=="add", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}!="?*", \
SYMLINK+="usbdisks/%k", MODE:="0660", \
RUN+="/bin/rm /media/usb/%k", \
RUN+="/bin/ln -sf /media/autousb/%k /media/usb/%k"
# Some FileSystems emit a "change" event when they are unmounted.
# UDEV seems to delete the device symlink in this case :-(
# So we need to re-create it here
ACTION=="change", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}=="?*", \
SYMLINK+="usbdisks/$env{ID_FS_LABEL_ENC}", MODE:="0660"
# Fallback: If partition has NO label, use kernel name
ACTION=="change", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}!="?*", \
SYMLINK+="usbdisks/%k", MODE:="0660"
# When device is removed, also remove /media/usb/<label>
ACTION=="remove", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}=="?*", \
RUN+="/bin/rm /media/usb/$env{ID_FS_LABEL_ENC}"
# Fallback: If partition has no label, remove /media/usb/%k
ACTION=="remove", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}!="?*", \
RUN+="/bin/rm /media/usb/%k"
これは何をします: "/ dev/usbdisks/<...>"の下のUSBストレージデバイスパーティション用に2つのシンボリックリンクを作成します。ラベルがない場合は、USBストレージパーティションのラベルまたはカーネル名を使用します。 2番目のシンボリックリンクは、「/ media/usb/<...>」から「/ media/autousb/<...>」にリンクします。これは、オートマウンターのサポートのために行われます(ステップ2を参照)。
注:ID_FS_LABEL_ENC変数を使用するルールは当初は使用しませんでした。これは私の考えでは危険だからです。同じラベルを使用する2つのUSBスティックを接続するとどうなりますか?
しかし、ポスターは特にUSBディスクのラベルを使用したかったので、それに応じてルールを変更しました。
Udevがこれらのルールを確実に読み取るようにするには
Sudo udevadm control --reload-rules
このudevルールファイルを使用すると、USBストレージデバイスパーティションを自動マウントするようにすべてが設定されます。ただし、現時点では、デバイスは(意図的に)自動マウントされません。で使用すると自動マウントされます
ステップ2)
Autofsをautomount/media/autousb/<...>に設定します。「/ etc/auto.master」ファイルに次の行を追加しました(Ubuntu 12.04の場合):
/media/autousb /etc/auto.usb --timeout=60
これは、60秒間何も操作しないとAutoFSがデバイスをマウント解除することを意味します。あなたの好みに応じて、多かれ少なかれ使用したいかもしれません。
Gentooの場合、 "/ etc/autofs/auto.master"を変更する必要があるので、
/media/autousb /etc/autofs/auto.usb --timeout=60
次の内容で「auto.usb」を作成しました。
#!/bin/bash
key=${1}
fstype=$(/sbin/blkid -o value -s TYPE /dev/usbdisks/${key})
if [ "${fstype}" = "vfat" ] ; then
echo "-fstype=vfat,sync,uid=0,gid=plugdev,umask=007 :/dev/usbdisks/${key}"
exit 0
fi
if [ "${fstype}" = "ntfs" ] ; then
echo "-fstype=Fuse.ntfs-3g,sync,uid=0,gid=plugdev,umask=007 :/dev/usbdisks/${key}"
exit 0
fi
if [ "${fstype}" = "ext4" ] ; then
echo "-fstype=ext4,sync,nocheck :/dev/usbdisks/${key}"
exit 0
fi
exit 1
このauto.usbは実行可能である必要があるため、autofsはこれを(bash)スクリプトとして使用します。だから例えば
Sudo chmod 0755 /etc/auto.usb
これは何をしますか:このスクリプトはAutoFS(/ usr/sbin/automount)にusbストレージデバイスパーティションをマウントする方法を伝えます。
スクリプトは最初に「/ sbin/blkid」を使用して、パーティションにどのような種類のファイルシステムがあるかを調べます。
スクリプトは、デバイスパーティションに応じて適切なマウントオプションを提供します。
注:「vfat」(おそらくUSBスティックで最も一般的)、「ntfs」、および「xfs」ファイルシステムのサンプルコードを含めました。もちろん、これを拡張してより多くのファイルシステムをサポートするのは非常に簡単です。
ステップ3)オプション...「排出」== USBスティック(またはUSBスティック上のパーティション)をアンマウントするには、/ sbin/usbejectの下にスクリプトを作成します。
#!/bin/bash
killall -s SIGUSR1 /usr/sbin/automount
このスクリプトでは、「Sudo usbeject」を使用して、マウントされたすべてのUSBデバイスパーティションをアンマウントすることができます(automountにアンマウントするように指示します)。
もちろん、パーティションがどこでも使用されていないことを確認するだけです。その後、オートマウンタは60秒のタイムアウト後にパーティションをアンマウントします...
ここでの本当のトリックは、「/ media/usb」から「/ media/autousb」へのシンボリックリンクを使用することです。
ArchWiki Udevページ を参照してください。 Udevルールから、またはUdevルールによって実行されるスクリプトからmount
を実行することは想定されていません。
ただし、 dev-media-automount プロジェクトに示されているように、UdevルールからSystemdユニットを呼び出して、マウントを行うスクリプトを呼び出すことで、これを行うのは非常に簡単です。 udisks2や他のソリューションとは異なり、udev-media-automountは、デスクトップ環境または「ユーザーセッション」が存在するのを必ずしも待たずにroot
ユーザーとして何かをマウントしたいという単純なケースを対象としています。それはまさにOPが求めているもののようであり、私はそれが機能的で理解しやすいと感じました。
私はかなり遅いと思いますが、誰かがそれを必要とする場合はこれを投稿します:(また、私の最初のStackExchange回答)
多くの場所で解決策を確認した後、私はArch Wikiで簡単な解決策を見つけました:
Arch Wiki へのリンク。
Udisks2ルールを追加して、デフォルトのマウントディレクトリを/run/media/$USER/
から/media/<Label>
に変更できます。
次のルールを/etc/udev/rules.d/
に99-udisks2.rules
のような名前で追加します。
ENV{ID_FS_USAGE}=="filesystem|other|crypto", ENV{UDISKS_FILESYSTEM_SHARED}="1"
次に、自動マウント用に diskie のような単純なツールをインストールします。
/ etc/fstabファイルを編集してこれを行う方法を見つけました。単純なエントリは次のようになります。
/dev/sdb1 /media/robot/hdd1 ntfs defaults 0 0
<file system> <mount point> <type> <options> <dump> <pass>