GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo asignar identificadores ataX.0 en mensajes de error kern.log a dispositivos /dev/sdY reales?

Puede encontrar el dispositivo /dev/sdY correspondiente atravesando el /sys árbol:

$ 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 más eficiente recorrido (cf. lsata.sh):

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

Ejemplo de salida de un sistema de 2 discos:

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

Luego, para identificar de manera confiable el hardware real, debe asignar /dev/sdY al número de serie, por ejemplo:

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

lssci

El lssci La utilidad también se puede utilizar para derivar el mapeo:

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

Tenga en cuenta que la enumeración lsscsi relevante comienza desde 0 mientras que la enumeración ata comienza desde 0.

Registro del sistema

Si nada más funciona, se puede consultar el syslog/journal para derivar la asignación.

El /dev/sdY los dispositivos se crean en el mismo orden que los identificadores ataX se enumeran en el kern.log mientras ignora los dispositivos que no son de disco (ATAPI) y los enlaces no conectados.

Por lo tanto, el siguiente comando muestra la asignació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

(Tenga en cuenta que ata4 no se muestra porque los mensajes de registro anteriores son de otro sistema).

estoy usando /var/log/kern.log.0 y no /var/log/kern.log porque los mensajes de arranque ya están rotados. Busco May 28 2 porque esta fue la última vez que arranqué y quiero ignorar los mensajes anteriores.

Para verificar el mapeo, puede hacer algunas comprobaciones mirando el resultado 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
[..]

Y puedes comparar esta salida con hdparm salida, por ejemplo:

$ hdparm -i /dev/sda

/dev/sda:

Model=SAMSUNG SV0802N [..]

(usando el núcleo 2.6.32-31)


Aquí está mi versión, modificada desde arriba. Como no sé la fecha exacta en que se inició el sistema (para probar esto fue hace 27 días), y no sé qué kern.log contiene los datos que necesito (algunos pueden ser gzipped en mi sistema), uso uptime y date para calcular una fecha aproximada de inicio del sistema (al día, de todos modos), luego use zgrep para buscar en todos los archivos kern.log disponibles.

También modifiqué ligeramente el segundo grep declaración, ya que ahora también mostrará una unidad de CD/DVD ATAPI, así como unidades ATA-*.

Todavía podría usar el refinamiento (es decir, si el tiempo de actividad del sistema es mayor a un año), pero debería funcionar bien por ahora.

#!/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. Cómo reemplazar un disco duro fallido en el software RAID de Linux

  2. Linux:¿Diferencia entre /dev/console, /dev/tty y /dev/tty0?

  3. ¿Diferencia entre /var/log/messages, /var/log/syslog y /var/log/kern.log?

  4. Mensajes de error "Cancelar comando emitido nexus" en el archivo /var/log/messages

  5. ¿Cómo codificar en base64 /dev/random o /dev/urandom?

Cómo mapear dispositivos /dev/sdX y /dev/mapper/mpathY desde el dispositivo /dev/dm-Z

¿Cómo crear/dev/null?

Linux:diferencia entre /dev/console, /dev/tty y /dev/tty0

hacer eco o imprimir /dev/stdin /dev/stdout /dev/stderr

¿Por qué se requieren < o > para usar /dev/tcp?

Los registros del sistema están vacíos (/var/log/messages; /var/log/secure; etc.)