/ 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 , this 및 this를$(…) 참조하십시오 .
— 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.