web-dev-qa-db-ja.com

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

私は、Debian sidシステム(Wheezy)(Archでも同じ)を使用していますが、デスクトップ環境はありません(Xorgはまったくありません)。

mount/umount/media/の適切なエントリを使用して、SDカード、USBスティック、外付けHDDをラベルで/etc/fstabの指定したディレクトリに手動でマウントできます、またはブート時に自動的に、しかしこれは魅力的であり、私のニーズに十分に限定的で動的ではありません:/media/<LABEL>にマウントしたい場合、異なる<LABEL>の各デバイスには独自のエントリが必要です、および各<LABEL>サブディレクトリは、/media/でも手動で作成/削除する必要があります)。

だから、それらをマウントする最良の方法は何ですか自動的に挿入時に/media/<LABEL>(そして、それらが取り外されるとすぐにそれらをファイルシステムからアンマウントしますそれがデータにとってどれほど危険であるかに関係なく)?

理想的なソリューションは:

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

(キャッシュのためにホットプラグを抜いたときのデータ損失を避けるために、デバイスは明らかに同期モードでマウントする必要がありますedit:syncは- vfatリムーバブルメディアには大きすぎる so flush妥協案として作成されたsyncよりも安全性が低いが、フラッシュメモリのライフサイクルに応じてリスクが少ない)

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

18
cedbeu

わかりました。久しぶりですが、今のところ見つけた最良の選択肢で質問に答えます。要約すると、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に依存するすべてのディストリビューションで動作する可能性があります。

2
cedbeu

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」へのシンボリックリンクを使用することです。

  • "/ media/usb"シンボリックリンクはudevによって作成され、ユーザーにUSBストレージデバイスパーティションの概要を示します
  • AutoFSは、/ media/usbを使用してパーティションをオンデマンドで自動マウントします。
  • スクリプト化された「auto.usb」ファイルを使用すると、あらゆる種類のファイルシステムをサポートでき、さらにあらゆる種類の命名スキームもサポートできます。
  • このアプローチは、複数のパーティションが異なるファイルシステムタイプを使用している場合でも、複数のパーティションを持つUSBスティックをサポートします。
2
Ingo Blackman

ArchWiki Udevページ を参照してください。 Udevルールから、またはUdevルールによって実行されるスクリプトからmountを実行することは想定されていません。

ただし、 dev-media-automount プロジェクトに示されているように、UdevルールからSystemdユニットを呼び出して、マウントを行うスクリプトを呼び出すことで、これを行うのは非常に簡単です。 udisks2や他のソリューションとは異なり、udev-media-automountは、デスクトップ環境または「ユーザーセッション」が存在するのを必ずしも待たずにrootユーザーとして何かをマウントしたいという単純なケースを対象としています。それはまさにOPが求めているもののようであり、私はそれが機能的で理解しやすいと感じました。

1
Metamorphic

私はかなり遅いと思いますが、誰かがそれを必要とする場合はこれを投稿します:(また、私の最初の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>

0
Peter