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


10

私はプラグコンピュータで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==""

私はudevUSBスティックに名前を付けるようにルールを書こうとしてきました/dev/usbstickが、今のところ成功していません。

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

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

この効果は、私は今では3つの新しいデバイスノードを取得するために管理することである/dev、すなわち、/dev/usbstick-sdc/dev/usbstick-sdc1usbstick-sg2

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


その2番目の/dev/sdc1はずだったのsdd1ですか?また、を使用blkidしてドライブを一意に識別できます(実際、パーティションです。再フォーマットすると変更されます)。
ケビン

正解です。修正しました。私がしたいのは、USBスティックが差し込まれると、それがいくつかのディレクトリにマウントされることです。udevルールを使用して各パーティションのデバイスノードを作成する必要があると確信していますが、ルールを作成するudevadm出力のレベルがわかりません!
JON

ルールが複雑すぎるようです。一つだけで、簡単なものを作ろうとACTION==、1 KERNEL==と1 ATTRS{something}==( -これは私が使用するものです、それは完全になんとかです)。また、のコマンドチェーンに含まれる単一のスクリプトを実行することを検討してくださいRUN+=
rozcietrzewiacz

アドバイスに感謝しますが、質問は残ります。ルールでターゲットにすべきデバイスツリーのレベルはどれですか。これはすべてひどく混乱しているようで、実際にオンラインでこれを説明する情報はあまりありません。これまでに説明してくれてありがとうございます。ほぼ目標は達成できているようですが、対象とするレベルが不足しています。
JON

私は今、この非常に基本的なルールを試しました:KERNEL=="sd??", NAME="%k", RUN+="mkdir /mnt/usbstick-%k; mount /dev/usbstick-%k /mnt/usbstick-%k"-しかし、もちろん、これも機能しません。自分自身をマウントするために差し込まれているUSBスティックを入手する方法を単に考えようとしているだけの一日を過ごした後、私はますます苛立ちを感じています。本当にこれが難しいのでしょうか?からの出力udevadm test /sys/block/sddは-もちろん-実質的に読めないので、どこが間違っているのかを知る手段はありません。誰かが私をこれについて正しい方向に向けることができますか?
JON

回答:


13

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

sudo apt-get install usbmount

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

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


こちらもご覧くださいpumount
Alex

注意しているusbmountのdebianジェシー以来、もはやサポートNTFS:bugs.debian.org/774149
malat

これをDebian Jessieで実行すると、usbmountがマウントしないようです。パッケージページに、現在メンテナンスされていないことが表示され、systemdを実行しています。このパッケージはsystemdの変更で動作しないのでしょうか?
Travis Griggs

確かに、私にとってジェシーではうまくいきませでした。私の答えを見てください(これ:ddumont.wordpress.com/2015/09/27/…うまくいきました)
Paul

2

あなただけ表現するために、単一のデバイスノード持つことができないということに注意してください任意の添付可能なペンドライブを。それらの2つを接続するとどうなりますか?または、ペンドライブに複数のパーティションがある場合?

通常、カスタム名のデバイスノードの作成に使用するのはSYMLINK+=です。ルールでgrepを使用して、それがどのように使用されるかを確認してくださいgrep SYMLINK /etc/udev/rules.d/*。すべてのudevトリガーコマンドと同様に、で説明されているいくつかの意味のある変数を使用できますman udev。(%k変数を介して)スクリプトにその名前を送ることができるので、デバイスに実際にカスタム名を付ける必要がないことに気付くかもしれません。

自動マウントソリューションについては、この質問の回答で少し説明したUAMをご覧ください。


私はこれらの制約を理解しています。たまたま、私はこの特定のシステムにいつでも接続されている単一のUSBスティックをサポートする必要があるだけです。ただし、USBスティックで複数のパーティションをサポートする必要があります(これらをマウントポイントからサブフォルダーにマウントできると便利です)。これらの要件を前提として、考えられる解決策について何かアドバイスはありますか?プロジェクトの性質上、可能な限り追加のサードパーティソフトウェアを使用しないようにする必要があります。
JON

次に、今行った編集(中央部分)を確認します。これで十分でしょうか?
rozcietrzewiacz

また、UAMは実際にはプログラムではないことに注意してください。これは、udevスクリプトを伴うすばらしいルールの集まりです。ルールを確認して、ニーズに簡単に適合させることができます。
rozcietrzewiacz

アドバイスありがとうございます。もう1つ:私の出力を見udevadmて、ルールで実際にターゲットにすべきデバイスはどのデバイスかを教えてもらえると思いますか?私がオンラインで見たさまざまな例はすべて、はるかに短いツリーを含んでいるようであり、各例は異なるレベルのデバイスをターゲットにしているようです。
JON

上記のアップデートを追加しました、アイデアはありますか?ありがとう!
JON

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] 
# 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スティックをサポートします。

autofsヒントがどのようにして/ home / frankディレクトリを破壊するかを示してもらえますか?ありがとうございました。
フランク

1

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

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

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


1
それは良いルールではありません。これは、ハードドライブのパーティションにも一致します。代わりにremovable、テストする必要がある属性があります。blockscsi
rozcietrzewiacz

1

最良の回答は維持されておらず、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をインストールする必要はありませんでしたが、自分で確認する必要があります。


USB-HDDのあるDebian jessieに自動的にマウントされません。
buhtz 2017

@buhtzが手動でマウントしても動作しますか?上記の手順は実際には、起動時にシステムに存在するドライブに対してのみ機能し、システムの実行中にUSBを「動的に」挿入および削除することはできませんでした。
Paul
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.