web-dev-qa-db-fra.com

Comment déterminer quel sd * est usb?

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

La sortie de ls /dev/sd* sur mon système est -

sda  sda1  sda2  sda3  sda4  sda5  sda6  sda7  sdb  sdc  sdc1  sdc2

Comment dois-je déterminer quel lecteur est lequel?

27
Kshitiz Sharma

En supposant que vous êtes sous Linux.

Essayer:

Sudo /lib/udev/scsi_id --page=0x80 --whitelisted --device=/dev/sdc

ou:

cat /sys/block/sdc/device/{vendor,model}

Vous pouvez également obtenir des informations (y compris des étiquettes) à partir des systèmes de fichiers sur les différentes partitions avec

Sudo blkid /dev/sdc1

Le pathid aidera à déterminer le type de périphérique:

readlink -f /sys/class/block/sdc/device

Voir également:

find /dev/disk -ls | grep /sdc

Qui avec un udev fonctionnant correctement vous donnerait toutes les informations des autres commandes ci-dessus.

Le contenu de /proc/partitions vous donnera des informations sur la taille (mais pas dans un format aussi convivial que lsblk déjà mentionné par @Max).

Sudo blockdev --getsize64 /dev/sdc

Vous donnera la taille en octets du périphérique de bloc correspondant.

Sudo smartctl -i /dev/sdc

(multi-plateforme), vous donnera également de nombreuses informations dont la marque, le modèle, la taille, les numéros de série, les révisions du firmware ...

26
Stéphane Chazelas

Échantillon finalisé bash

Il y a une petite partie d'un script que j'ai écrit pour créer et installer clé usb live , (ubuntu dual boot - debian):

La toute première partie USBKEYS=... Est la réponse à cette question

En bref, ceci:

liste les périphériques amovibles , pilotés par sd et ayant une taille non nulle .

Remarque Ce script utilise dialog qui ne semble pas installé par défaut sur Ubuntu. Mais dialog pourrait être remplacé par gdialog, whiptail ou 'zenity or even Easybashbui`.

#!/bin/bash

export USBKEYS=($(
    grep -Hv ^0$ /sys/block/*/removable |
    sed s/removable:.*$/device\\/uevent/ |
    xargs grep -H ^DRIVER=sd |
    sed s/device.uevent.*$/size/ |
    xargs grep -Hv ^0$ |
    cut -d / -f 4
))

export STICK
case ${#USBKEYS[@]} in
    0 ) echo No USB Stick found; exit 0 ;;
    1 ) STICK=$USBKEYS ;;
    * )
    STICK=$(
    bash -c "$(
        echo -n  dialog --menu \
            \"Choose wich USB stick have to be installed\" 22 76 17;
        for dev in ${USBKEYS[@]} ;do
            echo -n \ $dev \"$(
                sed -e s/\ *$//g </sys/block/$dev/device/model
                )\" ;
            done
        )" 2>&1 >/dev/tty
    )
    ;;
esac

[ "$STICK" ] || exit 0

echo $STICK...

Exemple (je viens de connecter 3 clés USB - en plus de mes 3 disques durs):

dialog preview

Le remplacement de dialog par gdialog (à la ligne 24) donne:

gdialog previw

Mais la syntaxe pourrait être utilisée avec d'autres utilitaires dialogue, comme whiptail...

Partie essentielle

export USBKEYS=($(
    grep -Hv ^0$ /sys/block/*/removable |
    sed s/removable:.*$/device\\/uevent/ |
    xargs grep -H ^DRIVER=sd |
    sed s/device.uevent.*$/size/ |
    xargs grep -Hv ^0$ |
    cut -d / -f 4
))
for dev in ${USBKEYS[@]} ;do
    echo $dev \"$(
        sed -e s/\ *$//g </sys/block/$dev/device/model
        )\" ;
  done

sdd "Storage Media"
sde "Freecom Databar"
sdf "silicon-power"

Explication détaillée

Cela utilise des bashismes:

export USBKEYS=($(                         # Declaration of *array* 'USBKEYS'
    grep -Hv ^0$ /sys/block/*/removable |  # search for *not 0* in `removable` flag of all devices
    sed s/removable:.*$/device\\/uevent/ | # replace `removable` by `device/uevent` on each line of previous answer
    xargs grep -H ^DRIVER=sd |             # search for devices drived by `SD`
    sed s/device.uevent.*$/size/ |         # replace `device/uevent` by 'size'
    xargs grep -Hv ^0$ |                   # search for devices having NOT 0 size
    cut -d / -f 4                          # return only 4th part `/` separated
))
for dev in ${USBKEYS[@]} ;do               # for each devices in USBKEY...
    echo $dev \"$(r                        # echo device name and content of model file
        sed -e s/\ *$//g </sys/block/$dev/device/model
        )\" ;
  done

Après avoir inséré trois clés USB sur mon bureau:

grep -H . /sys/block/*/removable
/sys/block/loop0/removable:0
/sys/block/loop1/removable:0
...
/sys/block/sdc/removable:0
/sys/block/sdd/removable:1
/sys/block/sde/removable:1
/sys/block/sdf/removable:1
/sys/block/sr0/removable:1

(Oui mon bureau contient 3 disques durs physiques: sda, sdb et sdc. Les premiers amovibles deviennent sdd et sde).

Donc:

grep -Hv ^0$ /sys/block/*/removable
/sys/block/sdd/removable:1
/sys/block/sde/removable:1
/sys/block/sdf/removable:1
/sys/block/sr0/removable:1

J'ai la liste des appareils amovibles,

grep -Hv ^0$ /sys/block/*/removable |
    sed s/removable:.*$/device\\/uevent/
/sys/block/sdd/device/uevent
/sys/block/sde/device/uevent
/sys/block/sdf/device/uevent
/sys/block/sr0/device/uevent

grep -Hv ^0$ /sys/block/*/removable |
    sed s/removable:.*$/device\\/uevent/ |
    xargs grep -H ^DRIVER=sd
/sys/block/sdd/device/uevent:DRIVER=sd
/sys/block/sde/device/uevent:DRIVER=sd
/sys/block/sdf/device/uevent:DRIVER=sd

J'ai la liste des périphériques amovibles pilotés par le pilote sd (c'est-à-dire pas sr, ni floppy)

grep -Hv ^0$ /sys/block/*/removable |
    sed s/removable:.*$/device\\/uevent/ |
    xargs grep -H ^DRIVER=sd |
    sed s/device.uevent.*$/size/
/sys/block/sdd/size
/sys/block/sde/size
/sys/block/sdf/size

grep -Hv ^0$ /sys/block/*/removable |
    sed s/removable:.*$/device\\/uevent/ |
    xargs grep -H ^DRIVER=sd |
    sed s/device.uevent.*$/size/ |
    xargs grep -Hv ^0$
/sys/block/sdd/size:15224832
/sys/block/sde/size:7834944
/sys/block/sdf/size:7831552

grep -Hv ^0$ /sys/block/*/removable |
    sed s/removable:.*$/device\\/uevent/ |
    xargs grep -H ^DRIVER=sd |
    sed s/device.uevent.*$/size/ |
    xargs grep -Hv ^0$ |
    cut -d / -f 4
sdd
sde
sdf

Aussi:

export USBKEYS=($(
    grep -Hv ^0$ /sys/block/*/removable |
    sed s/removable:.*$/device\\/uevent/ |
    xargs grep -H ^DRIVER=sd |
    sed s/device.uevent.*$/size/ |
    xargs grep -Hv ^0$ |
    cut -d / -f 4
))
set | grep ^USBKEYS=
USBKEYS=([0]="sdd" [1]="sde" [2]="sdf")

Et enfin:

cat /sys/block/$USBKEYS/device/model
Storage Media   

cat /sys/block/${USBKEYS[2]}/device/model
silicon-power   

mais

printf "|%s|\n" "$(</sys/block/$USBKEYS/device/model)"
|Storage Media   |

C'est parce que j'ai écrit:

echo ${USBKEYS[2]} \"$(sed -e s/\ *$//g </sys/block/${USBKEYS[2]}/device/model)\"
sde "silicon-power"

Rétréci - golfé:

Il existe une version raccourcie

US=($(cut -d/ -f4 <(grep -vl ^0$ $(sed s@device/.*@size@ <(grep -l ^DRIVER=sd $(
    sed s+/rem.*$+/dev*/ue*+ <(grep -Hv ^0$ /sys/block/*/removable)) <(:))) <(:))))

(Nota: <(:) fait un pseudo fichier vide par fork pour : C'est plus court que /dev/null Mais pas vraiment équivalent)

Deux lignes et une variable UsbSticks tenant:

set | grep ^US=
US=([0]="sde" [1]="sdf" [2]="sdg")

Ainsi, le (début de mon) script pourrait devenir:

#/bin/bash

US=($(cut -d/ -f4 <(grep -vl ^0$ $(sed s@device/.*@size@ <(grep -l ^DRIVER=sd $(
    sed s+/rem.*$+/dev*/ue*+ <(grep -Hv ^0$ /sys/block/*/removable)) <(:))) <(:))))
case ${#US[@]} in 0)echo "No USB stick found.";exit 0;;1)S=$US;;*)S=$(sh -c "$(
    sed -nre 's@/sys/block/(.*)/device/model:(.*)$@\1 "\2"@;H;${x;s/\n/ /g;
      s/^/whiptail --menu "Choose an USB stick" 22 76 14/;p}' <(grep -H . $(
     printf /sys/block/%s/device/model\\n ${US[@]})))" 2>&1 >/dev/tty) ;; esac
whiptail --defaultno --yesno "Could I destroy content of $S!?" 10 70 6 || exit 0
12
F. Hauri

Sur la version récente de Linux, il y a /dev/disk/by-{id,label,path,uuid} répertoires qui contiennent des liens symboliques automagiques vers les différentes entrées/dev/sdX et/dev/sdXN (je crois que tout cela est configuré par udev). Ceux-ci fournissent des noms plus stables et informatifs pour vos disques et partitions. Je trouve /dev/disk/by-label/ la plus utile (surtout si vous étiquetez vos partitions de système de fichiers), mais by-path peut être plus utile pour votre cas d'utilisation.

9
P.T.

udev connaît votre système. vous pouvez donc obtenir des informations via udevadm, sous /sys/ comme ça (exécuté en tant que root, ou avec Sudo selon votre distribution)

udevadm info -a -p /sys/block/sdb

udevadm info -a -p /sys/block/sdc

en lisant la sortie, vous rencontrerez des résultats significatifs, tels que

ATTRS{vendor}
ATTRS{model}

vous devriez pouvoir obtenir des informations sur lequel est l'USB. en plus la variable

SUBSYSTEM=="usb"

devrait vous donner un bon indice que nous parlons d'une clé USB.

puis lisez la variable KERNEL pour comprendre quel périphérique sd * est l'USB.

D'autres commandes qui peuvent être utiles sont lshw qui répertorie tout votre matériel par connexion, lsusb qui répertorie les périphériques USB mais n'affiche pas la lettre sd * qui a été fournie. dmesg vous donnera également toutes les informations nécessaires si vous le tapez juste après avoir connecté l'USB à votre ordinateur.

Ce sont toutes des commandes CLI, si vous préférez quelque chose de plus GUI comme un autre garçon pourra vous aider davantage dans cette direction.

7
nass

Vous pouvez également utiliser la commande lsscsi qui affiche diverses informations sur les périphériques SCSI connectés (obtenues à partir de/proc et/sys). Vous êtes intéressé par les informations de transport, donc lsscsi -t | grep usb vous indiquera quel appareil utilise le transport USB.

3
Petr Uzel

Il est très probable que votre lecteur système soit sda étant donné le grand nombre de partitions. Pour vous en assurer, vous pouvez utiliser la sortie de mount, df -h ou lsblk et recherchez où / est situé. Évitez ce lecteur.

En dehors de cela, sdb et sdc sont des candidats valides. Les monter et regarder le contenu est le moyen le plus sûr. Ce qui pourrait être plus rapide est aussi simple que de tirer le bâton et de regarder lequel disparaît (ou de le comparer à la sortie de dmesg après l'avoir réinséré (il devrait vous dire quel /dev/ nom qu'il a obtenu)

2
Max

Mon préféré, en supposant que le lecteur n'est pas nécessaire pour faire fonctionner le système, est de comparer la liste des répertoires avec et sans le lecteur USB dans le système.

1
jwernerny

Une façon simple consiste à rechercher dans/dev/disk/by-id/- il contient une batterie de liens symboliques pointant vers tous les nœuds de lecteur et de partition du système. Les noms des liens symboliques identifient le type, la marque et le modèle d'interface du lecteur et le numéro de série et peuvent être utilisés comme identifiant unique persistant pour chaque lecteur.

Par exemple

$ ls -lF /dev/disk/by-id/usb-Generic_Flash_Disk*
lrwxrwxrwx 1 root root  9 Jan  5 11:10 /dev/disk/by-id/usb-Generic_Flash_Disk_CAAE91F7-0:0 -> ../../sdo
lrwxrwxrwx 1 root root 10 Jan  5 11:10 /dev/disk/by-id/usb-Generic_Flash_Disk_CAAE91F7-0:0-part1 -> ../../sdo1

cela a l'air beaucoup mieux sur un terminal à colonnes larges bien sûr :)

Je trouve l'alias suivant utile pour obtenir une liste rapide de tous les disques (mais pas les partitions) du système:

alias list_disks='ls -lF /dev/disk/by-id/{scsi,usb}-* | grep sd.$'

J'aurais inclus un exemple de sortie de mon serveur de fichiers zfsonlinux à la maison, mais cela semble vraiment moche ici, la largeur du champ de texte est loin d'être assez large.

1
cas