GNU/Linux >> Tutoriels Linux >  >> Linux

Comment mapper les identifiants ataX.0 dans les messages d'erreur kern.log aux appareils /dev/sdY réels ?

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); }'

Linux
  1. Comment remplacer un disque dur défaillant dans un RAID logiciel Linux

  2. Comment générer un mot de passe aléatoire sous Linux en utilisant /dev/random

  3. Linux :Différence entre /dev/console , /dev/tty et /dev/tty0 ?

  4. Quelle est la portabilité de /dev/stdin, /dev/stdout et /dev/stderr ?

  5. Différence entre /var/log/messages, /var/log/syslog et /var/log/kern.log ?

Comment désactiver complètement un Cronjob vers /dev/null/?

Comment mapper les périphériques /dev/sdX et /dev/mapper/mpathY à partir du périphérique /dev/dm-Z

Comment créer /dev/null ?

Linux :Différence entre /dev/console , /dev/tty et /dev/tty0

Comment Linux utilise /dev/tty et /dev/tty0

Les journaux système sont vides (/var/log/messages ; /var/log/secure ; etc.)