/ dev / sdXが接続されたUSBまたはHDDであるかどうかを知る方法は?


23

ローカルHDDまたはUSBキーであるかどうかを確認するにはどうすればよいですか?ルート権限なしでこれを行う方法を好む。/dev/sdX

OK、udevadm大いに助けました:

ローカルHDDの場合:

udevadm info --query=all --name=sdb | grep ID_BUS
E: ID_BUS=ata

USBキーの場合:

udevadm info --query=all --name=sdc | grep ID_BUS
E: ID_BUS=usb

回答:


15

ルート権限なしで伝えるにはいくつかの方法があり、それらの多くはトリッキー/ハックです:

を使用して/dev/disk/by-id

find /dev/disk/by-id/ -lname '*sdX'

これがのようなもので応答する場合/dev/disk/by-id/usb-blah-blah-blah、それはUSBディスクです。他のプレフィックスが含まれatadmmemstickscsi、など

使用方法に/dev/disk/by-path大きな違いはありません。

find /dev/disk/by-path/ -lname '*sdX'

次のようなものが得られます/dev/disk/by-path/pci-0000:00:1d.7-usb-0:1:1.0-scsi-0:0:0:0。これは、ディスクに至るデバイスパスを示しています。この場合、大まかなパスはPCI→USB→ディスクです。(注意してください-usb-)。

udevを使用します(Debianを実行しています。My udevadmは私の/sbin上にありません$PATH—あなたのものはあなたののどこにでもあるかもしれません$PATH):

/sbin/udevadm info --query=all --name=sdX | grep ID_BUS

デバイスがオンになっているバスタイプを取得します。| grep ID_BUS情報の完全なリストを削除します(追加する必要がある場合があります|less)。

lshwインストール済みの場合、Huygensの回答も機能する場合があります。

lshw -class disk -class storage | less

そして、ディスクの出力を調べます。でless/sdXを試して、前のbus info行を見てください。最初の行はを言うだけscsi@…ですが、その前の数行はより啓発的です。ただし、これはスーパーユーザーとして実行する必要があるため、適切ではない可能性があります。(症状:試したラップトップでは、SATAディスクはリストされましたが、USBディスクはリストされていません- sudoリストされた両方で実行されています)

これらよりも多かれ少なかれ、他のものもあります。


内部SATAドライブと外部SATAドライブを接続して区別する方法はありますesatapか?
CMCDragonkai

10

私は解決策を知っていますが、悲しいことに、それはルート権限が必要です。とにかく、あなたはまだそれが便利だと思うかもしれません:

sudo lshw -class disk -class storage

各デバイスについて、論理名(例/dev/sda:)とバス情報を出力します。USBデバイスの場合は、「usb @ 1:2」のようなものになります。

サンプル出力:

[...]
  *-storage
       description: SATA controller
       physical id: d
       bus info: pci@0000:00:0d.0
       configuration: driver=ahci latency=64
[...]
     *-disk:0
          description: ATA Disk
          physical id: 0
          bus info: scsi@2:0.0.0
          logical name: /dev/sda
[...]
  *-scsi
       physical id: 3
       bus info: usb@1:2
       configuration: driver=usb-storage
     *-disk
          description: SCSI Disk
          physical id: 0.0.0
          bus info: scsi@6:0.0.0
          logical name: /dev/sdc
[...]

8

以下を使用できますlsblk

lsblk -do name、tran
NAME TRAN
sda  sata
sdb  sata
sdd  usb

どこ-d--nodepsの手段が奴隷と印刷しない-o name,tran--output name,tranの手段が、デバイスとデバイスのトランスポートタイプの名前のみをリストアップ。rm出力列のリストに追加して、取り外し可能なデバイスを確認します(1if true):

lsblk --nodeps --output NAME、TRAN、RM
NAME TRAN   RM
sda  sata    0
sdb  sata    0
sdd  usb     1

私は答えでこれを探していました
エデュアルドフロリネスク

4

これにはルート権限は必要ありません(ただし、これらのコマンドの多くはbashismを使用および依存しているため、POSIX準拠のすべてのシェルで動作しません)。

について尋ねる簡単な方法があります:sdX

grep -H . /sys/block/sda/{capability,uevent,removable,device/{model,type,vendor,uevent}}
/sys/block/sda/capability:52
/sys/block/sda/uevent:MAJOR=8
/sys/block/sda/uevent:MINOR=0
/sys/block/sda/uevent:DEVNAME=sda
/sys/block/sda/uevent:DEVTYPE=disk
/sys/block/sda/removable:0
/sys/block/sda/device/model:WDC WD360GD-00FN
/sys/block/sda/device/type:0
/sys/block/sda/device/vendor:ATA     
/sys/block/sda/device/uevent:DEVTYPE=scsi_device
/sys/block/sda/device/uevent:DRIVER=sd
/sys/block/sda/device/uevent:MODALIAS=scsi:t-0x00

本当に面白いファイルがありますcapability。私のDebianにはgenhd.hファイルがあります。

eval $(sed -ne '
   s/#define.*GENHD_FL_\([A-Z0-9_]*\)[ \t]*\([0-9]*\) \?.*$/GENHD_FLAGS[\2]="\1"/p
  ' /usr/src/linux-headers-2.6.32-5-common-openvz/include/linux/genhd.h)
diskCapa=$(</sys/block/sda/capability)
for i in ${!GENHD_FLAGS[@]};do
    (( diskCapa & i )) && echo ${GENHD_FLAGS[i]}
  done
MEDIA_CHANGE_NOTIFY
UP
SUPPRESS_PARTITION_INFO

diskCapa=$(</sys/block/sdd/capability)
    for i in ${!GENHD_FLAGS[@]};do
    (( diskCapa & i )) && echo ${GENHD_FLAGS[i]}
  done
REMOVABLE
MEDIA_CHANGE_NOTIFY
UP
SUPPRESS_PARTITION_INFO

フラグremovableが設定されているかどうかを知るためだけに:

grep REMOVABL /usr/src/linux-headers-3.2.0-4-common/include/linux/genhd.h 
#define GENHD_FL_REMOVABLE                      1

そう

for disk in sd{a,b,c,d,e,f,g,h} ; do
 (( $(< /sys/block/$disk/capability ) & 1 ))  &&  echo $disk is removable
done

capability値(sda上記の例では52 )に1ビットが設定されているかどうか(つまり、奇数かどうか)をテストすることで機能します。

しかし、Linuxはですべてのフラグをレンダリングする/sysため、要求するの/sys/block/sdX/removableはずっと簡単です!;-)

かもしれないUSBキーはそうremovableするが、たくさんあるように、リムーバブルデバイスは、私がいることを確認することを好むであろうサイズ(サンプルのために、無負荷CD-ROMトレイのような)媒体のが0より大きい 、そのデバイスがありませんで使用:sdX/trace/enableバインドされていない監視:

注:これらはすべて、bash v4.2 +で十分にテストされています。

下では、あなたは、この非常に迅速かつ効率的な方法を使用することができます。

for disk in /sys/block/* ; do
    [ -f "$disk/removable" ]    && [ $(<"$disk/removable") -gt 0 ]   &&
    [ -f "$disk/size" ]         && [ $(<"$disk/size") -gt 0 ]        &&
    [ -f "$disk/trace/enable" ] && [ -z "$(<"$disk/trace/enable")" ] &&
    echo "${disk##*/} $(($(<"$disk/size")/1953125))G $(<"$disk/device/model")"
  done

私のシステムには4つのUSBキーがありますが、そのうちの1つ(sde)は既にマウントされているため、前のコマンド出力は次のようになります。

sdd 8G Trans-It Drive
sdf 7G Storage Media
sdg 4G silicon-power

私のスクリプト:

アップグレードされたDebian Liveをインストールするために書いた小さな関数があります。

#!/bin/bash

txtsize() {
    local _c=$1 _i=0 _a=(b K M G T P)
    while [ ${#_c} -gt 3 ] ; do
        ((_i++))
        _c=$((_c>>10))
      done
    _c=000$(( ( $1*1000 ) >> ( 10*_i ) ))
    ((_i+=${3:-0}))
    printf -v ${2:-REPLY} "%.2f%s" ${_c:0:${#_c}-3}.${_c:${#_c}-3} ${_a[_i]}
}

#最初の部分は、人間が読めるサイズのみを表示します。関数はそこから始まります。

chooseFreeUsbKey() {
    local _lUdisk _lUsize _lUdialog=dialog # whiptail # gdialog
    local -A _lUdevices
    unset ${1:-REPLY}
    for _lUdisk in /sys/block/*; do
        [ -f $_lUdisk/removable ] && [ $(<$_lUdisk/removable) -gt 0 ] &&
        [ -f $_lUdisk/size ] && [ $(<$_lUdisk/size) -gt 0 ] &&
        txtsize $(<$_lUdisk/size)*512 _lUsize &&
        [ -f $_lUdisk/trace/enable ] && [ -z "$(<$_lUdisk/trace/enable)" ] &&
        _lUdevices[${_lUdisk##*/}]="$_lUsize $(<$_lUdisk/device/model)"
    done
    case ${#_lUdevices[@]} in
        0 ) ;; # echo Sorry no key found. ;;
        1 ) IFS read -a ${1:-REPLY} \
            <<< "${!_lUdevices[@]}§${_lUdevices[@]%% *}§${_lUdevices[@]#* }";;
        * ) declare -a menu
           for _lUdisk in ${!_lUdevices[@]}; do
               menu+=($_lUdisk "${_lUdevices[$_lUdisk]}")
           done
           _lUdisk=$($_lUdialog --menu "Choose a USB stick" \
               $((LINES-3)) $((COLUMNS-3)) $((LINES-8)) \
               "${menu[@]}" 2>&1 >/dev/tty)
           IFS read -a ${1:-REPLY} \
           <<< "$_lUdisk§${_lUdevices[$_lUdisk]%% *}§${_lUdevices[$_lUdisk]#* }"
    esac
}

これにより、最初の引数として指定された変数または変数に配列として回答が割り当てられます$REPLY

chooseFreeUsbKey stick

echo "$stick"
sdf

echo "${stick[1]}"
7.26G

echo "${stick[2]}"
Storage Media

(最後のフィールドにはスペースを含めることができます。)


私の回答の最初の部分を読みやすくしてくれた@StephaneChazelasに感謝します。
F.ハウリ

1
(1)ネストされた中括弧があるのはなぜですか?という意味…,device/{model,type,vendor,uevent}ですか?(2)GENHDコマンドと「トレース/有効化」コマンドについて説明してください。(3)[ $(( $(< $file ) & 1 )) -ne 0 ]テストをに簡略化(短縮)できます(( $(< $file ) & 1 ))
G-マンは「元に戻すモニカ言う

@ G-Man(1)はい、このために+1!この書き方がどのように導入されたかはわかりません。(2)汎用ハードディスクヘッダーファイルはに存在する必要があります/usr/src/*/include/linux。試してくださいsed -ne 's/#define.*GENHD_FL_\([A-Z0-9_]*\)[ \t]*\([0-9]*\) \?.*$/GENHD_FLAGS[\2]="\1"/p;' /usr/src/*/include/linux/genhd.h。(3)はい。
F. HAURI

0

hdparmまたはlshw(インストールする必要があるかもしれません)を使用sudoして、rootとして実行することをお勧めします。

sudo hdparm -I /dev/sda
sudo lshw -short -C disk
sudo lshw -class disk -class storage

すべての情報を提供する必要があります。


仮想ディスク上のhdparm:hdparm -i /dev/sda /dev/sda: HDIO_DRIVE_CMD(identify) failed: Invalid exchange HDIO_GET_IDENTITY failed: Invalid argument
ティム

さて、私はそうすべきだと言いました、ここでは仮想ディスクで動作します。
EightBitTony

0

の値を読み取るだけです/sys/block/sdX/removable

例えば:

$ cat /sys/block/sda/removable
0
$ cat /sys/block/sdc/removable
1

/dev/sdc USBキーです(SDカードまたはその他のリムーバブルメディアの場合があります)。


これにより、F。ハウリの回答の情報が複製され、新しいコンテンツは追加されません。既存の回答にない新しい側面を追加できない限り、回答を投稿しないでください。
G-Manが「Reinstate Monica」と言う

0

dmesg 最も簡単な方法です:

dmesg | grep sd X

(デバイスの名前である、例えば)sdXsda

上記のコマンドから、次が表示されます。

  • 接続されたSCSIディスク(ハードディスク)
  • 接続されたSCSIリムーバブルディスク(リムーバブルメディア。USBフラッシュドライブなど)

dmesgカーネルの循環メッセージバッファーを読み取るため、このソリューションは再起動後に比較的最近のみ動作します
-roaima

0

以下のコマンドを使用して、SD、USB、およびSATAデバイスノードを取得できます。

usb_device="/dev/`ls -lR /dev/disk/by-id/  | grep ^l | grep 'usb' | awk '{print $NF}' | cut -d '/' -f 3 | awk 'NR == 1'`"

sata_device="/dev/`ls -lR /dev/disk/by-id/ | grep ^l | grep 'ata' | awk '{print $NF}' | cut -d '/' -f 3 | awk 'NR == 1'`"

sd_device="/dev/`ls -lR /dev/disk/by-id/   | grep ^l | grep 'mmc' | awk '{print $NF}' | cut -d '/' -f 3 | awk 'NR == 1'`"

1
(1)これがどのように質問に答えているのか私には明らかではありません。「特定の/dev/sdX場合、ローカルHDDまたはUSBキーであるかどうかはどうすればわかりますか?」決定。(2)コマンドのみを提供する回答よりも、コマンドを提供説明する回答を優先します。何をしているのか説明してください。コメントで返信しないでください。回答を編集して、より明確で完全なものにします。…(続き)
G-Manが「Reinstate Monica」と言う

(続き)…(3)  awkは非常に強力なツールです。多くの初心者が答えを投稿し、grepその出力をにパイプしますawk。これはめったに必要ではありません。awkパターンマッチングを実行でき、からの支援なしで目的の入力を選択できますgrepgrepにパイプされた2つのコマンドのパイプラインawkと、2番目の awkコマンドがあります。これは大幅に簡素化できます。してみてください。(4)また、わかりやすくするために、あなたが変更する場合があります`…`$(…)見る- このこの、およびこれを
G-Manが「Reinstate Monica」と言う

0

私は怠け者です、inxiはこれを簡単に教えてくれます:

inxi -D
Drives:    HDD Total Size: 1220.3GB (33.2% used)
           ID-1: /dev/sda model: ST380817AS size: 80.0GB
           ID-2: /dev/sdb model: WDC_WD1003FZEX size: 1000.2GB
           ID-3: USB /dev/sdc model: USB_Flash_Drive size: 140.0GB

それはまた、それがファイアワイヤであり、おそらく他の1つのタイプであるかどうかを教えてくれると信じていますが、しばらくの間それらのタイプを使用していないので、再確認する必要があります。

また、パーティションがリモート(sambaまたはnfsマウントなど)の場合、-pを使用して通知します。


-1

USBデバイスを接続したらdmesg、コンソールウィンドウで実行します。ヒントが提供されます。

たとえば、「プラグインされたデバイス、大容量記憶装置/ dev / sdd」の行に沿って何かを表示します。


2
回答が役立つように、より多くの情報/説明を提供してください。
ジョージM

2
質問に答えるときにin辱されないようにしましょう。
シャドゥール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.