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 'example@unixlinux.online^.\+/\(ata[0-9]\+\)/.\+/block/\(.\+\)example@unixlinux.online\1 => /dev/\example@unixlinux.online'
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 'example@unixlinux.online^\[\([^:]\+\).\+\(/dev/.\+\)example@unixlinux.online\1,\example@unixlinux.online' \
| 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); }'