GNU/Linux >> Znalost Linux >  >> Linux

Jak mapovat identifikátory ataX.0 v chybových zprávách kern.log na aktuální zařízení /dev/sdY?

Odpovídající /dev/sdY zařízení můžete najít pomocí procházení /sys strom:

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

S účinnějším /sys procházení (srov. lsata.sh):

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

Příklad výstupu ze 2 diskového systému:

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

Potom pro spolehlivou identifikaci skutečného hardwaru musíte namapovat /dev/sdY na sériové číslo, např.:

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

lssci

lssci nástroj lze také použít k odvození mapování:

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

Všimněte si, že příslušný výčet lsscsi začíná od 0, zatímco výčet ata začíná od 0.

Syslog

Pokud nic jiného nefunguje, můžete se podívat na syslog/journal a odvodit mapování.

/dev/sdY zařízení jsou vytvářena ve stejném pořadí, v jakém jsou identifikátory ataxe uvedeny v kern.log při ignorování nediskových zařízení (ATAPI) a nepřipojených odkazů.

Následující příkaz tedy zobrazí mapování:

$ 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

(Všimněte si, že ata4 se nezobrazuje, protože výše uvedené zprávy protokolu jsou z jiného systému.)

Používám /var/log/kern.log.0 a ne /var/log/kern.log protože spouštěcí zprávy jsou již otočeny. Hádal jsem May 28 2 protože to byl poslední čas spouštění a chci ignorovat předchozí zprávy.

Chcete-li ověřit mapování, můžete provést některé kontroly tím, že se podíváte na výstup:

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

A tento výstup můžete porovnat s hdparm výstup, např.:

$ hdparm -i /dev/sda

/dev/sda:

Model=SAMSUNG SV0802N [..]

(pomocí jádra 2.6.32-31)


Zde je moje verze, upravená shora. Protože neznám přesné datum spuštění systému (pro testování to bylo před 27 dny) a nevím, který kern.log obsahuje data, která potřebuji (některé mohou být gzipped v mém systému), používám uptime a date Chcete-li vypočítat přibližné datum spuštění systému (v každém případě ke dni), použijte zgrep pro prohledání všech dostupných souborů kern.log.

Také jsem mírně upravil druhý grep protože nyní bude zobrazovat také jednotku ATAPI CD/DVD a jednotky ATA-*.

Stále by mohl používat upřesnění (tj. pokud je doba provozuschopnosti systému delší než rok), ale prozatím by měla fungovat OK.

#!/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. Jak vyměnit vadný pevný disk v softwarovém RAID systému Linux

  2. Jak vygenerovat náhodné heslo v linuxu pomocí /dev/random

  3. Jak Linux zpracovává více po sobě jdoucích oddělovačů cest (/home////username///soubor)?

  1. Kdy použít /dev/random vs /dev/urandom?

  2. Rozdíl mezi /var/log/messages, /var/log/syslog a /var/log/kern.log?

  3. Jak namapovat zařízení /dev/sdX a /dev/mapper/mpathY ze zařízení /dev/dm-Z

  1. Chybové zprávy „Abort command added nexus“ v souboru /var/log/messages

  2. Jak kódovat base64 /dev/random nebo /dev/urandom?

  3. Jak zaměníte /dev/sda s /dev/sdb?