Cómo asociar identificadores de ataX.0 en posts de error kern.log a dispositivos / dev / sdY reales?

Considere seguir kern.log snippet:

  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: configunetworking for UDMA/133 ata4: EH complete 

¿Cómo puedo identificar qué disco duro realmente significa el kernel cuando habla de ata4.00 ?

¿Cómo puedo encontrar el nombre del dispositivo /dev/sdY correspondiente?

Solutions Collecting From Web of "Cómo asociar identificadores de ataX.0 en posts de error kern.log a dispositivos / dev / sdY reales?"

Puede encontrar el dispositivo / dev / sdY correspondiente al atravesar el tree /sys :

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

Con un cruce más eficiente /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)}' 

Ejemplo de salida de un sistema de 2 discos:

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

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

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

lssci

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

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

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

Syslog

Si nada funciona, uno puede mirar syslog / journal para derivar la asignación.

Los dispositivos /dev/sdY se crean en el mismo order en que se enumeran los identificadores de ataX en kern.log sin tener en count los dispositivos que no son de disco (ATAPI) y los enlaces no conectados.

Por lo tanto, el siguiente command 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 count que ata4 no se muestra porque los posts de logging anteriores son de otro sistema).

Estoy usando /var/log/kern.log.0 y no /var/log/kern.log porque los posts de inicio ya están girados. Me grep para May 28 2 porque este fue el último time de arranque y quiero ignorar los posts anteriores.

Para verificar la asignación, 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 puede comparar esta salida con la salida de hdparm , por ejemplo:

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

(usando Kernel 2.6.32-31)

Aquí está mi versión, modificada desde arriba. Como no sé la date 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 tener gzipped en mi sistema), utilice el uptime y la date para calcular una date aproximada de inicio del sistema (al día, de todos modos), luego use zgrep para search a través de todos los files kern.log disponibles.

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

Todavía podría usar refinamiento (es decir, si el time 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); }' 

Acabo de tener el mismo problema y encontré otra solución que podría gustarme.

La herramienta lsscsi enumera los dispositivos SCSI (o hosts) y sus attributes.

Con lsscsi uno obtiene el nombre de ata y el nombre del dispositivo.

Se ve como esto:

 $ 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 

En Ubuntu uno puede instalar lsscsi simplemente con

 $ sudo apt-get install lsscsi