Linux

如何將 kern.log 錯誤消息中的 ataX.0 標識符映射到實際的 /dev/sdY 設備?

  • September 6, 2019

考慮以下kern.log程式碼段:

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

我如何辨識核心在談論時實際上意味著哪個硬碟ata4.00

如何找到對應的/dev/sdY設備名稱?

/sys您可以通過遍歷樹找到對應的 /dev/sdY 設備:

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

使用更有效的/sys遍歷(參見lsata.sh):

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

2 磁碟系統的範例輸出:

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

然後,為了可靠地辨識您需要將 /dev/sdY 映射到序列號的實際硬體,例如:

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

lsci

lssci實用程序還可用於派生映射:

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

請注意,相關的 lsscsi 列舉從 0 開始,而 ata 列舉從 0 開始。

系統日誌

如果沒有其他方法可以查看系統日誌/日誌以導出映射。

這些設備的創建順序與在忽略非磁碟設備 (ATAPI) 和未連接的連結時/dev/sdY列舉 ataX 標識符的順序相同。kern.log

因此,以下命令顯示映射:

$ 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

(注意 ata4 沒有顯示,因為上面的日誌消息來自另一個系統。)

我正在使用/var/log/kern.log.0,而不是/var/log/kern.log因為引導消息已經輪換。我 grep 是May 28 2因為這是最後一次啟動時間,我想忽略以前的消息。

要驗證映射,您可以通過查看以下輸出進行一些檢查:

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

您可以將此輸出與hdparm輸出進行比較,例如:

$ hdparm -i /dev/sda

/dev/sda:

Model=SAMSUNG SV0802N [..]

(使用核心 2.6.32-31)

引用自:https://unix.stackexchange.com/questions/13960