私の質問では SBフラッシュメモリスティックへのパスを出力するBashスクリプト 他の誰も持っていないように見える問題で立ち往生しました。 (この問題は、この回答を使用したいという私の願望も妨げています: https://unix.stackexchange.com/a/60335/1501 。)
それで、私はその特定の問題をこの新しい質問にしました。
/ sys/blockにリストされている明らかにリムーバブルデバイスは1で終わります。ここに記載されています: https://unix.stackexchange.com/a/80880/1501 およびこの中の他のいくつかの場所 http://unix.stackexchange.com そして、この原則は、私が上で参照した回答で使用されています。
私のリムーバブルデバイスであるSandisk64GBフラッシュメモリスティックは、次のようにリストされています。
/sys/block/sdl/removable:0
どうやら、リムーバブルデバイスは1で終わる必要があります(そして私の他の人はそうします)。 USBメモリスティックがルールに従わないのはなぜですか?
Dolphinによって自動マウントされました。 Kubuntu12.04を実行しています。
Dolphinはそれを「59.6GiBリムーバブルメディア」として表示します。
そしてそれは/ media/me/70E8-1567に(自動的に)マウントされます
Sudo blkid
は次のように表示されます:
/dev/sdl1: UUID="70E8-1567" TYPE="vfat".
'lsblk -do name、rm`は次のことを示しています。
sdl 0
そしてlsusb -vv
ショー:
Bus 001 Device 008: ID 0781:5530 SanDisk Corp. Cruzer
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x0781 SanDisk Corp.
idProduct 0x5530 Cruzer
bcdDevice 2.01
iManufacturer 1
iProduct 2
iSerial 3
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 32
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 200mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 8 Mass Storage
bInterfaceSubClass 6 SCSI
bInterfaceProtocol 80 Bulk-Only
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 1
私はそれを持っていると思います:
grep -Hv 0 /sys/block/*/removable
をgrep -Hv ^ATA\ *$ /sys/block/*/device/vendor
に置き換えると、うまくいくようです。
export USBKEYS=($(
grep -Hv ^ATA\ *$ /sys/block/*/device/vendor |
sed s/device.vendor:.*$/device\\/uevent/ |
xargs grep -H ^DRIVER=sd |
sed s/device.uevent.*$/size/ |
xargs grep -Hv ^0$ |
cut -d / -f 4
))
for dev in ${USBKEYS[@]} ;do
echo $dev \"$(
sed -e s/\ *$//g </sys/block/$dev/device/model
)\" ;
done
または、readlink
を使用してこれがUSBであることを確認することで、より正確になる可能性があります...
export USBKEYS=($(
xargs -n1 readlink < <(echo /sys/block/*) |
sed -ne 's+^.*/usb[0-9].*/\([^/]*\)$+/sys/block/\1/device/uevent+p' |
xargs grep -H ^DRIVER=sd |
sed s/device.uevent.*$/size/ |
xargs grep -Hv ^0$ |
cut -d / -f 4
))
for dev in ${USBKEYS[@]} ;do
echo $dev \"$(
sed -e s/\ *$//g </sys/block/$dev/device/model
)\" ;
done
これで私は
これが[〜#〜] usb [〜#〜](またはリムーバブル)であることを確認してください
これがハードドライブ(CD-ROMではない)として機能することを確認します
サイズが0より大きいことを確認してください(空のカードリーダーではありません)
US=($(cut -d/ -f4 <(grep -vl ^0$ $(sed s@device/.*@size@ <(grep -l ^DRIVER=sd $(
sed s+/device.*$+/dev*/ue*+ <(grep -Hv ^ATA\ *$ /sys/block/*/device/vendor)) <(:))) <(:))))
set | grep ^US=
これは書くことができます
US=($(
cut -d/ -f4 <(
grep -vl ^0$ $(
sed s@device/.*@size@ <(
grep -l ^DRIVER=sd $(
sed -ne 's+^.*/usb[0-9].*/\([^/]*\)$+/sys/block/\1/dev*/ue*+p' <(
xargs -n1 readlink < <(echo /sys/block/*)
)
) /dev/null # equivalant but quicker than <(:)
)) /dev/null)))
readlink
を使用すると、ゴルフバージョンは次のようになります。
US=($(cut -d/ -f4 <(grep -vl ^0$ $(sed s@device/.*@size@ <(grep -l ^DRIVER=sd $(
sed -ne 's+^.*/usb[0-9].*/\([^/]*\)$+/sys/block/\1/dev*/ue*+p' <(
xargs -n1 readlink < <(echo /sys/block/*)) ) <(:))) <(:))))
sbKeyChooserサブルーチンの最終バージョンが私の ライブインストーラー にあります:
#!/bin/bash
DIALOG=whiptail
usbKeyChoose() {
while [ ! -b /dev/$STICK ] ;do
USBKEYS=($(
xargs -n1 readlink < <(echo /sys/block/*) |
sed -ne 's+^.*/usb[0-9].*/\([^/]*\)$+/sys/block/\1/device/uevent+p' |
xargs grep -H ^DRIVER=sd |
sed s/device.uevent.*$/size/ |
xargs grep -Hv ^0$ |
cut -d / -f 4 ))
if [ ${#USBKEYS[@]} -eq 0 ];then
title="No key found"
else
title="Choose wich USB stick have to be installed"
fi
menu=(R "Re scan devices")
for dev in ${USBKEYS[@]} ;do
read model </sys/block/$dev/device/model
menu+=($dev "$model")
done
num=$($DIALOG --menu "$title" 21 72 14 "${menu[@]}" 2>&1 >/dev/tty)
if [ ! "$num" ] ; then
echo "User aborted."
exit 0;
fi
[ ! "$num" = "R" ] && [ "${USBKEYS[num]}" ] && STICK=${USBKEYS[num]}
done; }
usbKeyChoose
echo $STICK
私はこれが好きですloopingソリューション
とにかく、ユーザーがok
の選択を間違えた場合でも、次の画面は、デフォルトのキーにimageを書き込む必要があるユーザーに尋ねる別の選択肢ですcreate new imageこれは、ユーザーがヒットする可能性のある非常に長いプロセスです Ctrl+c
さて、これをリストに取り込むには、 前に与えたのと同じコマンド を使用できますが、removeable要件を削除するだけです:
% for blk in $(lsblk -ndo name) ; do
> udevadm info --query=all --name "$/dev/$blk" |\
> grep -q ID_BUS=usb && printf \
> 'findmnt %s -no TARGET ;'\
> "/dev/$blk" /dev/"$blk"[0-9]
> } ; done 2>&- |. /dev/stdin
大したことではありません-USBバス上のブロックデバイスのアクティブなマウントポイントのみを出力するようになりました。私は、とにかく取り外し不可能なUSBブロックデバイスの多くの例を考えることができません。
why現在のデバイスがリムーバブルとして登録されていない場合、最も可能性の高い答えは、そのドライバーが単にそのようにリストしていないということです。 udev
によってデバイスが検出されると、ルールデータベースに基づいてできるだけ早くデバイスに関する情報を取得します。これらの分類はすべて、次の方法で確認できます。
% udevadm info --query=all --name /dev/$BLOCK_DEVICE
これにより、システムが/dev/$BLOCK_DEVICE
によって参照されるハードウェアを分類するために使用するすべてのkey = valueエントリのリストが返されます。 この投稿slmがアドバイスします この情報を簡単に解析してニーズに対応する方法-そしてそれは確かに非常に簡単です。ドキュメントは、それを「人間が読める、grepに優しい」と正しく説明しています。上記では、すべてのブロックデバイスをUSBバス上のデバイスのみにフィルタリングします。
% grep -q ID_BUS=usb
また、現在のデバイスのデバイスツリーの一番上までattribute-walk
し、attributes
を反映する必要があると思われる別のデバイスを使用することもできます。そうでない場合は、udev
が想定とは異なる方法で割り当てたためです。ただし、ありがたいことに、割り当てに影響を与えたすべてのデータポイントを次のように確認できます。
udevadm info --attribute-walk --name /dev/$BLOCK_DEVICE
このデータを使用して、新しい割り当てルールを自由にモデル化できます。
これは、kdialogに適合したF.Hauriの回答です。
#!/bin/bash
DIALOG=kdialog
usbKeyChoose() {
while [ ! -b /dev/$STICK ] ;do
USBKEYS=($(
xargs -n1 readlink < <(echo /sys/block/*) |
sed -ne 's+^.*/usb[0-9].*/\([^/]*\)$+/sys/block/\1/device/uevent+p' |
xargs grep -H ^DRIVER=sd |
sed s/device.uevent.*$/size/ |
xargs grep -Hv ^0$ |
cut -d / -f 4 ))
if [ ${#USBKEYS[@]} -eq 0 ];then
title="No key found"
else
title="Choose wich USB stick have to be installed"
fi
menu=(R "Re scan devices")
i=0
for dev in ${USBKEYS[@]} ;do
read model </sys/block/$dev/device/model
#echo $i $dev "$model"
menu+=("$i" "$dev $model")
i=$[i + 1]
done
num=$($DIALOG --menu "$title" "${menu[@]}")
#echo "num=$num"
#echo "USBKEYS[num]=${USBKEYS[num]}"
if [ ! "$num" ] ; then
echo "User aborted."
exit 0;
fi
[ ! "$num" = "R" ] && [ "${USBKEYS[num]}" ] && STICK=${USBKEYS[num]}
done; }
usbKeyChoose
echo $STICK