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


17

Debian sidシステム(Wheezy)(およびarchでも同じ)があり、デスクトップ環境はありません(Xorgはまったくありません)。

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

それで、挿入時に自動的にそれらをマウントするための最良の方法は何ですか(そして、それらがデータにとってどれだけ危険であるにもかかわらず、プラグを抜かれたらすぐにファイルシステムからアンマウントする)?/media/<LABEL>

理想的なソリューションは次のとおりです。

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

(デバイスが原因キャッシュのプラグを抜か熱い時に任意のデータの損失を避けるために、oviously同期モードでマウントする必要があります:編集は syncある方法があまりにも多くのためのvfatリムーバブルメディアので、flush 妥協案として作成された、以下より安全なsync生活によると、しかし、リスクが少ないです-フラッシュメモリのサイクル)

私は約いくつかの情報見つけautofsHALudisksudisks2usbmountなどが、それは1つが非推奨または好ましく、とにかく、私は今まで、それを行うには私のシステムで簡単にそれらを構成する方法を考え出したていないされて不明です...


最初に、同様の質問を検索しましたか?すでに聞かれたことを覚えています。次に、プラグを抜く前にアンマウントを行う必要があります。
-enzotib

1
もちろん私がやった:o]こことスーパーユーザー。問題は、ツールが進化する(udisks / udev)か、廃止される(HAL?)か、他の「好ましくない」(udisks2?)などであるということです。とにかく、私は見つけることができませんでした任意の作業も明確なソリューションを。私が知っていることのほとんどは、デスクトップ環境メカニズム(Gnome、KDE、またはXFCE)に依存しています。インストールする必要はありません。必ずしもアンムートについてではありません。デバイスがに設定されている場合、syncデータが失われずにプラグが抜かれたことを検出すると、デーモンはfsからデバイスをアンマウントできます。すべてのデスクトップディストリビューションがそれを行います。ターミナルでそれが欲しい。
cedbeu

のこの交換をご覧halevtください。アンマウントについては、通常、物理的にプラグを抜く前に、ファイルマネージャーからデバイスを取り出すことを期待しています。
-enzotib

そうですね。しかし、一部の(以前使用されていた)デーモンは、プラグを抜く前にマウント解除されていないfsからデバイスをマウント解除し、対応するディレクトリを/ media /から自動的に削除し、通常の方法で(デバイスはもちろん同期するように構成されています)。リンクありがとうございます。udisksevtに戻ったらすぐに確認します。私はすでにdevmonとudiskieを調べていますが、Debianパッケージには含まれていません。他に何かを見つけることができれば、私はそれを試してみますが、それを行うためのDebianのネイティブな解決策がないとは信じられません。
cedbeu

1
私もDebianの上だと私は使用fdisk -lして、mount-それは、二つのコマンドですが、あなたはそれを自動化したい場合はOK、あなたが解析する必要がありますfdisk -l出力をし、その後にそれを置くmount私は、このようなものを行います- 、headtail、、tr cutなど。ただし、プロは通常、それを行うawkか、さらに良いことに、正しい場所でデータを探します。削除については、少なくとも私がにマウントすると/mnt、自動的に行われます。トリガーについて(プラグインするとき)私は手がかりがありませんが、これを解決するときに教えてください。
エマニュエルベルク

回答:


10

探していると思いますpmount

挿入時に自動的にマウントする場合は、DebianでのUSBスティックの自動マウントを参照してください。

システムがudisks2を使用している場合、これはリムーバブルストレージデバイスの挿入に反応する好ましい方法です。Udiskの設定のヒントについては、Arch Wikiをご覧ください。

それ以外の場合、新しいデバイスが表示されたときに反応するプログラムはudevであるため、自動マウントはudevルールによってトリガーされます。usbmountパッケージは自動的にUSBストレージデバイスといくつかの他のマウントにudevのルールを提供します。FUSEファイルシステム(ntfs-3gなど)ではmountudevルールからの呼び出しは機能しないため、必要な場合はudiskを使用してください。

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


答えてくれてありがとう。できるだけ早くそれを試して、ここの人々に知らせます。アンムーティングについて。因果関係の問題ではないということを私に言うのはやめてください:o]デバイスが完全に抜かれた後のアンマウントは、デバイスが同期するように構成されたらすぐに理にかなっています(可能です)。その後、それがあるだけで、ファイルシステムの問題。キャッシュなしで(同期的に)データが転送された場合、アンマウントせずにプラグを抜く問題はありません。その後、アンマウントを実行でき、デバイスがもう存在しないことをシステムに通知する場合にのみ役立ちます。
cedbeu

1
@cblab単純化しすぎです。ファイルが書き込み用に開かれているときにデバイスを引き出すと、ファイルが破損している可能性があります。アンマウントすると、ファイルが開かれなくなります。多くのファイルシステム(ただし、FATではありません)では、アンマウントはダーティビットを0に設定するだけではなく、たとえばログをフラッシュする必要があります。フラッシュデバイスの場合、同期マウントに関する主な懸念事項は、書き込みのグループ化を妨げるため、デバイスの摩耗が非常に速くなることです。superuser.com/questions/180722/…およびreadlist.com/lists/vger.kernel.org/linux-kernel/22/111748.htmlを
Gilles 'SO- stop being evil'

こんにちは、@ Gilles。返信いただきありがとうございます。ただし、単純化しすぎているとは思わない。あなたはいくつかの点で正しいです。しかし、ユーザーは危険な生活をしたいかどうかを決定します。同意してください。投稿は7歳です。現在、これらの問題flushvfat回避するために特別に設計されたマウントオプション:書き込みは各ブロックの後に実行されませんが、デバイスが非アクティブになったらすぐに実行されます。また、フラッシュメモリは、行き止まりのライフサイクルも大幅に増やしました。今、明らかに、ユーザーは、ファイルを開いている間、またはコピー中(またはその直後)にデバイスを取り外さないように注意する必要があります。しかし、それは良い妥協です。
cedbeu

とにかく、usbmountは私にとって良い選択肢かもしれませんが、残念ながら、ラベル名に応じてデバイスをフォルダにマウントしませんが、/media/usb-*では、私のニーズに適合しません。デバイスが検出されたらパラメータ/media/<DEV_LABEL>flush使用してデバイスを自動的にマウントできるようにし(ディレクトリの動的作成が可能な場合)、デバイスが検出されない場合はアンマウントしてディレクトリを/media/自動的に削除します。私が取るリスクは私次第です。
cedbeu

1
ご注意usbmountので、NTFSをサポートしていないjessieもう:bugs.debian.org/774149
malat

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をセットアップして/ 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

これが行うこと:このスクリプトは、USBストレージデバイスパーティションをマウントする方法をAutoFS(/ usr / sbin / automount)に指示します。

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

2

さて、それは長い時間でしたが、今のところ私が見つけた最良の選択肢で私の質問に答えます。要約udevすると、いくつかのスクリプトに関連付けられたルールを作成し(ディレクトリを作成/削除し、リムーバブルデバイスをアンマウント/マウントします)、udevデバイスイベントtype =にアタッチします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これらのスクリプトをイベントに添付するルールを作成する

最後に、たとえばに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システムにグループがある場合、ユーザーのR / Wです。また、デバイスは、ホットアンプラグの場合のデータ損失のリスクを制限するために、同期モードでマウントされます。

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

また、udevイベントを監視するためのツールはudevadm monitor--envまたはのようなオプションがあります--property

$ udevadm monitor --env

これはテストされ、debianとarchの両方で正常に動作しますが、おそらくに依存するすべてのディストリビューションで動作しますudev


「実行可能ファイルに設定する(sudo chmod + r /lib/udev/storage-autounmount.sh)」で+ rを+ xに置き換える必要があると思います
ジェレミー

新しいjessieのインストールがあり、その指示に従ってきましたが、再起動後でもtty1から自動マウントを実行できません(指示にはありませんが、自動再起動の事前起動もありません)。USBドライブの挿入は検出されます(コンソールメッセージが表示されます)が、/ media /には何も表示されません(cdromを除く)。USBドライブを手動でマウントできるので、それも同様に機能します。[次のコメントに続く]
トムロッシュ

[前のコメントから続く] package = udevがインストールされており、dirs = {/ etc / udev / rules.d /、/ lib / udev /}が事前に設定されており、$ PATHにexecutable = udevadmがあります。(1)どのDebianリリースでこの作品を作りましたか?(私はwheezyを想定しています)(2)他にどのDebianパッケージをインストールしていますudevか?
トムロッシュ

当時、@ TomRocheはWheezyでした。実際、特別なパッケージはインストールしていませんでした。私は最小限のセットアップを試み、最小限のインストールで提供されなかったパッケージを可能な限り使用しないようにしました。再起動する必要はありませんでした。そのため、これは私の指示にはありません。私はそれに飛び込んでいないのはかなり長い時間でした...私はすぐに再試行するかもしれません。
セドベ

1

私はかなり遅いと思うが、誰かがそれを必要とする場合、私はこれを投稿する:(また、私の最初のStackExchangeの回答)

多くの場所で解決策を確認した後、Arch Wikiで簡単な解決策を見つけました。

Arch Wikiへのリンク。

デフォルトのマウントディレクトリをから/run/media/$USER/に変更するudisks2ルールを追加できます/media/<Label>

次の/etc/udev/rules.d/ような名前のルールを追加します99-udisks2.rules

ENV{ID_FS_USAGE}=="filesystem|other|crypto", ENV{UDISKS_FILESYSTEM_SHARED}="1"

次に、Umountieのような自動マウント用の簡単なツールをインストールするだけです。


こんにちは、ここにようこそ。あなたのオプションをありがとう。Udiskieの場合、実際には完全なコマンドラインオプションが必要でした(Xorgもシステムで使用できるグラフィカルインターフェイスもありません)。そして...質問は6.5年です(まあ、まあ!)、今は状況が変わったと思います:)しかし、とにかく、あなたの最初の答えに+1を、ありがとう。
cedbeu

1

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

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


いいね、ありがとう。これは私が聞いたかなり古い質問です(ほぼ7年前…若く感じさせません^^)。それでも、あなたの提案を見ていきます。systemd環境はそれ以降ずっと成熟したと思います。おかげで、私はこれをチェックします!
セドベウ

0

/ etc / fstabファイルを編集して、これを行う方法を見つけました。単純なエントリは次のようになります。

/dev/sdb1 /media/robot/hdd1 ntfs defaults 0 0

<file system> <mount point> <type> <options> <dump> <pass>


マウントは/etc/fstab、ブート時にのみ自動的にマウントされます。
グレアム

@Graeme、私は/ etc / fstab経由でマウントするSDカードを持っています。テストとして、SDカードをコンピューターからアンマウントして物理的に取り外してみました。「df」でマウントが表示されなくなったことを確認しました。SDカードを再挿入すると、マウントを明示的に再マウントしていなくても、マウントが再表示されました。これはUbuntu 16.04にあります。
ジノ

@ Gino、Ubuntuはしばらくの間デフォルトで自動マウントを実行しました。
グレアム

@ Graeme、Ubuntu automounterが/ etc / fstabから正しいマウントを選択しているようです(存在する場合)。そのため、少なくともUbuntu 16.04では、マウントは、ブート時および USBポートへの後続の再挿入(ある場合)後に自動的にマウントされます。–
Gino

@Gino Ubuntuをしばらく使用していませんが、fstabの内容に関係なく、sdカードが自動マウントされると確信しています。Fstabは、最新のシステムにディスクを追加するというよりも、コアシステム要素のセットアップに関するものです。
グレアム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.