Linuxでの完全な自動マウントソリューションのためのudev、udisks、autofs、通知設定に必要なアドバイス

Linuxでの完全な自動マウントソリューションのためのudev、udisks、autofs、通知設定に必要なアドバイス

続けるLinuxに接続されたデバイスを自動的にマウント、それは仕事が少し簡単になります。 Gentooを実行するときは、autofs-5.0.4-r5を使用してラップトップにローカルおよびネットワークデバイスの組み合わせを自動的にマウントします。 autofsだけを実行すると、いくつかの問題が発生します。

  • 各デバイスのマウントポイントの名前を事前に定義する必要がありますが、時にはMMCカードリーダーを再起動した後、起動可能なUSBスティックの位置が切り替わります。
  • LABELベースの自動マウントポイントが表示されます。 autofsだけではAFAIKはこれを行うことはできません。

これがudevとudisksができることです。しかし:

  • デバイスが接続されたときにファイルシステムが自動的にマウントされたくありません。 LABELというゴーストマウントポイントを提供するだけです。

実際のファイルシステムのマウントは、autofsシャドウイングが機能するかのようにマウントポイントに初めてアクセスしたときにのみ発生する必要があります。これにより、誤ってデバイスのプラグを抜くことによってファイルシステムが汚れる危険性を減らすとともに、優れたアクセシビリティを提供する必要があります。

それ以外に、DEで何が起こっているのかを追跡できます。

  • すべての自動マウントの状態(緑色=何もインストールされていない、赤色=何かがインストールされている)を示すシステムトレイアプリはありますか?
  • たとえば、通知転送を使用してファイルシステム(アンマウント)マウント操作に関する通知を提供する展開に拘束されない方法はありますか? Gentooの場合はどうですか?私にとっても効果的です。 udevスクリプトを書くことはNFSとCIFSには役立ちません。そうですか?

この組み合わせは最終自動インストール設定でなければなりません。それとも何か抜けましたか?

答え1

これはすべて可能ですudev。見る都市航空交通局、これはあなたが言及したほとんどの問題を解決するようですが、実際にはする自動的にマウントされます。必要に応じて提供される優れた機能を利用できますが、メディアが自動的にマウントされないように変更できます。作成者に連絡して、自動化されていないインストール方法を新機能として提案することもできます。同時に、その機能の簡単な紹介は次のとおりです。

  • これはその上で動作し、udevDEを独立してイベントベースにします。 (また、検出できない可能性がある光学メディアの解決策も提案しますudev。)
  • MOUNTPOINT_TEMPLATES前述の命名問題を解決できるさまざまなカスタマイズを定義できます(参照:uam 構成ファイル)を使用することもできますLABEL(必要に応じて)。
  • 通知メカニズムがサポートされているため、DE固有の要件に合わせて調整するだけです。
  • 各タスクがどこで、いつ、どのように実行されるのかを簡単に見つけることができるように設計が明確であるようです。

答え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メモリースティックをサポートします。

関連情報