Comment mapper les identificateurs ataX.0 dans les messages d'erreur kern.log sur les périphériques / dev / sdY réels?

Envisagez de suivre l'extrait de kern.log :

  ata4.00: failed command: WRITE FPDMA QUEUED ata4.00: cmd 61/00:78:40:1e:6c/04:00:f0:00:00/40 tag 15 ncq 524288 out res 41/04:00:00:00:00/04:00:00:00:00/00 Emask 0x1 (device error) ata4.00: status: { DRDY ERR } ata4.00: error: { ABRT } ata4: hard resetting link ata4: nv: skipping hardreset on occupied port ata4: SATA link up 3.0 Gbps (SStatus 123 SControl 300) ata4.00: configured for UDMA/133 ata4: EH complete 

Comment puis-je identifier quel disque dur le kernel signifie réellement quand il parle d' ata4.00 ?

Comment puis-je find le nom du périphérique /dev/sdY correspondant?

Vous pouvez find le périphérique / dev / sdY correspondant en parcourant l'arborescence /sys :

 $ find /sys/devices | grep '/ata[0-9]\+/.*/block/s[^/]\+$' \ | sed 's@^.\+/\(ata[0-9]\+\)/.\+/block/\(.\+\)$@\1 => /dev/\2@' 

Avec une traversée plus efficace /sys (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 à deux disques:

 ata1 => /dev/sda ata2 => /dev/sdb 

Ensuite, pour identifier de manière fiable le matériel réel dont vous avez besoin pour mapper / dev / sdY au numéro de série, par exemple:

 $ ls /dev/disk/by-id -l | grep 'ata.*sd[a-zA-Z]$' 

lssci

L'utilitaire lssci peut également être utilisé pour dériver le mappage:

 $ lsscsi | sed 's@^\[\([^:]\+\).\+\(/dev/.\+\)$@\1,\2@' \ | awk -F, '{ printf("ata%d => %s\n", $1+1, $2) }' 

Notez que l'énumération lsscsi pertinente commence à partir de 0 alors que l'énumération ata commence à partir de 0.

Syslog

Si rien d'autre ne fonctionne, on peut regarder le syslog / journal pour dériver le mappage.

Les périphériques /dev/sdY sont créés dans le même ordre que les identificateurs ataX sont énumérés dans kern.log tout en ignorant les périphériques non-disques (ATAPI) et les liens non connectés.

Ainsi, la command 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 que ata4 n'est pas affiché car les messages 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à pivotés. Je grep pour May 28 2 parce que c'était la dernière heure de démarrage et je veux ignorer les messages précédents.

Pour vérifier le mappage, vous pouvez effectuer des vérifications en regardant 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 la sortie hdparm , par exemple:

 $ hdparm -i /dev/sda /dev/sda: Model=SAMSUNG SV0802N [..] 

(en utilisant le kernel 2.6.32-31)

Voici ma version, modifiée d'en haut. Puisque je ne connais pas la date exacte du démarrage du système (pour tester cela il y a 27 jours), et je ne sais pas quel file kern.log contient datatables dont j'ai besoin (certaines peuvent être gzipped sur mon système), je utilisez la uptime et la date pour calculer une date d'amorçage approximative du système (à la journée, de toute façon), puis utilisez zgrep pour effectuer une search dans tous les files kern.log disponibles.

J'ai aussi légèrement modifié la deuxième instruction grep , car elle affichera également un lecteur de CD / DVD ATAPI ainsi que des lecteurs ATA- *.

Il pourrait encore utiliser le raffinement (c.-à-d. Si la disponibilité du système est supérieure à un an), mais devrait fonctionner 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); }' 

Juste eu ce même problème et trouvé une autre solution que l'on pourrait aimer.

L'outil lsscsi répertorie les périphériques SCSI (ou les hôtes) et leur atsortingbut.

Avec lsscsi on obtient le nom ata et le nom de l'appareil.

Ressemble à ça:

 $ lsscsi --long [0:0:1:0] cd/dvd MATSHITA DVD-ROM UJDA780 1.50 /dev/sr0 state=running queue_depth=1 scsi_level=6 type=5 device_blocked=0 timeout=30 [2:0:0:0] disk ATA WDC WD3000FYYZ-0 01.0 /dev/sda state=running queue_depth=1 scsi_level=6 type=0 device_blocked=0 timeout=30 [3:0:0:0] disk ATA WDC WD1002FBYS-0 03.0 /dev/sdb state=running queue_depth=1 scsi_level=6 type=0 device_blocked=0 timeout=30 [4:0:0:0] disk ATA WDC WD1002FBYS-0 03.0 /dev/sdc state=running queue_depth=1 scsi_level=6 type=0 device_blocked=0 timeout=30 [5:0:0:0] disk ATA WDC WD1002FBYS-0 03.0 /dev/sdd state=running queue_depth=1 scsi_level=6 type=0 device_blocked=0 timeout=30 [6:0:0:0] disk ATA WDC WD3000FYYZ-0 01.0 /dev/sde state=running queue_depth=1 scsi_level=6 type=0 device_blocked=0 timeout=30 [7:0:0:0] disk ATA WDC WD1002FBYS-0 03.0 /dev/sdf state=running queue_depth=1 scsi_level=6 type=0 device_blocked=0 timeout=30 

Sur Ubuntu on peut installer lsscsi simplement avec

 $ sudo apt-get install lsscsi