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?
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 ...
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):
Le remplacement de dialog
par gdialog
(à la ligne 24) donne:
Mais la syntaxe pourrait être utilisée avec d'autres utilitaires dialogue, comme whiptail
...
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"
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"
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
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.
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.
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.
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)
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.
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.