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

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

私はデスクトップ環境がまったくない(Xorgがまったくない)Debian sidシステム(Wheezy)(archと同じ)を持っています。

/media/mount/のタグを使用して、SDカード、USBスティック、外付けハードドライブを指定されたディレクトリに手動でマウントし、適切な項目を追加したり、umount起動時に自動的にマウントすることができますが、/etc/fstabこれは顕著な制限事項であり、静的で十分に動的です。ではありません。必要に応じて:/media/<LABEL>異なるデバイスを持つ各デバイスを<LABEL>インストールするには独自のエントリが必要です。各サブディレクトリも手動<LABEL>で作成/削除する必要があります。/media/

それでは、インストールする最良の方法は何ですか?自動的に存在する/media/<LABEL> 挿入するとき(そしてプラグを抜くとすぐにファイルシステムからマウントを解除します。どんなに危険なデータでも)?

理想的な解決策は次のとおりです。

  1. リムーバブルメディアが挿入されている場合の検出(例、、、/dev/...sdaxsdbxudev
  2. /media/そのラベル(リムーバブルメディアのラベル)に基づいてディレクトリを作成します。
  3. オプション(用)を使用してモードディレクトリにマウントします/media/<LABEL>RWファイルシステムがモードをサポートしている場合)。flushvfat
  4. メディアが取り外されたかどうかを検出
  5. その場合は、ファイルシステムからアンマウントします。
  6. そのディレクトリを削除/media/

(もちろん、キャッシュによるホットアンプラグ時のデータ損失を防ぐために、デバイスを同期モードでマウントする必要があります。編集する: syncはいvfatリムーバブルメディアに比べて多すぎるだからflush 妥協で作られた、それほど安全ではsyncありませんが、フラッシュメモリの寿命サイクルに応じてそれほど危険ではありません)

autofs、、、HALなどに関するいくつかの情報が見つかりudisksましたが、どちらが使用されなくなったか好まれるかはわかりませんでした。udisks2usbmount

答え1

探していると思います。pmount

接続時に自動的にインストールされるようにするには、次を参照してください。Debian の USB スティック自動マウント

システムで以下を使用する場合USB 2これは、リムーバブル記憶装置の挿入に反応する好ましい方法である。よりアーチスウィキUSBフラッシュドライブ構成のヒント。

それ以外の場合、新しいデバイスが表示されたときに反応するプログラムは次のとおりです。ウデブそのため、自動インストールは次のように行われます。udevルール。これUSBマウントパッケージは、USBストレージデバイスやその他のデバイスを自動的にマウントするudevルールを提供します。mountudevルールから呼び出されたFUSEファイルシステムでは機能しません。(例:ntfs-3g)、必要に応じてudiskを使用してください。

原因と結果がそのように機能しないため、メディアを取り外すとメディアを自動的にマウント解除できません。メディアをマウント解除する必要があります。今後削除されました。読み取り専用メディアの場合は、削除後にマウント解除できます。ただし、突然消えるファイルシステムに開いているファイルがある場合、一部のアプリケーションに混乱を招く可能性があります。書き込み可能メディアの場合、マウントされたファイルシステムを取り外すとデータが破損する可能性があります。

答え2

これが私が最近やってきたことで、今はこの方法に非常に満足しています。これは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"

機能:2つのシンボリックリンクを作成します。 1つは、「/dev/usbdisks/<...>」の下のUSBストレージデバイスパーティションです。ラベルがない場合は、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

つまり、AutoFSは60秒間アクティビティがないとデバイスをマウント解除します。好みによっては、より少ないか、より多くの使用が必要になる場合があります。

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

autofsがこれを(bash)スクリプトとして使用するには、このauto.usbを実行できる必要があります。例えば

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デバイスパーティションをマウント解除できます(自動マウントにマウント解除するように指定)。

もちろん、パーティションがどこでも使用されていないことを確認できます。自動マウントは、60秒のタイムアウト後にパーティションをマウント解除します。

ここで本当の秘訣は、「/media/usb」から「/media/autousb」へのシンボリックリンクを使用することです。

  • "/media/usb"シンボリックリンクは、ユーザーにどのUSBストレージデバイスパーティションがあるかについての簡単な概要を提供するためにudevによって作成されます。
  • /media/usbを介してパーティションを使用すると、AutoFSは要求に応じてパーティションを自動的にマウントします。
  • スクリプト化された "auto.usb"ファイルを使用すると、あらゆる種類のファイルシステムをサポートできるだけでなく、あらゆる種類の命名スキームもサポートできます。
  • この方法は、パーティションが異なるファイルシステムタイプを使用している場合でも、複数のパーティションを持つUSBメモリースティックをサポートします。

答え3

まあ、長い時間が経ちましたが、今まで見つけた最高のオプションで私の質問に答えます。要約すると、ルールを作成し、それをいくつかのスクリプト(ディレクトリの作成/削除およびリムーバブルデバイスのマウント解除/マウント)に関連付け、type =を使用してデバイスイベントudevに接続します。udevpartition

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これらのスクリプトをイベントに関連付けるルールの作成

最後にに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パーティションでも機能するようです)、そのディレクトリにパーティションがマウントされます。plugdevシステムにグループがある場合、ユーザーはグループを読み書きできます。また、これらのデバイスは、ホットプラグ時にデータ損失のリスクを制限するために同期モードでインストールされます。

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

また、イベントを監視するためのツールは、次のオプションと一緒にまたはudevです。udevadm monitor--env--property

$ udevadm monitor --env

これはテスト済みで、DebianとArchでうまく機能しますが、すべての依存関係に適用できますudev

答え4

かなり遅いようですが、必要な人がいれば投稿します。 (私の最初のStackExchangeの答えでもあります。)

いくつかの場所で解決策を見つけた後、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"

その後、次の簡単なツールをインストールできます。ウディスキー自動マウントに使用されます。

関連情報