web-dev-qa-db-ja.com

Linuxでの完全な自動マウントソリューションのudev、udisks、autofs、通知セットアップに必要な提案

続行 Linuxでプラグインされたデバイスを自動マウントする 、これは少し基本的なことを残しました。 Gentooを実行して、autofs-5.0.4-r5を使用してラップトップにローカルデバイスとネットワークデバイスの組み合わせを自動マウントしています。 autofsを単独で実行すると、いくつかの不満が生じます。

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

これは、udevとudisksが確かに実行できることです。だが:

  • デバイスを接続するときにファイルシステムが自動的にマウントされることを望まないので、LABELという名前のゴーストマウントポイントを教えてください

実際のファイルシステムのマウントは、autofsゴーストが機能するように、マウントポイントへの最初のアクセス時にのみ発生する必要があります。これにより、優れたアクセシビリティを提供しながら、誤ってデバイスを抜いてファイルシステムを汚すリスクを減らすことができます。

これに加えて、DEでは、何が起こっているのかを常に知ることができます。

  • すべての自動マウントのステータスを示すことができるシステムトレイアプリはありますか?つまり、緑=何もマウントされていない、赤=何かがマウントされていますか?
  • たとえばnotify-sendを使用して、ファイルシステムの(アン)マウント操作通知を提供する配布に依存しない方法はありますか? Gentoo固有についてはどうですか、それは私にも役立ちます。スクリプトudevはNFSとCIFSでは役に立ちませんよね?

このコンボは究極の自動マウントセットアップである必要がありますか、それとも何かが足りませんか?

9
lkraav

これはすべてudevで実行可能です。 [〜#〜] uam [〜#〜]を見てください。これは、ほとんどの問題に対処しているようです。言及しましたが、実際にはは自動的にマウントされます。必要に応じて、それが提供する優れた機能を利用できますが、メディアが自動的にマウントされないように変更してください。また、作者に連絡して、新しい機能として非自動マウントアプローチを提案することもできます。その間、その機能を簡単に見てみましょう。

  • udevの上で動作し、DEに依存せず、イベントベースになります。 (また、udevによって検出されない可能性のある光メディアの回避策も提案します。)
  • MOUNTPOINT_TEMPLATESを定義して、さまざまなカスタム方法で言及した命名の問題を解決できます( am.conf を参照)。また、LABELを使用することもできます(望ましい)
  • 通知メカニズムがサポートされているため、DE固有のニーズに合わせて通知メカニズムを調整する必要があります。
  • 明確なデザインのようで、各アクションがトリガーされる場所、時間、方法を簡単に見つけることができます。
4
rozcietrzewiacz

これが私が最近それをした方法です、そして私は今このアプローチに非常に満足しています。これはUbuntu12.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をセットアップして/ 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

この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ストレージデバイスパーティションが存在する簡単な概要を提供します
  • / media/usbを介して使用する場合、AutoFSはオンデマンドでパーティションを自動マウントします
  • スクリプト化された「auto.usb」ファイルを使用すると、あらゆる種類のファイルシステムをサポートでき、さらにあらゆる種類の命名スキームをサポートできます。
  • このアプローチは、これらのパーティションが異なるファイルシステムタイプを使用している場合でも、複数のパーティションを持つUSBスティックをサポートします。
2
Ingo Blackman