web-dev-qa-db-ja.com

/ sys / blockに取り外し不可としてリストされている取り外し可能なUSBスティック?

私の質問では 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
5
MountainX

USBリムーバブルストレージセレクター:SBKeyChooser

私はそれを持っていると思います:

grep -Hv 0 /sys/block/*/removablegrep -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

巻き戻し:

これで私は

  1. これが[〜#〜] usb [〜#〜](またはリムーバブル)であることを確認してください

  2. これがハードドライブ(CD-ROMではない)として機能することを確認します

  3. サイズが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

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

2
F. Hauri

さて、これをリストに取り込むには、 前に与えたのと同じコマンド を使用できますが、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

このデータを使用して、新しい割り当てルールを自由にモデル化できます。

4
mikeserv

これは、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
0
MountainX