Vous pouvez trouver le périphérique /dev/sdY correspondant en parcourant le /sys
arbre :
$ find /sys/devices | grep '/ata[0-9]\+/.*/block/s[^/]\+$' \
| sed '[email protected]^.\+/\(ata[0-9]\+\)/.\+/block/\(.\+\)[email protected]\1 => /dev/\[email protected]'
Avec un /sys
plus efficace traversée (cf. lsata.sh):
$ echo /sys/class/ata_port/ata*/../../host*/target*/*/block/s* | tr ' ' '\n' \
| awk -F/ '{printf("%s => /dev/%s\n", $5, $NF)}'
Exemple de sortie d'un système à 2 disques :
ata1 => /dev/sda
ata2 => /dev/sdb
Ensuite, pour identifier de manière fiable le matériel réel, vous devez mapper /dev/sdY au numéro de série, par exemple :
$ ls /dev/disk/by-id -l | grep 'ata.*sd[a-zA-Z]$'
lssci
Le lssci
L'utilitaire peut également être utilisé pour dériver le mappage :
$ lsscsi | sed '[email protected]^\[\([^:]\+\).\+\(/dev/.\+\)[email protected]\1,\[email protected]' \
| awk -F, '{ printf("ata%d => %s\n", $1+1, $2) }'
Notez que l'énumération lsscsi pertinente commence à 0 tandis que l'énumération ata commence à 0.
Syslog
Si rien d'autre ne fonctionne, on peut consulter le syslog/journal pour dériver le mappage.
Le /dev/sdY
les appareils sont créés dans le même ordre que les identifiants ataX sont énumérés dans le kern.log
tout en ignorant les périphériques sans disque (ATAPI) et les liens non connectés.
Ainsi, la commande suivante affiche le mappage :
$ grep '^May 28 2' /var/log/kern.log.0 | \
grep 'ata[0-9]\+.[0-9][0-9]: ATA-' | \
sed 's/^.*\] ata//' | \
sort -n | sed 's/:.*//' | \
awk ' { a="ata" $1; printf("%10s is /dev/sd%c\n", a, 96+NR); }'
ata1.00 is /dev/sda
ata3.00 is /dev/sdb
ata5.00 is /dev/sdc
ata7.00 is /dev/sdd
ata8.00 is /dev/sde
ata10.00 is /dev/sdf
(Notez qu'ata4 n'est pas affiché car les messages de journal ci-dessus proviennent d'un autre système.)
J'utilise /var/log/kern.log.0
et non /var/log/kern.log
car les messages de démarrage sont déjà tournés. Je grep pour May 28 2
car c'était le dernier démarrage et je veux ignorer les messages précédents.
Pour vérifier le mappage, vous pouvez effectuer quelques vérifications en examinant la sortie de :
$ grep '^May 28 2' /var/log/kern.log.0 | \
grep 'ata[0-9]\+.[0-9][0-9]: ATA-'
May 28 20:43:26 hn kernel: [ 1.260488] ata1.00: ATA-7: SAMSUNG SV0802N, max UDMA/100
May 28 20:43:26 hn kernel: [ 1.676400] ata5.00: ATA-5: ST380021A, 3.19, max UDMA/10
[..]
Et vous pouvez comparer cette sortie avec hdparm
sortie, par exemple :
$ hdparm -i /dev/sda
/dev/sda:
Model=SAMSUNG SV0802N [..]
(en utilisant le noyau 2.6.32-31)
Voici ma version, modifiée par dessus. Comme je ne connais pas la date exacte à laquelle le système a été démarré (pour le tester, c'était il y a 27 jours), et je ne sais pas quel kern.log contient les données dont j'ai besoin (certaines peuvent être gzipped
sur mon système), j'utilise uptime
et date
pour calculer une date approximative de démarrage du système (au jour près, de toute façon), puis utilisez zgrep
pour rechercher dans tous les fichiers kern.log disponibles.
J'ai aussi légèrement modifié le second grep
, car il affichera désormais également un lecteur de CD/DVD ATAPI ainsi que des lecteurs ATA-*.
Il pourrait encore être affiné (c'est-à-dire si la disponibilité du système est supérieure à un an), mais devrait fonctionner correctement pour le moment.
#!/bin/bash
uptime=$(uptime | awk -F' ' '{ print $3" "$4 }' | sed s/,//)
date=$(date -d "$uptime ago" | awk '{print $2" "$3 }')
zgrep "$date" /var/log/kern.log* | \
grep 'ata[0-9]\+.[0-9][0-9]: ATA' | \
sed 's/^.*\] ata//' | \
sort -n | sed 's/:.*//' | \
awk ' { a="ata" $1; printf("%10s is /dev/sd%c\n", a, 96+NR); }'