Bagaimana cara mengetahui apakah / dev / sdX adalah USB atau HDD yang terhubung?

23

Bagaimana saya bisa tahu apakah itu HDD lokal atau kunci USB? Saya lebih suka cara melakukan ini tanpa hak root./dev/sdX

Oke, udevadmbanyak membantu:

Untuk HDD lokal:

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

Untuk kunci USB:

udevadm info --query=all --name=sdc | grep ID_BUS
E: ID_BUS=usb
bunga aster
sumber
superuser.com/questions/361885/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

15

Ada beberapa cara untuk mengetahuinya tanpa root privilege, banyak dari mereka tricky / hacky:

Menggunakan /dev/disk/by-id:

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

Jika ini merespons dengan sesuatu seperti /dev/disk/by-id/usb-blah-blah-blah, maka itu adalah disk USB. Prefiks lainnya termasuk ata, dm, memstick, scsi, dll

Penggunaannya /dev/disk/by-pathtidak jauh berbeda:

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

Anda akan mendapatkan sesuatu seperti /dev/disk/by-path/pci-0000:00:1d.7-usb-0:1:1.0-scsi-0:0:0:0. Ini menunjukkan jalur perangkat yang mengarah ke disk. Dalam kasus ini, jalur kasar adalah PCI → USB → disk. (perhatikan -usb-).

Menggunakan udev (saya menjalankan Debian. My udevadmberada di /sbinmana bukan pada saya $PATH- milik Anda mungkin ada di tempat lain, hidup atau mati $PATH):

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

Anda akan mendapatkan jenis bus tempat perangkat aktif. Hapus | grep ID_BUSuntuk daftar lengkap informasi (Anda mungkin perlu menambahkan |less).

Jika Anda telah lshwmenginstal, jawaban Huygens juga dapat berfungsi:

lshw -class disk -class storage | less

Dan lihat output untuk disk Anda. Di less, coba /sdX dan lihat baris sebelumnya bus info- yang pertama hanya akan mengatakan scsi@…, tetapi beberapa baris sebelum akan lebih mencerahkan. Namun, Anda benar - benar harus menjalankan ini sebagai superuser sehingga mungkin tidak cocok. (Gejala: pada laptop saya mencobanya, terdaftar disk SATA tetapi tidak yang USB - berjalan dengan sudoterdaftar keduanya)

Ada yang lain juga, lebih atau kurang langsung daripada yang ini.

Alexios
sumber
Apakah ada cara untuk membedakan drive SATA internal versus drive SATA eksternal yang terhubung esatap?
CMCDragonkai
10

Saya tahu solusinya, tetapi, sayangnya, ini membutuhkan root privilege. Bagaimanapun, Anda mungkin masih menemukan itu berguna:

sudo lshw -class disk -class storage

Untuk setiap perangkat itu akan mencetak nama logis (misalnya, /dev/sda) dan info bus, yang dalam hal perangkat USB akan menjadi sesuatu seperti 'usb @ 1: 2'.

Output sampel:

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

Anda bisa menggunakan lsblk:

lsblk -apa nama, tran
NAME TRAN
sda  sata
sdb  sata
sdd  usb

di mana -datau --nodepscara tidak mencetak budak dan -o name,tranatau --output name,tranberarti hanya mencantumkan nama perangkat dan jenis transportasi perangkat. Tambahkan rmke daftar kolom output untuk melihat perangkat mana yang dapat dilepas ( 1jika true):

lsblk --nodeps --output NAME, TRAN, RM
NAME TRAN   RM
sda  sata    0
sdb  sata    0
sdd  usb     1
don_crissti
sumber
Saya mencari ini dalam jawaban
Eduard Florinescu
4

Ini tidak memerlukan hak akses root (tetapi banyak dari perintah ini menggunakan dan bergantung pada bashism, sehingga mereka tidak akan bekerja di semua shell yang sesuai dengan POSIX):

Ada cara cepat untuk bertanya tentang :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

File yang sangat menarik adalah capability. Di Debian saya, saya punya genhd.hfile, jadi:

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

Sama sekali, hanya untuk mengetahui apakah bendera removabledisetel:

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

begitu

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

bekerja dengan menguji apakah capabilitynilai (yang 52 dalam sdacontoh saya , di atas) memiliki 1set bit (yaitu, apakah itu angka ganjil).

Tapi Linux merender semua flag /sys, jadi meminta /sys/block/sdX/removablejauh lebih mudah! ;-)

Jadi kunci USB bisa removable, tapi karena ada banyak dilepas perangkat, saya lebih suka untuk memastikan bahwa ukuran medium lebih besar dari 0 (seperti nampan CD-ROM diturunkan, untuk sampel) dan bahwa perangkat ini tidak di gunakan: Dalam menonton yang sdX/trace/enabletidak terikat:

Nota: Semua ini diuji dengan baik pada bash v4.2 +.

Di bawah , Anda dapat menggunakan cara yang sangat cepat dan efisien ini:

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

Pada sistem saya, ada 4 kunci USB, tetapi salah satu dari mereka ( sde) sudah terpasang, sehingga perintah sebelumnya output:

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

Skrip saya:

Ada sedikit fungsi saya tulis untuk menginstal Debian Live yang ditingkatkan.

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

# Bagian pertama hanya membuat ukuran yang bisa dibaca manusia. Fungsi dimulai di sana.

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
}

Ini memberikan jawaban, sebagai array , ke variabel yang diberikan sebagai argumen pertama atau ke variabel $REPLY:

chooseFreeUsbKey stick

echo "$stick"
sdf

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

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

(Bidang terakhir mungkin berisi spasi.)

F. Hauri
sumber
Terima kasih kepada @StephaneChazelas karena menjadikan bagian pertama dari jawaban saya lebih mudah dibaca.
F. Hauri
1
(1) Mengapa Anda memiliki kurung kurawal bersarang? Apakah yang Anda maksud …,device/{model,type,vendor,uevent}? (2) Bisakah Anda jelaskan perintah GENHD Anda dan perintah "lacak / aktifkan"? (3) [ $(( $(< $file ) & 1 )) -ne 0 ]Tes Anda dapat disederhanakan (disingkat) menjadi (( $(< $file ) & 1 )).
G-Man Mengatakan 'Reinstate Monica'
@ G-Man (1) Ya, +1 untuk ini! Saya tidak mengerti bagaimana tipo ini diperkenalkan. (2) File header hard disk Generik harus ada di /usr/src/*/include/linux. Coba sed -ne 's/#define.*GENHD_FL_\([A-Z0-9_]*\)[ \t]*\([0-9]*\) \?.*$/GENHD_FLAGS[\2]="\1"/p;' /usr/src/*/include/linux/genhd.h. (3) Ya.
F. Hauri
0

Saya sarankan hanya menggunakan hdparmatau lshw(yang Anda mungkin perlu menginstal), dan menggunakan sudountuk menjalankannya sebagai root.

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

semua harus memberi Anda informasi.

EightBitTony
sumber
hdparm pada disk virtual:hdparm -i /dev/sda /dev/sda: HDIO_DRIVE_CMD(identify) failed: Invalid exchange HDIO_GET_IDENTITY failed: Invalid argument
Tim
Yah, saya katakan harus dan itu bekerja di sini dengan disk virtual.
EightBitTony
0

Cukup baca nilai /sys/block/sdX/removable.

Sebagai contoh:

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

/dev/sdc adalah kunci USB (bisa berupa kartu SD atau media yang dapat dilepas lainnya).

Jérôme Pouiller
sumber
Ini menggandakan informasi dalam jawaban F. Hauri dan tidak menambahkan konten baru. Harap jangan memposting jawaban kecuali Anda dapat menambahkan aspek baru yang tidak ditemukan dalam jawaban yang ada.
G-Man Mengatakan 'Reinstate Monica'
0

dmesg adalah metode termudah:

dmesg | grep sd X

( menjadi nama perangkat Anda, misalnya, )sdXsda

Dari perintah di atas, Anda akan melihat yang berikut:

  • Disk SCSI terlampir (hard disk)
  • Diska lepas pasang SCSI (media lepas-pasang; seperti, USB flash drive)
jncc99
sumber
dmesgmembaca buffer pesan melingkar kernel sehingga solusi ini hanya akan bekerja relatif baru setelah reboot
roaima
0

Anda dapat menggunakan perintah di bawah ini untuk mendapatkan node perangkat SD, USB, dan 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'`"
lovek
sumber
1
(1) Tidak jelas bagi saya bagaimana ini menjawab pertanyaan, yaitu, “Untuk hal tertentu /dev/sdX, bagaimana saya bisa tahu apakah itu HDD lokal atau kunci USB?” Tolong jelaskan bagaimana OP dapat menggunakan perintah Anda untuk membuat itu penentuan. (2) Kami lebih suka jawaban yang memberi perintah dan menjelaskannya daripada jawaban yang hanya memberikan perintah. Tolong jelaskan apa yang Anda lakukan. Tolong jangan menanggapi dalam komentar; edit jawaban Anda untuk membuatnya lebih jelas dan lebih lengkap. … (Lanjutan)
G-Man Mengatakan 'Reinstate Monica'
(Lanjutan) ... (3)  awkadalah alat yang sangat kuat. Banyak pemula memposting jawaban yang melakukan grepdan menyalurkan hasilnya awk. Ini jarang diperlukan; awkdapat melakukan pencocokan pola dan dapat memilih input yang diinginkan tanpa bantuan dari grep. Anda memiliki pipa dua grepperintah, disalurkan ke awk, dan kemudian perintah kedua awk . Ini bisa sangat disederhanakan; tolong coba. (4) Juga, untuk kejelasan, Anda mungkin ingin mengubah `…`untuk $(…)- lihat ini , ini , dan ini .
G-Man Mengatakan 'Reinstate Monica'
0

Saya malas, inxi memberi tahu saya ini dengan mudah:

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

Saya percaya ini juga memberi tahu saya apakah itu firewire dan mungkin satu jenis lainnya, tapi saya harus mengeceknya, belum pernah menggunakan jenis itu untuk sementara waktu.

Ini juga memberitahu saya menggunakan -p jika partisi jarak jauh, seperti samba atau nfs mounts.

Lizardx
sumber
-1

Setelah Anda mencolokkan perangkat USB, jalankan dmesgdi jendela konsol. Anda akan diberikan beberapa petunjuk.

Sebagai contoh ia akan mengatakan sesuatu di sepanjang baris "Perangkat terpasang, penyimpanan massal / dev / sdd".

Tim
sumber
2
Berikan lebih banyak informasi / klarifikasi untuk membuat jawaban Anda berguna.
George M
2
Bagaimana kalau tidak menghina saat menjawab pertanyaan?
Shadur