web-dev-qa-db-ja.com

どのsd *がUSBであるかを判断する方法は?

重複の可能性:
/ dev/sdXが接続されたUSBまたはHDDかどうかを知る方法

私のシステムでのls /dev/sd*の出力は-

sda  sda1  sda2  sda3  sda4  sda5  sda6  sda7  sdb  sdc  sdc1  sdc2

どのドライブがどれであるかをどのように判断すればよいですか?

27
Kshitiz Sharma

Linuxを使用していると仮定します。

試してください:

Sudo /lib/udev/scsi_id --page=0x80 --whitelisted --device=/dev/sdc

または:

cat /sys/block/sdc/device/{vendor,model}

また、さまざまなパーティションのファイルシステムから情報(ラベルを含む)を取得することもできます。

Sudo blkid /dev/sdc1

パスIDは、デバイスのタイプを判別するのに役立ちます。

readlink -f /sys/class/block/sdc/device

以下も参照してください。

find /dev/disk -ls | grep /sdc

正しく機能するudevを使用すると、上記の他のコマンドからのすべての情報が得られます。

/proc/partitionsのコンテンツは、サイズに関する情報を提供します(ただし、@ Maxですでに言及されているlsblkほどわかりやすい形式ではありません)。

Sudo blockdev --getsize64 /dev/sdc

対応するブロックデバイスのサイズをバイト単位で示します。

Sudo smartctl -i /dev/sdc

(クロスプラットフォーム)、メーカー、モデル、サイズ、シリアル番号、ファームウェアのリビジョンなどの多くの情報も提供します...

26

完成したbashサンプル

私が作成してインストールするために記述したスクリプトの一部があります live usb key 、(dual boot ubuntu-debian):

最初の部分_USBKEYS=..._はこの質問に対する答えです

要するに、これ:

リスト取り外し可能デバイス、sdおよび非ゼロのサイズ。

このスクリプトは、Ubuntuにデフォルトでインストールされていないように見えるdialogを使用します。ただし、dialoggdialogwhiptailまたは 'zenity _or even_ easybashbui`に置き換えることができます。

_#!/bin/bash

export USBKEYS=($(
    grep -Hv ^0$ /sys/block/*/removable |
    sed s/removable:.*$/device\\/uevent/ |
    xargs grep -H ^DRIVER=sd |
    sed s/device.uevent.*$/size/ |
    xargs grep -Hv ^0$ |
    cut -d / -f 4
))

export STICK
case ${#USBKEYS[@]} in
    0 ) echo No USB Stick found; exit 0 ;;
    1 ) STICK=$USBKEYS ;;
    * )
    STICK=$(
    bash -c "$(
        echo -n  dialog --menu \
            \"Choose wich USB stick have to be installed\" 22 76 17;
        for dev in ${USBKEYS[@]} ;do
            echo -n \ $dev \"$(
                sed -e s/\ *$//g </sys/block/$dev/device/model
                )\" ;
            done
        )" 2>&1 >/dev/tty
    )
    ;;
esac

[ "$STICK" ] || exit 0

echo $STICK...
_

サンプル(3つのハードディスクに加えて、3つのUSBスティックを接続したところ):

dialog preview

dialoggdialog(24行目)で置き換えると、次のようになります。

gdialog previw

しかし、構文はwhiptail...のような他のdialogユーティリティで使用できます。

重要な部分

_export USBKEYS=($(
    grep -Hv ^0$ /sys/block/*/removable |
    sed s/removable:.*$/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

sdd "Storage Media"
sde "Freecom Databar"
sdf "silicon-power"
_

詳細説明

これはいくつかのbashismsを使用します:

_export USBKEYS=($(                         # Declaration of *array* 'USBKEYS'
    grep -Hv ^0$ /sys/block/*/removable |  # search for *not 0* in `removable` flag of all devices
    sed s/removable:.*$/device\\/uevent/ | # replace `removable` by `device/uevent` on each line of previous answer
    xargs grep -H ^DRIVER=sd |             # search for devices drived by `SD`
    sed s/device.uevent.*$/size/ |         # replace `device/uevent` by 'size'
    xargs grep -Hv ^0$ |                   # search for devices having NOT 0 size
    cut -d / -f 4                          # return only 4th part `/` separated
))
for dev in ${USBKEYS[@]} ;do               # for each devices in USBKEY...
    echo $dev \"$(r                        # echo device name and content of model file
        sed -e s/\ *$//g </sys/block/$dev/device/model
        )\" ;
  done
_

私の机に3本のUSBスティックを挿入した後:

_grep -H . /sys/block/*/removable
/sys/block/loop0/removable:0
/sys/block/loop1/removable:0
...
/sys/block/sdc/removable:0
/sys/block/sdd/removable:1
/sys/block/sde/removable:1
/sys/block/sdf/removable:1
/sys/block/sr0/removable:1
_

(はい、私のデスクには3つの物理ハードドライブがあります:sdasdbおよびsdc。最初のリムーバブルディスクはsddおよびsdeになります)。

そう:

_grep -Hv ^0$ /sys/block/*/removable
/sys/block/sdd/removable:1
/sys/block/sde/removable:1
/sys/block/sdf/removable:1
/sys/block/sr0/removable:1
_

取り外し可能なデバイスのリストがあります、

_grep -Hv ^0$ /sys/block/*/removable |
    sed s/removable:.*$/device\\/uevent/
/sys/block/sdd/device/uevent
/sys/block/sde/device/uevent
/sys/block/sdf/device/uevent
/sys/block/sr0/device/uevent
_

_grep -Hv ^0$ /sys/block/*/removable |
    sed s/removable:.*$/device\\/uevent/ |
    xargs grep -H ^DRIVER=sd
/sys/block/sdd/device/uevent:DRIVER=sd
/sys/block/sde/device/uevent:DRIVER=sd
/sys/block/sdf/device/uevent:DRIVER=sd
_

sdドライバーによって駆動されるリムーバブルデバイスのリストがあります(つまり、srでもfloppyでもありません)

_grep -Hv ^0$ /sys/block/*/removable |
    sed s/removable:.*$/device\\/uevent/ |
    xargs grep -H ^DRIVER=sd |
    sed s/device.uevent.*$/size/
/sys/block/sdd/size
/sys/block/sde/size
/sys/block/sdf/size
_

_grep -Hv ^0$ /sys/block/*/removable |
    sed s/removable:.*$/device\\/uevent/ |
    xargs grep -H ^DRIVER=sd |
    sed s/device.uevent.*$/size/ |
    xargs grep -Hv ^0$
/sys/block/sdd/size:15224832
/sys/block/sde/size:7834944
/sys/block/sdf/size:7831552
_

_grep -Hv ^0$ /sys/block/*/removable |
    sed s/removable:.*$/device\\/uevent/ |
    xargs grep -H ^DRIVER=sd |
    sed s/device.uevent.*$/size/ |
    xargs grep -Hv ^0$ |
    cut -d / -f 4
sdd
sde
sdf
_

また:

_export USBKEYS=($(
    grep -Hv ^0$ /sys/block/*/removable |
    sed s/removable:.*$/device\\/uevent/ |
    xargs grep -H ^DRIVER=sd |
    sed s/device.uevent.*$/size/ |
    xargs grep -Hv ^0$ |
    cut -d / -f 4
))
set | grep ^USBKEYS=
USBKEYS=([0]="sdd" [1]="sde" [2]="sdf")
_

そして最後に:

_cat /sys/block/$USBKEYS/device/model
Storage Media   

cat /sys/block/${USBKEYS[2]}/device/model
silicon-power   
_

だが

_printf "|%s|\n" "$(</sys/block/$USBKEYS/device/model)"
|Storage Media   |
_

それは私が書いたからです:

_echo ${USBKEYS[2]} \"$(sed -e s/\ *$//g </sys/block/${USBKEYS[2]}/device/model)\"
sde "silicon-power"
_

収縮-ゴルフ:

短縮版があります

_US=($(cut -d/ -f4 <(grep -vl ^0$ $(sed s@device/.*@size@ <(grep -l ^DRIVER=sd $(
    sed s+/rem.*$+/dev*/ue*+ <(grep -Hv ^0$ /sys/block/*/removable)) <(:))) <(:))))
_

(注意:<(:) _:_へのフォークによって疑似空のファイルを作成しますこれは_/dev/null_より短いですが、実際には同等ではありません)

2行と1つの変数UsbSticksの保持:

_set | grep ^US=
US=([0]="sde" [1]="sdf" [2]="sdg")
_

したがって、(私の始めの)スクリプトは次のようになります。

_#/bin/bash

US=($(cut -d/ -f4 <(grep -vl ^0$ $(sed s@device/.*@size@ <(grep -l ^DRIVER=sd $(
    sed s+/rem.*$+/dev*/ue*+ <(grep -Hv ^0$ /sys/block/*/removable)) <(:))) <(:))))
case ${#US[@]} in 0)echo "No USB stick found.";exit 0;;1)S=$US;;*)S=$(sh -c "$(
    sed -nre 's@/sys/block/(.*)/device/model:(.*)$@\1 "\2"@;H;${x;s/\n/ /g;
      s/^/whiptail --menu "Choose an USB stick" 22 76 14/;p}' <(grep -H . $(
     printf /sys/block/%s/device/model\\n ${US[@]})))" 2>&1 >/dev/tty) ;; esac
whiptail --defaultno --yesno "Could I destroy content of $S!?" 10 70 6 || exit 0
_
12
F. Hauri

最近のバージョンのLinuxには、さまざまな/ dev/sdXおよび/ dev/sdXNエントリへのオートマジックシンボリックリンクを含む/dev/disk/by-{id,label,path,uuid}ディレクトリがあります(これらはすべてudevによって設定されていると思います)。これらは、ディスクとパーティションに、より安定した有益な名前を提供します。私は/dev/disk/by-label/が最も便利だと思います(特にファイルシステムパーティションにラベルを付ける場合)が、by-pathの方がユースケースに役立つ場合があります。

9
P.T.

udevはシステムを認識しています。 /sys/の下でudevadmを介してこのように情報を取得できます(rootとして実行するか、ディストリビューションに応じてSudoを使用して)

udevadm info -a -p /sys/block/sdb

udevadm info -a -p /sys/block/sdc

出力を読むと、次のような意味のある結果が出てきます。

ATTRS{vendor}
ATTRS{model}

あなたはどれがUSBであるかについていくつかの情報を得ることができるはずです。さらに、変数

SUBSYSTEM=="usb"

私たちがUSBについて話している素敵な大きなヒントをあなたに与えるはずです。

次に、KERNEL変数を読んで、どのsd *デバイスがUSBであるかを理解します。

役立つ他のコマンドは、すべてのハードウェアを接続別に一覧表示するlshwです。lsusbは、USBデバイスを一覧表示しますが、提供されたsd *文字は表示しません。また、dmesgは、USBをコンピューターに接続した直後に入力すると、必要なすべての情報を提供します。

これらはすべてCLIコマンドです。他の若者のようなGUIを使用すると、その方向でより多くのことを支援できます。

7
nass

接続されたSCSIデバイス(/ procおよび/ sysから取得)に関するさまざまな情報を出力するlsscsiコマンドを使用することもできます。あなたは輸送情報に興味があるので、lsscsi -t | grep usbは、USBトランスポートを使用しているデバイスを通知します。

3
Petr Uzel

パーティションの数が多い場合、システムドライブがsdaである可能性が非常に高いです。これを確認するには、mountdf -h、またはlsblkの出力を使用して、/の場所を探すことができます。そのドライブを避けてください。

それ以外は、sdbsdcの両方が有効な候補です。それらをマウントして内容を確認するのが最も安全な方法です。スティックを引き、どれが消えるかを監視する(または、再挿入した後のdmesgの出力と比較する)と同じくらい簡単です(取得した/dev/の名前がわかるはずです)。

2
Max

ドライブがシステムの実行を維持するために必要ではないと想定した私のお気に入りは、システム内のUSBドライブがある場合とない場合のディレクトリ一覧を比較することです。

1
jwernerny

簡単な方法の1つは、/ dev/disk/by-id /を調べることです。これには、システム内のすべての実際のドライブおよびパーティションデバイスノードを指すシンボリックリンクファームが含まれます。シンボリックリンク名は、ドライブのインターフェースタイプ、ブランドとモデル、およびシリアル番号を識別し、各ドライブの永続的な一意の識別子として使用できます。

例えば

$ ls -lF /dev/disk/by-id/usb-Generic_Flash_Disk*
lrwxrwxrwx 1 root root  9 Jan  5 11:10 /dev/disk/by-id/usb-Generic_Flash_Disk_CAAE91F7-0:0 -> ../../sdo
lrwxrwxrwx 1 root root 10 Jan  5 11:10 /dev/disk/by-id/usb-Generic_Flash_Disk_CAAE91F7-0:0-part1 -> ../../sdo1

もちろんこれはワイドカラムターミナルではるかに良く見えます:)

次のエイリアスは、システム内のすべてのディスク(パーティションではない)のクイックリストを取得するのに役立ちます。

alias list_disks='ls -lF /dev/disk/by-id/{scsi,usb}-* | grep sd.$'

私のホームzfsonlinuxファイルサーバーからの出力例を含めたはずですが、ここでは見苦しいように見えます。テキストフィールドの幅が十分に広くありません。

1
cas