GNU/Linux >> Linux Esercitazione >  >> Linux

Come mappare gli identificatori ataX.0 nei messaggi di errore kern.log ai dispositivi /dev/sdY effettivi?

Puoi trovare il corrispondente dispositivo /dev/sdY attraversando il /sys albero:

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

Con un /sys più efficiente attraversamento (cfr. lsata.sh):

$ echo /sys/class/ata_port/ata*/../../host*/target*/*/block/s* | tr ' ' '\n' \
    | awk -F/ '{printf("%s => /dev/%s\n", $5, $NF)}'

Esempio di output da un sistema a 2 dischi:

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

Quindi, per identificare in modo affidabile l'hardware effettivo è necessario mappare /dev/sdY al numero di serie, ad esempio:

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

lssci

Il lssci l'utility può anche essere utilizzata per derivare la mappatura:

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

Nota che l'enumerazione lsscsi pertinente inizia da 0 mentre l'enumerazione ata inizia da 0.

Registro di sistema

Se nient'altro funziona, puoi guardare il syslog/journal per derivare la mappatura.

Il /dev/sdY i dispositivi vengono creati nello stesso ordine in cui gli identificatori ataX vengono enumerati nel kern.log ignorando i dispositivi non disco (ATAPI) e i collegamenti non connessi.

Pertanto, il seguente comando visualizza la mappatura:

$ 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

(Notare che ata4 non viene visualizzato perché i messaggi di registro di cui sopra provengono da un altro sistema.)

Sto usando /var/log/kern.log.0 e non /var/log/kern.log perché i messaggi di avvio sono già ruotati. Io grep per May 28 2 perché questo è stato l'ultimo avvio e voglio ignorare i messaggi precedenti.

Per verificare la mappatura puoi fare alcuni controlli guardando l'output di:

$ 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
[..]

E puoi confrontare questo output con hdparm output, ad esempio:

$ hdparm -i /dev/sda

/dev/sda:

Model=SAMSUNG SV0802N [..]

(utilizzando il kernel 2.6.32-31)


Ecco la mia versione, modificata dall'alto. Dal momento che non conosco la data esatta in cui il sistema è stato avviato (per testarlo è stato 27 giorni fa), e non so quale kern.log contenga i dati di cui ho bisogno (alcuni potrebbero essere gzipped sul mio sistema), utilizzo uptime e date per calcolare una data approssimativa di avvio del sistema (al giorno, comunque), quindi utilizzare zgrep per cercare in tutti i file kern.log disponibili.

Ho anche leggermente modificato il secondo grep istruzione, poiché ora mostrerà anche un'unità CD/DVD ATAPI e unità ATA-*.

Potrebbe ancora essere perfezionato (ad esempio se il tempo di attività del sistema è superiore a un anno), ma per ora dovrebbe funzionare correttamente.

#!/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. Come sostituire un disco rigido guasto nel software RAID Linux

  2. Quanto sono portatili /dev/stdin, /dev/stdout e /dev/stderr?

  3. Quando usare /dev/random vs /dev/urandom?

  4. Come silenziare completamente un Cronjob in /dev/null/?

  5. Messaggi di errore "Interruzione comando emesso nexus" nel file /var/log/messages

Come creare /dev/null?

Linux:differenza tra /dev/console , /dev/tty e /dev/tty0

Come Linux usa /dev/tty e /dev/tty0

echo o print /dev/stdin /dev/stdout /dev/stderr

Perché sono necessari < o > per usare /dev/tcp

I log di sistema sono vuoti (/var/log/messages; /var/log/secure; ecc.)