Come sapere se / dev / sdX è un USB o HDD collegato?


23

Come posso sapere se è un HDD locale o una chiave USB? Preferirei un modo per farlo senza i privilegi di root./dev/sdX

OK, udevadmaiutato molto:

Per HDD locale:

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

Per chiave USB:

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

Risposte:


15

Ci sono alcuni modi per dire senza i privilegi di root, molti dei quali complicati / hacky:

Utilizzando /dev/disk/by-id:

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

Se questo risponde con qualcosa del genere /dev/disk/by-id/usb-blah-blah-blah, allora è un disco USB. Altri prefissi includono ata, dm, memstick, scsi, etc.

L'uso /dev/disk/by-pathnon è significativamente diverso:

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

Otterrai qualcosa di simile /dev/disk/by-path/pci-0000:00:1d.7-usb-0:1:1.0-scsi-0:0:0:0. Questo mostra il percorso del dispositivo che porta al disco. In questo caso, un percorso approssimativo è il disco PCI → USB →. (nota il -usb-).

Usando udev (corro Debian. Il mio udevadmè in /sbincui non è sul mio $PATH- il tuo potrebbe essere altrove, dentro o fuori il tuo $PATH):

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

Otterrai il tipo di bus su cui è acceso il dispositivo. Rimuovere il | grep ID_BUSper l'elenco completo delle informazioni (potrebbe essere necessario aggiungere |less).

Se hai lshwinstallato, la risposta di Huygens potrebbe anche funzionare:

lshw -class disk -class storage | less

E guarda attraverso l'output del tuo disco. In less, prova /sdX e guarda le bus inforighe precedenti : il primo dirà semplicemente scsi@…, ma quello più righe prima sarà più illuminante. Tuttavia, è davvero necessario eseguire questo come superutente quindi potrebbe non essere adatto. (sintomi: sul portatile l'ho provato, elencava il disco SATA ma non quello USB - funzionando con sudoentrambi elencati)

Ce ne sono anche altri, più o meno diretti di questi.


Esistono modi per distinguere un'unità SATA interna rispetto a un'unità SATA esterna collegata esatap?
CMCDragonkai,

10

Conosco una soluzione, ma, purtroppo, richiede il privilegio di root. Ad ogni modo, potresti ancora trovarlo utile:

sudo lshw -class disk -class storage

Per ogni dispositivo stamperà il nome logico (ad es. /dev/sda) E le informazioni sul bus, che nel caso di un dispositivo USB sarebbe simile a "usb @ 1: 2".

Uscita campione:

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

Puoi usare lsblk:

lsblk -do nome, tran
NAME TRAN
sda  sata
sdb  sata
sdd  usb

dove -do --nodepsmezzo non stampa gli slave e / -o name,trano --output name,tranelenca solo il nome del dispositivo e il tipo di trasporto del dispositivo. Aggiungi rmall'elenco delle colonne di output per vedere quali dispositivi sono rimovibili ( 1se true):

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

Lo stavo cercando nelle risposte
Eduard Florinescu,

4

Questo non ha bisogno dei privilegi di root (ma molti di questi comandi usano e dipendono da bashismi, quindi non funzioneranno in tutte le shell conformi a POSIX):

C'è un modo rapido per chiedere un :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

Il file davvero interessante è capability. Sul mio Debian, ho un genhd.hfile, quindi:

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

Assolutamente, per sapere solo se removableè impostato flag :

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

così

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

funziona verificando se il capabilityvalore (che è 52 nel mio sdaesempio sopra) ha il 1bit impostato (ovvero se si tratta di un numero dispari).

Ma Linux rende tutte le bandiere /sys, quindi chiedere /sys/block/sdX/removableè molto più semplice! ;-)

Quindi, una chiave USB potrebbe essere removable, ma come ci sono un sacco di rimovibili dispositivi, preferirei per assicurare che la dimensione del mezzo è maggiore di 0 (come un cassetto del CD-ROM a vuoto, per esempio) e che il dispositivo è , non a uso: nell'osservare che sdX/trace/enablenon è vincolato:

Nota: tutto ciò è ben testato su bash v4.2 +.

Sotto , potresti usare questo modo molto rapido ed efficiente:

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

Sul mio sistema, ci sono 4 chiavi USB, ma una di queste ( sde) è già montata, quindi l'output del comando precedente:

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

La mia sceneggiatura:

C'è una piccola funzione ho scritto per installare Debian Live aggiornato.

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

# La prima parte rende solo le dimensioni leggibili dall'uomo. La funzione inizia lì.

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
}

Questo assegna la risposta, come una matrice , alla variabile data come primo argomento o alla variabile $REPLY:

chooseFreeUsbKey stick

echo "$stick"
sdf

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

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

(L'ultimo campo può contenere spazi.)


Grazie a @StephaneChazelas per aver reso più leggibile la prima parte della mia risposta.
F. Hauri,

1
(1) Perché hai le parentesi graffe nidificate? Intendi …,device/{model,type,vendor,uevent}? (2) Puoi spiegare i tuoi comandi GENHD e i tuoi comandi "trace / enable"? (3) Il [ $(( $(< $file ) & 1 )) -ne 0 ]test può essere semplificato (abbreviato) in (( $(< $file ) & 1 )).
G-Man dice "Reinstate Monica"

@ G-Man (1) Sì, +1 per questo! Non capisco come sia stato introdotto questo tipo. (2) Il file di intestazione del disco rigido generico deve essere presente in /usr/src/*/include/linux. Prova sed -ne 's/#define.*GENHD_FL_\([A-Z0-9_]*\)[ \t]*\([0-9]*\) \?.*$/GENHD_FLAGS[\2]="\1"/p;' /usr/src/*/include/linux/genhd.h. (3) Sì.
F. Hauri,

0

Suggerisco solo di utilizzare hdparmo lshw(che potrebbe essere necessario installare) e di utilizzarlo sudoper eseguirlo come root.

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

tutti dovrebbero darti informazioni.


hdparm su un disco virtuale:hdparm -i /dev/sda /dev/sda: HDIO_DRIVE_CMD(identify) failed: Invalid exchange HDIO_GET_IDENTITY failed: Invalid argument
Tim

Bene, ho detto che dovrebbe e funziona qui con i dischi virtuali.
EightBitTony,

0

Basta leggere il valore di /sys/block/sdX/removable.

Per esempio:

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

/dev/sdc è una chiave USB (potrebbe essere una scheda SD o qualsiasi altro supporto rimovibile).


Questo duplica le informazioni nella risposta di F. Hauri e non aggiunge nuovi contenuti. Si prega di non pubblicare una risposta a meno che non sia possibile aggiungere nuovi aspetti non presenti in alcuna risposta esistente.
G-Man dice "Reinstate Monica"

0

dmesg è il metodo più semplice:

dmesg | grep sd X

( essendo il nome del tuo dispositivo, ad es. )sdXsda

Dal comando sopra, vedrai quanto segue:

  • Disco SCSI collegato (disco rigido)
  • Disco rimovibile SCSI collegato (supporto rimovibile; ad esempio, unità flash USB)

dmesglegge il buffer circolare dei messaggi del kernel, quindi questa soluzione funzionerà solo relativamente di recente dopo un riavvio
roaima,

0

È possibile utilizzare i comandi seguenti per ottenere nodi di dispositivo SD, USB e 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) Non è ovvio per me come questo risponda alla domanda, che è: "Per ogni particolare /dev/sdX, come posso sapere se si tratta di un HDD locale o una chiave USB?" Spiegare come l'OP può utilizzare i comandi per farlo determinazione. (2) Preferiamo le risposte che danno comandi e le spiegano piuttosto che le risposte che forniscono solo comandi. Per favore, spiega cosa stai facendo. Si prega di non rispondere nei commenti; modifica la tua risposta per renderla più chiara e completa. ... (proseguendo)
G-Man dice "Ripristina Monica"

(Proseguendo) ... (3)  awkè uno strumento molto potente. Molti principianti pubblicano risposte che eseguono grepe convogliano il proprio output awk. Questo è raramente necessario; awkpuò fare la corrispondenza del modello e può selezionare l'input desiderato senza aiuto da grep. È disponibile una pipeline di due grepcomandi, reindirizzati awke quindi un secondo awk comando. Questo può essere notevolmente semplificato; vi preghiamo di provare. (4) Inoltre, per maggiore chiarezza, potresti voler passare `…`a $(…)- guarda questo , questo e questo .
G-Man dice "Reinstate Monica"

0

Sono pigro, inxi mi dice facilmente:

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

Credo che mi dica anche se è firewire e forse un altro tipo, ma dovrei ricontrollare, non uso questi tipi da un po '.

Mi dice anche di usare -p se le partizioni sono remote, come monta samba o nfs.


-1

Dopo aver collegato il dispositivo USB, eseguire dmesg in una finestra della console. Ti verranno forniti alcuni suggerimenti.

Ad esempio, dirà qualcosa sulla falsariga di "Dispositivo collegato, memoria di massa / dev / sdd".


2
Fornisci ulteriori informazioni / chiarimenti per rendere utile la tua risposta.
George M,

2
Che ne dici di non essere offensivo quando rispondi a una domanda?
Shadur,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.