/ dev / sdX가 연결된 USB 또는 HDD인지 확인하는 방법은 무엇입니까?


23

로컬 HDD 또는 USB 키 인지 어떻게 알 수 있습니까? 루트 권한 없이이 작업을 수행하는 방법을 선호합니다./dev/sdX

좋습니다, 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 디스크입니다. 다른 접두사를 포함 ata, dm, memstick, scsi, 등

사용법 /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에 사용 (I 데비안을 실행 내가. udevadm/sbin내에서하지 않은 $PATH- 당신이 또는 당신을, 다른 수 있습니다 $PATH) :

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

장치가있는 버스 유형을 얻게됩니다. | grep ID_BUS전체 정보 목록을 보려면를 제거 하십시오 (추가해야 할 수도 있음 |less).

이 경우 lshw설치, 호이겐스 '대답은 할 수 도 작동 :

lshw -class disk -class storage | less

디스크의 출력을 살펴보십시오. 에서 sdX를 less시도 /하고 앞의 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-이름, 트란
NAME TRAN
sda  sata
sdb  sata
sdd  usb

여기서 -d또는 --nodeps수단은 슬레이브를 인쇄하지 않으며 -o name,tran또는 --output name,tran장치 이름과 장치 전송 유형 만 나열합니다. rm출력 열 목록에 추가 하여 제거 가능한 장치를 확인하십시오 ( 1if true).

lsblk --nodeps-출력 NAME, TRAN, RM
NAME TRAN   RM
sda  sata    0
sdb  sata    0
sdd  usb     1

나는 대답에서 이것을 찾고 있었다
Eduard Florinescu

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. 데비안에는 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비트 세트가 있는지 (즉, 홀수인지 ) 테스트하여 작동합니다 .

그러나 리눅스는의 모든 플래그를 렌더링 /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 키가 있지만 그 중 하나 ( sde)가 이미 마운트되어 있으므로 이전 명령 출력이 표시됩니다.

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

내 스크립트 :

업그레이드 된 데비안 라이브를 설치하기 위해 작성한 작은 기능 이 있습니다 .

#!/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. Hauri

1
(1) 왜 중괄호가 중첩되어 있습니까? 당신은 의미 …,device/{model,type,vendor,uevent}합니까? (2) GENHD 명령과“추적 / 활성화”명령을 설명해 주시겠습니까? (3) [ $(( $(< $file ) & 1 )) -ne 0 ]테스트는로 단순화 (단축) 될 수 있습니다 (( $(< $file ) & 1 )).
G-Man, 'Reinstate

@ G-Man (1) 예, +1입니다! 이 tipo가 어떻게 도입되었는지 이해할 수 없습니다. (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루트로 실행.

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
Tim

글쎄, 나는 말했다 해야 하며 가상 디스크를 여기에 사용할 수 있습니다.
EightBitTony

0

의 값을 읽으십시오 /sys/block/sdX/removable.

예를 들면 다음과 같습니다.

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

/dev/sdc USB 키입니다 (SD 카드 또는 기타 이동식 미디어 일 수 있음).


이것은 F. Hauri의 답변에 정보를 복제 하고 새로운 내용을 추가하지 않습니다. 기존 답변에서 찾을 수없는 새로운 측면을 추가 할 수 없다면 답변을 게시하지 마십시오.
G-Man, 'Reinstate

0

dmesg 가장 쉬운 방법입니다.

dmesg | grep sd X

( 예 : 기기 이름 )sdXsda

위의 명령에서 다음을 볼 수 있습니다.

  • 연결된 SCSI 디스크 (하드 디스크)
  • 연결된 SCSI 이동식 디스크 (이동식 미디어 (예 : USB 플래시 드라이브))

dmesg커널의 순환 메시지 버퍼를
읽으므로이

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

(계속)… (3)  awk은 매우 강력한 도구입니다. 많은 초보자가 답변을 게시 grep하고 결과를에 파이프합니다 awk. 이것은 거의 필요하지 않습니다. awk패턴 일치를 수행하고의 도움없이 원하는 입력을 선택할 수 있습니다 grep. 두 가지의 파이프 라인이 grep명령에 파이프 awk한 다음 두 번째 awk 명령을 사용합니다. 이것은 크게 단순화 될 수 있습니다. 시도하십시오. (4) 또한 명확성을 위해 다음 `…`으로 변경하고 싶을 수도 있습니다. this , thisthis를$(…) 참조하십시오 .
G-Man, 'Reinstate

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

나는 그것이 firewire이거나 다른 유형 일지 모른다고 나에게 믿지만, 한 번 더 사용하지 않은 이중 확인이 필요합니다.

또한 파티션이 samba 또는 nfs 마운트와 같이 원격 인 경우 -p를 사용하도록 알려줍니다.


-1

USB 장치를 연결 한 후 dmesg콘솔 창에서 실행하십시오 . 힌트가 제공됩니다.

예를 들어 "Device plugged in, mass storage / dev / sdd"줄에 무언가가 있습니다.


2
답변을 유용하게하려면 자세한 정보 / 설명을 제공하십시오.
George M

2
질문에 대답 할 때 모욕하지 않는 것은 어떻습니까?
Shadur
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.