web-dev-qa-db-ja.com

DebianでのUSBスティックの自動マウント

プラグコンピュータでDebian Squeezeを実行している(SSHのみ、GUIなし)ので、USBスティックを差し込むと自動的にマウントされるようにしています。

私がやったことはautofsをインストールすることです。私が収集したものから、デバイスが/devのどこにあるかを知っている限り、自動マウントを処理します。

問題は、USBスティックが常に同じデバイス名にあるとは限らないことです。時々それは/dev/sdc1、時々/dev/sdd1などです。

これを修正するには、udevを使用して、USBスティックに常に同じ名前が付けられるようにする必要があります。

udevadmから次の情報を取得しました:

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/block/sdd/sdd1':
    KERNEL=="sdd1"
    SUBSYSTEM=="block"
    DRIVER==""
    ATTR{partition}=="1"
    ATTR{start}=="63"
    ATTR{size}=="129339"
    ATTR{ro}=="0"
    ATTR{alignment_offset}=="0"
    ATTR{discard_alignment}=="0"
    ATTR{stat}=="      31      244      275      190        0        0        0        0        0      190      190"
    ATTR{inflight}=="       0        0"

  looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0/Host8/target8:0:0/8:0:0:0/block/sdd':
    KERNELS=="sdd"
    SUBSYSTEMS=="block"
    DRIVERS==""
    ATTRS{range}=="16"
    ATTRS{ext_range}=="256"
    ATTRS{removable}=="1"
    ATTRS{ro}=="0"
    ATTRS{size}=="129439"
    ATTRS{alignment_offset}=="0"
    ATTRS{discard_alignment}=="0"
    ATTRS{capability}=="51"
    ATTRS{stat}=="      56      727      783      520        0        0        0        0        0      520      520"
    ATTRS{inflight}=="       0        0"
    ATTRS{events}=="media_change"
    ATTRS{events_async}==""
    ATTRS{events_poll_msecs}=="-1"

  looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0/Host8/target8:0:0/8:0:0:0':
    KERNELS=="8:0:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS=="sd"
    ATTRS{device_blocked}=="0"
    ATTRS{type}=="0"
    ATTRS{scsi_level}=="3"
    ATTRS{vendor}=="        "
    ATTRS{model}=="Flash Disk      "
    ATTRS{rev}=="2.00"
    ATTRS{state}=="running"
    ATTRS{timeout}=="30"
    ATTRS{iocounterbits}=="32"
    ATTRS{iorequest_cnt}=="0x90"
    ATTRS{iodone_cnt}=="0x90"
    ATTRS{ioerr_cnt}=="0x0"
    ATTRS{modalias}=="scsi:t-0x00"
    ATTRS{evt_media_change}=="0"
    ATTRS{queue_depth}=="1"
    ATTRS{queue_type}=="none"
    ATTRS{max_sectors}=="240"

  looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0/Host8/target8:0:0':
    KERNELS=="target8:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS==""

  looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0/Host8':
    KERNELS=="Host8"
    SUBSYSTEMS=="scsi"
    DRIVERS==""

  looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0':
    KERNELS=="1-1.2:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb-storage"
    ATTRS{bInterfaceNumber}=="00"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bNumEndpoints}=="02"
    ATTRS{bInterfaceClass}=="08"
    ATTRS{bInterfaceSubClass}=="06"
    ATTRS{bInterfaceProtocol}=="50"
    ATTRS{modalias}=="usb:v1976p6025d0100dc00dsc00dp00ic08isc06ip50"
    ATTRS{supports_autosuspend}=="1"

  looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2':
    KERNELS=="1-1.2"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{configuration}==""
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bmAttributes}=="80"
    ATTRS{bMaxPower}=="100mA"
    ATTRS{urbnum}=="383"
    ATTRS{idVendor}=="1976"
    ATTRS{idProduct}=="6025"
    ATTRS{bcdDevice}=="0100"
    ATTRS{bDeviceClass}=="00"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{speed}=="12"
    ATTRS{busnum}=="1"
    ATTRS{devnum}=="11"
    ATTRS{devpath}=="1.2"
    ATTRS{version}==" 1.10"
    ATTRS{maxchild}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{authorized}=="1"

  looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1':
    KERNELS=="1-1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{configuration}==""
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bmAttributes}=="e0"
    ATTRS{bMaxPower}=="100mA"
    ATTRS{urbnum}=="197"
    ATTRS{idVendor}=="1a40"
    ATTRS{idProduct}=="0101"
    ATTRS{bcdDevice}=="0111"
    ATTRS{bDeviceClass}=="09"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="01"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{speed}=="480"
    ATTRS{busnum}=="1"
    ATTRS{devnum}=="2"
    ATTRS{devpath}=="1"
    ATTRS{version}==" 2.00"
    ATTRS{maxchild}=="4"
    ATTRS{quirks}=="0x0"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{authorized}=="1"
    ATTRS{product}=="USB 2.0 Hub"

  looking at parent device '/devices/platform/orion-ehci.0/usb1':
    KERNELS=="usb1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{configuration}==""
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bmAttributes}=="e0"
    ATTRS{bMaxPower}=="  0mA"
    ATTRS{urbnum}=="24"
    ATTRS{idVendor}=="1d6b"
    ATTRS{idProduct}=="0002"
    ATTRS{bcdDevice}=="0206"
    ATTRS{bDeviceClass}=="09"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="01"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{speed}=="480"
    ATTRS{busnum}=="1"
    ATTRS{devnum}=="1"
    ATTRS{devpath}=="0"
    ATTRS{version}==" 2.00"
    ATTRS{maxchild}=="1"
    ATTRS{quirks}=="0x0"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{authorized}=="1"
    ATTRS{manufacturer}=="Linux 2.6.38.8 ehci_hcd"
    ATTRS{product}=="Marvell Orion EHCI"
    ATTRS{serial}=="orion-ehci.0"
    ATTRS{authorized_default}=="1"

  looking at parent device '/devices/platform/orion-ehci.0':
    KERNELS=="orion-ehci.0"
    SUBSYSTEMS=="platform"
    DRIVERS=="orion-ehci"
    ATTRS{modalias}=="platform:orion-ehci"

  looking at parent device '/devices/platform':
    KERNELS=="platform"
    SUBSYSTEMS==""
    DRIVERS==""

USBスティックに/dev/usbstickという名前を付けるようにudevルールを記述しようとしましたが、これまでのところ成功していません。

このUSBスティックに常に同じ名前を付けるために、ルールファイルで指定する必要があるルールを誰かが手伝ってくれる?

-または、完全に欠落しているUSBスティックを自動マウントするはるかに簡単な方法はありますか?

[〜#〜]更新[〜#〜]

わかりましたので、私はいくつかの進歩を遂げました。次のルールを追加しました。

SUBSYSTEMS=="scsi", ATTRS{model}=="Flash Disk ", DRIVERS=="sd", NAME="usbstick-%k" RUN+="mkdir /mnt/usbstick-%k; mount /dev/usbstick-%k /mnt/usbstick-%k"

これには、追加/削除の処理に関してまだいくつかの作業が必要であることはわかっていますが、これは今のところ基本的なテストにすぎません。

これにより、/devに3つの新しいデバイスノード、つまり/dev/usbstick-sdc/dev/usbstick-sdc1、およびusbstick-sg2を取得することができます。

しかし、私が見つけたのは、RUNセクションのコードは1回だけ実行され、ディレクトリmnt/usbstick-sdcを作成するだけです。また、ディレクトリは常に空であるため、明らかに問題が発生しています。 (私は進歩していますが)。

10
jon

そのような一般的な問題に対処するはるかに簡単な方法があるはずだと考えました。これが私のwheezy/sidサーバーで試したものです:

Sudo apt-get install usbmount

USBスティックを差し込み、完了です!スティックに/media/usbからアクセスできるようになりました。

ところで、usbmountにはmanページがありません。代わりに/usr/share/doc/usbmount/README.gzを読んでください。 usbmountはデフォルトで同期オプションでスティックをマウントしているようです。スティックを非同期でマウントし、プラグを抜く前にsyncまたはumountを実行する方がずっと良い場合があります。それは構成可能です。

13
Arjan Drieman

ここに私が最近それをした方法があります、そして私は今このアプローチに非常に満足しています。これは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] 
# for automounter support

ACTION=="add", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
    ENV{ID_BUS}=="usb", \
    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", \
    SYMLINK+="usbdisks/%k", MODE:="0660"


# When device is removed, also remove /media/usb/<...>
ACTION=="remove", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
    ENV{ID_BUS}=="usb", \
    RUN+="/bin/rm /media/usb/%k"

これにより、2つのシンボリックリンクが作成されます。1つは、「/ dev/usbdisks/<...>」の下のUSBストレージデバイスパーティション用です。

2番目のシンボリックリンクは、「/ media/usb/<...>」から「/ media/autousb/<...>」にリンクします。これは、オートマウンターのサポートのために行われます(ステップ2を参照)。

Udevがこれらのルールを確実に読み取るようにするには、以下を使用します

Sudo udevadm control --reload-rules

注:同じUSBスティックの同じ名前:可能ですが、おそらく危険です:上記のUDEVルールでは、「%k」の代わりに、たとえば「$ env {ID_FS_LABEL_ENC}」を使用できます。これはボリュームラベルを使用して/ media/usb/<...>を作成しますが、2つのUSBスティックを接続し、両方が同じボリュームラベルを使用するとどうなりますか...

この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

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

スクリプトはまず「/ sbin/blkid」を使用して、パーティションにどのようなファイルシステムがあるかを調べます。

スクリプトは、デバイスパーティションに応じて適切なマウントオプションを提供します。

注:「vfat」(おそらくUSBスティックで最も一般的)、「ntfs」、および「ext4」ファイルシステムのサンプルコードを含めました。もちろん、これを拡張してより多くのファイルシステムをサポートするのは非常に簡単です。

ステップ3)

オプション... USBスティック(またはUSBスティック上のパーティション)をアンマウントするには、/ sbin/usbejectの下にスクリプトを作成します。

#!/bin/bash
# make sure everything is written to USB disk(s)
sync
# sending SIUGSR1 to automount will unmount the media
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

私自身の質問に答えて申し訳ありません。貢献してくださったrozcietrzewiaczに感謝しますが、オンラインで何時間も読んだ後、次のルールを使用して最終的に大きな進歩を遂げることができました。

SUBSYSTEMS=="scsi", KERNEL=="sd[a-h]1", SYMLINK+="removable", RUN+="/bin/mount /dev/removable /path/to/mount"

これにより、SCSIデバイスの最初のパーティションがマウントされます。次の質問は複数のパーティションをマウントする方法になると思いますが、それは別の日の別の問題です。

1
jon

最良の回答は維持されておらず、Jessieで動作しないため、実際には非推奨になっていることがわかりました(malatによるコメントを参照)

私(ジェシーについて)にとって、 このブログ の解決策は魅力のように機能しました。

「ddumont」へのクレジットですが、将来のリンクの腐敗の可能性に対処するために、彼のブログ/回答の概要をここに投稿します。

次の行を/etc/fstabに追加します

/dev/sr0 /media/bluray auto defaults,nofail,x-systemd.automount 0 2

Nanoを使用してこれを行うことができます:

Sudo nano /etc/fstab

説明:

/dev/sr0はデバイスファイルです。/dev/disk/by-idのudevによってセットアップされたシンボリックリンクの1つを使用することもできます。デバイスファイルに応じてこれを変更する必要があります(デバイスをリストするにはSudo fdisk -l

/media/blurayはマウントポイントです。別のマウントポイントを選択できます

nofailは、光学式ドライブにディスクなしで起動する場合の障害レポートを回避するために必要です

x-systemd.automountは、挿入されたディスクを自動的にマウントするようにsystemdを設定するオプションです

noautoを指定しないでください:これにより、systemdがディスクを自動的にマウントできなくなり、目的を達成できなくなります。

テスト

端末でコマンドjournalctl -x -fを実行して、systemdで何が起こっているかを確認します

Systemd設定をSudo systemctl daemon-reloadで再読み込みします。

光学ドライブにディスクをロードする

次に、journalctlは次のように表示されます。

Sept. 27 16:07:01 frodo systemd[1]: Mounted /media/bluray.

さらに

NTFSドライブを正常にマウントするには、ntfs-3g(古いntfsprogs)をインストールする必要がありました

Sudo apt-get install ntfs-3g

OSX形式のUSBを動作させるためにhfsprogsをインストールする必要はありませんでしたが、自分で確認する必要があります。

1
Paul