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