Comment savoir si / dev / sdX est un USB ou un disque dur connecté?


23

Comment puis-je savoir s'il s'agit d'un disque dur local ou d'une clé USB? Je préférerais une façon de faire cela sans privilèges root./dev/sdX

OK, udevadma beaucoup aidé:

Pour le disque dur local:

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

Pour la clé USB:

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

Réponses:


15

Il y a plusieurs façons de dire sans privilèges root, beaucoup d'entre elles sont difficiles / hacky:

En utilisant /dev/disk/by-id:

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

Si cela répond avec quelque chose comme /dev/disk/by-id/usb-blah-blah-blah, alors c'est un disque USB. D' autres préfixes comprennent ata, dm, memstick,scsi , etc.

L'utilisation /dev/disk/by-pathn'est pas très différente:

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

Vous obtiendrez quelque chose comme /dev/disk/by-path/pci-0000:00:1d.7-usb-0:1:1.0-scsi-0:0:0:0. Cela montre le chemin du périphérique menant au disque. Dans ce cas, un chemin approximatif est PCI → USB → disque. (noter la-usb- ).

Utiliser udev (je lance Debian. Mon udevadmest dans /sbince qui n'est pas sur mon $PATH- le vôtre peut être ailleurs, sur ou hors de votre $PATH):

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

Vous obtiendrez le type de bus sur lequel l'appareil est allumé. Supprimez le | grep ID_BUSpour la liste complète des informations (vous devrez peut-être ajouter|less ).

Si vous avez lshwinstallé, la réponse de Huygens peut également fonctionner:

lshw -class disk -class storage | less

Et regardez la sortie de votre disque. Dans less, essayez /sdX et regardez les bus infolignes précédentes - la première va juste dire scsi@…, mais celle plusieurs lignes avant sera plus éclairante. Cependant, vous avez vraiment devriez exécuter ce que le super - utilisateur afin qu'il ne soit pas approprié. (symptômes: sur l'ordinateur portable, je l'ai essayé, il indiquait le disque SATA mais pas celui USB - fonctionnant avecsudo les deux répertoriés)

Il y en a aussi d'autres, plus ou moins directs que ceux-là.


Existe-t-il des moyens de distinguer un disque SATA interne d'un disque SATA externe connecté esatap?
CMCDragonkai,

10

Je connais une solution, mais, malheureusement, elle nécessite un privilège root. Quoi qu'il en soit, vous pourriez toujours le trouver utile:

sudo lshw -class disk -class storage

Pour chaque périphérique, il affichera le nom logique (par exemple, /dev/sda ) et les informations de bus, qui dans le cas d'un périphérique USB serait quelque chose comme «usb @ 1: 2».

Exemple de sortie:

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

Vous pouvez utiliser lsblk:

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

-dor --nodepsmoyens n'impriment pas les esclaves et -o name,tranou --output name,tranmoyens ne répertorient que le nom du périphérique et le type de transport de périphérique. Ajoutez rmà la liste des colonnes de sortie pour voir quels périphériques sont amovibles ( 1si true):

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

Je cherchais cela dans les réponses
Eduard Florinescu

4

Cela n'a pas besoin des privilèges root (mais beaucoup de ces commandes utilisent et dépendent des bashismes, donc elles ne fonctionneront pas dans tous les shells compatibles POSIX):

Il existe un moyen rapide de poser des questions sur :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

Le fichier vraiment intéressant est capability. Sur mon Debian, j'ai un genhd.hfichier, donc:

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

Pour ne savoir que si le drapeau removableest défini:

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

alors

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

fonctionne en testant si la capabilityvaleur (qui est 52 dans mon sdaexemple, ci-dessus) a le 1bit défini (c'est-à-dire s'il s'agit d'un nombre impair).

Mais Linux affiche tous les drapeaux /sys, donc demander /sys/block/sdX/removableest beaucoup plus simple! ;-)

Donc, une clé USB pourrait être removable, mais comme il y a beaucoup de périphériques amovibles , je préférerais m'assurer que la taille du support est supérieure à 0 (comme un plateau de CD-ROM déchargé, par exemple) et que le périphérique n'est pas en utiliser: En regardant celasdX/trace/enable n'est pas lié:

Nota: Tout cela est bien testé sur bash v4.2 +.

Sous , vous pouvez utiliser cette méthode très rapide et efficace:

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

Sur mon système, il y a 4 clés USB, mais l'une d'entre elles ( sde) est déjà montée, donc la sortie de commande précédente:

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

Mon script:

Il y a une petite fonction j'ai écrite pour installer Debian Live mise à jour.

#!/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 première partie rend uniquement la taille lisible par l'homme. La fonction commence 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
}

Cela affecte la réponse, sous forme de tableau , à la variable donnée comme premier argument ou à la variable $REPLY:

chooseFreeUsbKey stick

echo "$stick"
sdf

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

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

(Le dernier champ peut contenir des espaces.)


Merci à @StephaneChazelas d'avoir rendu la première partie de ma réponse plus lisible.
F.Hauri

1
(1) Pourquoi avez-vous des accolades imbriquées? Tu veux dire …,device/{model,type,vendor,uevent}? (2) Pouvez-vous expliquer vos commandes GENHD et vos commandes «trace / enable»? (3) Votre [ $(( $(< $file ) & 1 )) -ne 0 ]test peut être simplifié (raccourci) en (( $(< $file ) & 1 )).
G-Man dit `` Réintègre Monica ''

@ G-Man (1) Oui, +1 pour cela! Je ne comprends pas comment ce tipo a été introduit. (2) Le fichier d'en- tête du disque dur générique doit être présent dans /usr/src/*/include/linux. Essayez sed -ne 's/#define.*GENHD_FL_\([A-Z0-9_]*\)[ \t]*\([0-9]*\) \?.*$/GENHD_FLAGS[\2]="\1"/p;' /usr/src/*/include/linux/genhd.h. (3) Oui.
F.Hauri

0

Je suggère simplement d'utiliser hdparmou lshw(que vous devrez peut-être installer) et d'utiliser sudopour l'exécuter en tant que root.

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

devraient tous vous donner des informations.


hdparm sur un disque virtuel:hdparm -i /dev/sda /dev/sda: HDIO_DRIVE_CMD(identify) failed: Invalid exchange HDIO_GET_IDENTITY failed: Invalid argument
Tim

Eh bien, je l'ai dit devrait et cela fonctionne ici avec des disques virtuels.
EightBitTony

0

Il suffit de lire la valeur de /sys/block/sdX/removable .

Par exemple:

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

/dev/sdc est une clé USB (il peut s'agir d'une carte SD ou de tout autre support amovible).


Cela duplique les informations dans la réponse de F. Hauri et n'ajoute aucun nouveau contenu. Veuillez ne pas publier de réponse, sauf si vous pouvez ajouter de nouveaux aspects qui ne se trouvent dans aucune réponse existante.
G-Man dit `` Réintègre Monica ''

0

dmesg est la méthode la plus simple:

dmesg | grep sd X

( étant le nom de votre appareil, par exemple,sdXsda )

De la commande ci-dessus, vous verrez ce qui suit:

  • Disque SCSI attaché (disque dur)
  • Disque amovible SCSI attaché (support amovible, tel qu'un lecteur flash USB)

dmesglit le tampon de messages circulaire du noyau afin que cette solution ne fonctionne que relativement récemment après un redémarrage
roaima

0

Vous pouvez utiliser les commandes ci-dessous pour obtenir des nœuds de périphérique SD, USB et 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/sdXJe ne sais pas comment cela répond à la question, qui est: «Pour tout particulier , comment puis-je savoir s'il s'agit d'un disque dur local ou d'une clé USB?» Veuillez expliquer comment l'OP peut utiliser vos commandes pour faire cela. détermination. (2) Nous préférons les réponses qui donnent des commandes et les expliquons aux réponses qui ne fournissent que des commandes. Veuillez expliquer ce que vous faites. Veuillez ne pas répondre dans les commentaires; modifiez votre réponse pour la rendre plus claire et plus complète. … (Suite)
G-Man dit «Réintègre Monica»

(Suite)… (3)  awkest un outil très puissant. De nombreux débutants publient des réponses qui font un grepet dirigent sa sortie vers awk. Ceci est rarement nécessaire; awkpeut faire une correspondance de modèle et peut sélectionner l'entrée souhaitée sans l'aide de grep. Vous disposez d'un pipeline de deux grepcommandes, redirigées vers awk, puis une deuxième awk commande. Cela peut être grandement simplifié; s'il vous plaît essayez. (4) Aussi, pour plus de clarté, vous voudrez peut-être changer `…`pour $(…)- voir ceci , ceci et ceci .
G-Man dit `` Réintègre Monica ''

0

Je suis paresseux, inxi me le dit facilement:

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

Je crois que cela me dit également s'il s'agit de FireWire et peut-être d'un autre type, mais je devrais vérifier, je n'ai pas utilisé ces types depuis un moment.

Il me dit également d'utiliser -p si les partitions sont distantes, comme les montures samba ou nfs.


-1

Après avoir branché le périphérique USB, exécutez dmesg dans une fenêtre de console. Des conseils vous seront fournis.

Par exemple, il indiquera quelque chose du type "Appareil branché, stockage de masse / dev / sdd".


2
Veuillez fournir plus d'informations / clarifications pour rendre votre réponse utile.
George M

2
Que diriez-vous de ne pas être insultant en répondant à une question?
Shadur
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.