どのsd *がUSBであるかをどうやって知ることができますか? [コピー]

どのsd *がUSBであるかをどうやって知ることができますか? [コピー]

重複の可能性:
/dev/sdXがUSBまたはHDDに接続されているかどうかはどうすればわかりますか?

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

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

どのドライブが何であるかをどのように決定する必要がありますか?

答え1

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

努力する:

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

または:

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

次のコマンドを使用して、他のパーティションのファイルシステムから情報(ラベルを含む)をインポートすることもできます。

sudo blkid /dev/sdc1

pathidはデバイスの種類を決定するのに役立ちます。

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

また見なさい:

find /dev/disk -ls | grep /sdc

正しく機能すると、上記udevの他のコマンドに関するすべての情報が提供されます。

の内容はサイズに関する情報を提供します(@Maxが既に述べたおなじみの形式ではありませんが/proc/partitions)。lsblk

sudo blockdev --getsize64 /dev/sdc

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

sudo smartctl -i /dev/sdc

(クロスプラットフォーム)ブランド、モデル、サイズ、シリアル番号、ファームウェアバージョンなどを含む多くの情報も提供しています。

答え2

最終確認強く打つサンプル

作成してインストールするための小さなスクリプトを作成しました。ライブUSBキー、(デュアルブートUbuntu - Debian):

最初の部分USBKEYS=...は質問に対する答えです。

つまり、これは次のようになります。

リスト移動可能デバイス、駆動sdそして所有0以外サイズ。

ノートこのスクリプトはdialogUbuntuにデフォルトでインストールされていないようです。ただし、「zenity easybashbui」dialogに置き換えることができます。gdialogwhiptailor even

#!/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スティックを接続しました):

ダイアログボックスのプレビュー

dialoggdialog24行目)を変更すると、次のようになります。

gdialog プレビュー

ただし、この構文は他の構文と組み合わせて使用​​できます。会話実用性などwhiptail...

重要な部分

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"

上海

これは一部を使用しますバシズム:

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

sda(はい、私の机には、、のsdb3つの物理ハードドライブがあります。sdc最初のリムーバブルドライブはになりましたsddsde

だから:

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(例:またはいいえsrfloppy

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行と変数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

答え3

最新バージョンのLinuxでは、いくつかの/dev/disk/by-{id,label,path,uuid}ディレクトリにさまざまな/dev/sdXエントリと/dev/sdXNエントリへの自動シンボリックリンクが含まれています(すべてudevで設定されていると思います)。これは、ディスクとパーティションのより信頼性が高く、便利な名前を提供します。私は/dev/disk/by-label/これが最も役に立つと思いますが(特にファイルシステムパーティションにラベルを付ける場合)、by-pathあなたのユースケースにもっと役立つかもしれません。

答え4

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

関連情報