Làm thế nào để biết / dev / sdX là USB hoặc ổ cứng được kết nối?


23

Làm thế nào tôi có thể biết nếu là một ổ cứng cục bộ hoặc USB? Tôi muốn một cách để làm điều này mà không có quyền root./dev/sdX

OK, udevadmđã giúp rất nhiều:

Đối với ổ cứng cục bộ:

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

Đối với khóa USB:

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

Câu trả lời:


15

Có một số cách để nói mà không có quyền root, nhiều trong số đó là khó khăn / hacky:

Sử dụng /dev/disk/by-id:

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

Nếu điều này đáp ứng với một cái gì đó như /dev/disk/by-id/usb-blah-blah-blah, thì đó là một đĩa USB. Tiền tố khác bao gồm ata, dm, memstick, scsivv

Sử dụng /dev/disk/by-pathkhông khác biệt đáng kể:

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

Bạn sẽ nhận được một cái gì đó như /dev/disk/by-path/pci-0000:00:1d.7-usb-0:1:1.0-scsi-0:0:0:0. Điều này cho thấy đường dẫn thiết bị dẫn đến đĩa. Trong trường hợp này, một đường dẫn thô là PCI → USB → đĩa. (lưu ý -usb-).

Sử dụng udev (tôi chạy Debian của tôi. udevadmLà trong /sbinđó không có trong tôi $PATH- bạn có thể ở đâu đó, hoặc tắt của bạn $PATH):

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

Bạn sẽ nhận được loại xe buýt thiết bị được bật. Xóa | grep ID_BUSdanh sách thông tin đầy đủ (bạn có thể cần thêm |less).

Nếu bạn đã lshwcài đặt, câu trả lời của Huygens cũng có thể hoạt động:

lshw -class disk -class storage | less

Và xem qua đầu ra cho đĩa của bạn. Trong less, hãy thử /sdX và nhìn vào các dòng trước bus info- dòng đầu tiên sẽ chỉ nói scsi@…, nhưng một vài dòng trước nó sẽ được khai sáng hơn. Tuy nhiên, bạn thực sự nên chạy nó như là siêu người dùng để nó có thể không phù hợp. (triệu chứng: trên máy tính xách tay tôi đã dùng thử, nó liệt kê đĩa SATA nhưng không phải là USB - chạy với sudocả hai được liệt kê)

Có những cái khác nữa, nhiều hay ít trực tiếp hơn những cái này.


Có cách nào để phân biệt ổ SATA bên trong so với ổ SATA ngoài được kết nối esatapkhông?
CMCDragonkai

10

Tôi biết một giải pháp, nhưng, thật đáng buồn, nó đòi hỏi đặc quyền root. Dù sao, bạn vẫn có thể thấy nó hữu ích:

sudo lshw -class disk -class storage

Đối với mỗi thiết bị, nó sẽ in tên logic (ví dụ /dev/sda:) và thông tin xe buýt, trong trường hợp thiết bị USB sẽ có dạng như 'usb @ 1: 2'.

Đầu ra mẫu:

[...]
  *-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

Bạn có thể sử dụng lsblk:

lsblk -do tên, tran
NAME TRAN
sda  sata
sdb  sata
sdd  usb

trong đó -dhoặc --nodepsphương tiện không in nô lệ và -o name,tranhoặc --output name,tranchỉ liệt kê tên của loại vận chuyển thiết bị và thiết bị. Thêm rmvào danh sách các cột đầu ra để xem thiết bị nào có thể tháo rời ( 1nếu true):

lsblk --nodeps - TÊN TÊN, TRẦN, RM
NAME TRAN   RM
sda  sata    0
sdb  sata    0
sdd  usb     1

Tôi đã tìm kiếm điều này trong các câu trả lời
Eduard Florinescu

4

Điều này không cần đặc quyền gốc (nhưng nhiều lệnh trong số này sử dụng và phụ thuộc vào bashism, vì vậy chúng sẽ không hoạt động trong tất cả các shell tuân thủ POSIX):

Có một cách nhanh chóng để hỏi về :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

Các tập tin thực sự thú vị là capability. Trên Debian của tôi, tôi có một genhd.htập tin, vì vậy:

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

Ở tất cả, chỉ để biết nếu cờ removableđược đặt:

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

vì thế

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

hoạt động bằng cách kiểm tra xem capabilitygiá trị (là 52 trong sdaví dụ của tôi ở trên) có tập 1bit hay không (nghĩa là nó có phải là số lẻ hay không).

Nhưng Linux kết xuất tất cả các cờ vào /sys, vì vậy yêu cầu /sys/block/sdX/removableđơn giản hơn rất nhiều! ;-)

Vì vậy, một chìa khóa USB có thể được removable, nhưng như có rất nhiều di động thiết bị, tôi muốn để đảm bảo rằng kích thước của môi trường lớn hơn 0 (giống như một khay đĩa CD-ROM dỡ, cho mẫu) rằng thiết bịkhông trong sử dụng: Trong khi xem mà sdX/trace/enablekhông bị ràng buộc:

Nota: Tất cả điều này đã được thử nghiệm tốt trên bash v4.2 +.

Trong , bạn có thể sử dụng cách rất nhanh chóng và hiệu quả này:

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

Trên hệ thống của tôi, có 4 phím USB, nhưng một trong số chúng ( sde) đã được gắn, do đó, đầu ra lệnh trước đó:

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

Kịch bản của tôi:

Có một chức năng nhỏ mà tôi đã viết để cài đặt Debian Live được nâng cấp.

#!/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]}
}

# Phần đầu tiên chỉ hiển thị kích thước có thể đọc được của con người. Các chức năng bắt đầu từ đó.

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
}

Điều này gán câu trả lời, dưới dạng một mảng , cho biến được đưa ra làm đối số đầu tiên hoặc cho biến $REPLY:

chooseFreeUsbKey stick

echo "$stick"
sdf

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

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

(Trường cuối cùng có thể chứa khoảng trắng.)


Cảm ơn @StephaneChazelas vì đã làm cho phần đầu tiên trong câu trả lời của tôi dễ đọc hơn.
F. Hauri

1
(1) Tại sao bạn có niềng răng lồng nhau? Ý bạn là …,device/{model,type,vendor,uevent}sao (2) Bạn có thể giải thích các lệnh GENHD của bạn và các lệnh theo dõi / kích hoạt của bạn không? (3) Bài [ $(( $(< $file ) & 1 )) -ne 0 ]kiểm tra của bạn có thể được đơn giản hóa (rút ngắn) thành (( $(< $file ) & 1 )).
G-Man nói 'Phục hồi Monica'

@ G-Man (1) Có, +1 cho việc này! Tôi không hiểu làm thế nào tipo này đã được giới thiệu. (2) Tệp tiêu đề đĩa cứng chung phải có trong /usr/src/*/include/linux. Hãy thử sed -ne 's/#define.*GENHD_FL_\([A-Z0-9_]*\)[ \t]*\([0-9]*\) \?.*$/GENHD_FLAGS[\2]="\1"/p;' /usr/src/*/include/linux/genhd.h. (3) Có.
F. Hauri

0

Tôi đề nghị chỉ sử dụng hdparmhoặc lshw(mà bạn có thể cần phải cài đặt) và sử dụng sudođể thực thi nó dưới quyền root.

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

Tất cả nên cung cấp cho bạn thông tin.


hdparm trên đĩa ảo:hdparm -i /dev/sda /dev/sda: HDIO_DRIVE_CMD(identify) failed: Invalid exchange HDIO_GET_IDENTITY failed: Invalid argument
Tim

Vâng, tôi đã nói nên và nó hoạt động ở đây với các đĩa ảo.
EightBitTony

0

Chỉ cần đọc giá trị của /sys/block/sdX/removable.

Ví dụ:

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

/dev/sdc là một khóa USB (nó có thể là thẻ SD hoặc bất kỳ phương tiện di động nào khác).


Điều này trùng lặp thông tin trong câu trả lời của F. Hauri và không thêm nội dung mới. Vui lòng không đăng câu trả lời trừ khi bạn có thể thêm các khía cạnh mới không tìm thấy trong bất kỳ câu trả lời hiện có nào.
G-Man nói 'Phục hồi Monica'

0

dmesg là phương pháp dễ nhất:

dmesg | grep sd X

( là tên của thiết bị của bạn, vd, )sdXsda

Từ lệnh trên, bạn sẽ thấy như sau:

  • Đĩa SCSI đính kèm (đĩa cứng)
  • Đĩa di động SCSI đính kèm (phương tiện di động; như ổ flash USB)

dmesgđọc bộ đệm thông điệp vòng tròn của hạt nhân, vì vậy giải pháp này sẽ chỉ hoạt động tương đối gần đây sau khi khởi động lại
roaima

0

Bạn có thể sử dụng các lệnh dưới đây để nhận các nút thiết bị SD, USB và 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) Nó không rõ ràng đối với tôi như thế nào này trả lời câu hỏi, đó là, “Đối với bất kỳ đặc biệt /dev/sdX, làm thế nào tôi có thể biết nếu nó là một HDD địa phương hoặc một phím USB?” Xin giải thích như thế nào OP có thể sử dụng các lệnh của bạn để làm cho điều đó sự quyết tâm. (2) Chúng tôi thích các câu trả lời đưa ra các lệnh và giải thích chúng hơn các câu trả lời chỉ cung cấp các lệnh. Hãy giải thích những gì bạn đang làm. Xin vui lòng không trả lời trong các ý kiến; chỉnh sửa câu trả lời của bạn để làm cho nó rõ ràng và đầy đủ hơn. Tiết (Cont'd)
G-Man nói 'Phục hồi'

(Tiếp theo), (3)  awklà một công cụ rất mạnh. Nhiều người mới bắt đầu đăng câu trả lời mà làm một grepvà dẫn đầu ra của nó vào awk. Điều này hiếm khi cần thiết; awkcó thể thực hiện khớp mẫu và có thể chọn đầu vào mong muốn mà không cần trợ giúp grep. Bạn có một đường dẫn gồm hai greplệnh, được dẫn vào awkvà sau đó là lệnh thứ hai awk . Điều này có thể được đơn giản hóa rất nhiều; Vui lòng thử. (4) Ngoài ra, để rõ ràng, bạn có thể muốn thay đổi `…`thành $(…)- xem cái này , cái nàycái này .
G-Man nói 'Phục hồi Monica'

0

Tôi lười biếng, inxi nói với tôi điều này một cách dễ dàng:

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

Tôi tin rằng nó cũng cho tôi biết nếu đó là firewire và có thể là một loại khác, nhưng tôi phải kiểm tra lại, đã không sử dụng những loại đó trong một thời gian.

Nó cũng cho tôi biết bằng cách sử dụng -p nếu các phân vùng ở xa, như samba hoặc nfs mount.


-1

Sau khi bạn cắm thiết bị USB, hãy chạy dmesgtrong cửa sổ giao diện điều khiển. Bạn sẽ được cung cấp một số gợi ý.

Ví dụ, nó sẽ nói một cái gì đó dọc theo dòng "Thiết bị được cắm, bộ lưu trữ lớn / dev / sdd".


2
Vui lòng cung cấp thêm thông tin / làm rõ để làm cho câu trả lời của bạn hữu ích.
George M

2
Làm thế nào về việc không bị xúc phạm khi trả lời một câu hỏi?
Shadur
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.