私はプラグアンドプレイシステム(GUIではなくSSHのみ)でDebian Squeezeを実行していますが、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==""
udev
私はUSBスティックがその名前を持つように強制するルールを作成しようとしてきましたが、/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"
追加/削除を処理するにはまだ少し作業が必要であることがわかっていますが、現時点ではこれは基本的なテストです。
その結果、、、、および/dev
から3つの新しいデバイスノードを取得できるようになりました。/dev/usbstick-sdc
/dev/usbstick-sdc1
usbstick-sg2
しかし、RUN
そのセクションのコードは一度だけ実行され、1つのディレクトリしか生成されないことがわかりましたmnt/usbstick-sdc
。私もディレクトリが常に空であることがわかりました。だから明らかに何かがまだ間違っています! (それでも私は進展を見せています)。
答え1
私はこの一般的な問題を解決するより簡単な方法があるべきだと思っていましたが、実際はそうです。これは私がwheezy / sidサーバーで試したことです:
sudo apt-get install usbmount
USBフラッシュドライブを挿入すると完了です!これで私の杖にアクセスできます/media/usb
。
しかし、usbmountにはマニュアルページはありません。読んでください/usr/share/doc/usbmount/README.gz
。デフォルトでは、usbmountは同期オプションを使用してスティックをマウントするようです。スティックを非同期で取り付けて実行するか、プラグを抜く前に実行する方がsync
良い場合がありますumount
。これは設定可能です。
答え2
ただ 1 つのデバイスノードでしか表現できません。どのフラッシュドライブを接続できます。 2つが挿入されたらどうなりますか?それとも、ペンドライブに複数のパーティションがある場合?
一般的に、ユーザー定義の名前付きデバイスノードを作成するために使用するのは、ルールでの使用SYMLINK+=
方法を確認するための.Grepです。grep SYMLINK /etc/udev/rules.d/*
すべてのudevトリガーコマンドと同様に、で説明されているように、いくつかの意味のある変数を使用できますman udev
。変数を使用してスクリプトに名前を指定するだけで、実際にデバイスにカスタム名を付ける必要はありません%k
。
自動マウントソリューションについてはこちらをご覧ください。都市航空交通局、私は少し説明しました。この質問に対する答え。
答え3
これが私が最近やってきたことで、今はこの方法に非常に満足しています。これは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
つまり、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」、および「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デバイスパーティションをマウント解除できます(自動マウントにマウント解除するように指定)。
もちろん、パーティションがどこでも使用されていないことを確認できます。自動マウントは、60秒のタイムアウト後にパーティションをマウント解除します。
ここで本当の秘訣は、「/media/usb」から「/media/autousb」へのシンボリックリンクを使用することです。
- "/media/usb"シンボリックリンクは、ユーザーにどのUSBストレージデバイスパーティションがあるかについての簡単な概要を提供するためにudevによって作成されます。
- /media/usbを介してパーティションを使用すると、AutoFSは要求に応じてパーティションを自動的にマウントします。
- スクリプト化された "auto.usb"ファイルを使用すると、あらゆる種類のファイルシステムをサポートできるだけでなく、あらゆる種類の命名スキームもサポートできます。
- この方法は、パーティションが異なるファイルシステムタイプを使用している場合でも、複数のパーティションを持つUSBメモリースティックをサポートします。
答え4
私が見つけた最良の答えは、Jessieで維持されておらず、動作しないため、実際には使用されなくなりました(malatのコメントを参照)
私(Jesse)にとって、解決策は次のとおりです。このブログ魅力のように動作します。
「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 シンボリックリンクのいずれかを使用することもできます。デバイスファイルに応じてこの設定を変更する必要があります(sudo fdisk -l
デバイスのリストを表示するには)。
/media/bluray
マウントポイントです。別のマウントポイントを選択できます
nofail
CD-ROMドライブにCDなしで起動するときにエラー報告を避ける必要があります。
x-systemd.automount
挿入されたディスクを自動的にマウントするようにsystemdを設定するオプション。
noauto を指定しないでください。これにより、systemdが自動的にディスクをマウントできなくなり、目的が失われます。
テスト
journalctl -x -f
端末でコマンドを実行して、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をインストールする必要はありませんでしたが、自分で確認する必要があります。