web-dev-qa-db-ja.com

カーネルATAの例外が発生した場合、どの物理ディスクが影響を受けているかを特定する方法は?

私は今朝目を覚ますと、かなり不穏なシステムログエントリがいくつかある通知メールが届きました。

_Dec  2 04:27:01 yeono kernel: [459438.816058] ata2.00: exception Emask 0x0 SAct 0xf SErr 0x0 action 0x6 frozen
Dec  2 04:27:01 yeono kernel: [459438.816071] ata2.00: failed command: WRITE FPDMA QUEUED
Dec  2 04:27:01 yeono kernel: [459438.816085] ata2.00: cmd 61/08:00:70:0d:ca/00:00:08:00:00/40 tag 0 ncq 4096 out
Dec  2 04:27:01 yeono kernel: [459438.816088]          res 40/00:00:00:4f:c2/00:00:00:00:00/40 Emask 0x4 (timeout)
Dec  2 04:27:01 yeono kernel: [459438.816095] ata2.00: status: { DRDY }
  (the above five lines were repeated a few times at a short interval)
Dec  2 04:27:01 yeono kernel: [459438.816181] ata2: hard resetting link
Dec  2 04:27:02 yeono kernel: [459439.920055] ata2: SATA link down (SStatus 0 SControl 300)
Dec  2 04:27:02 yeono kernel: [459439.932977] ata2: hard resetting link
Dec  2 04:27:09 yeono kernel: [459446.100050] ata2: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
Dec  2 04:27:09 yeono kernel: [459446.314509] ata2.00: configured for UDMA/133
Dec  2 04:27:09 yeono kernel: [459446.328037] ata2.00: device reported invalid CHS sector 0
  ("reported invalid CHS sector 0" repeated a few times at a short interval)
_

私はシステム全体の夜間バックアップを外付け(USB接続)ドライブに完全に作成しましたが、上記はそのバックアップの実行中に発生しました。 (バックアップはcronを介して04:00に始まり、今夜の04:56の直前にログに記録された完了です。)バックアッププロセス自体は、エラーなしで完了したと主張します。

私のシステムには、2つの内部接続されたSATAドライブと2つの外部(USB)接続されたドライブがあります。外付けドライブの1つが現在休止しています。どの物理SATAポートがどの内部ドライブに使用されているか、頭の上から覚えていません。

グーグルで見つけたとき AskUbuntuの質問これはドライブの障害か何かですか? これは、8〜10 GBがドライブにコピーされた後に非常に類似したエラーが発生したことを示していますが、実際の障害モードは次のように異なりました。ドライブが読み取り専用状態に切り替わりました。唯一の真の類似点は、昨夜、メインストレージに7〜8 GBのデータを追加したことです。これは、エラーが発生した頃にバックアップされていました。

smartdは、どちらの内蔵ドライブでも異常を報告していません。残念ながらsmartctlは外部バックアップドライブのUSBブリッジの言語を話せず、単にUnknown USB bridge [0x0bc2:0x3320 (0x100)]について文句を言います。その特定のエラーをグーグル検索することは明らかに役に立たなかった。

私のメインデータストレージとバックアップはZFSにあり、_zpool status_は0エラーを報告し、既知のデータエラーは報告しません。それでも、内部ドライブと外部ドライブの両方で完全なスクラブを開始しました。現在、内蔵ドライブ(メインストレージプール)の場合は約6時間、バックアップドライブの場合は13〜14時間で完了する予定です。

次のステップは、問題のあるドライブを特定し、場合によってはそれを交換することです。 _ata2.00_部分おそらくは、問題が発生していたドライブを示しますが、-その識別子を物理ドライブにマップするにはどうすればよいですか?

19
a CVn

Tobi Hahn answer に基づいてワンライナーを書きました。

たとえば、ata3を表すデバイスを知りたいとします。

ata=3; ls -l /sys/block/sd* | grep $(grep $ata /sys/class/scsi_Host/host*/unique_id | awk -F'/' '{print $5}')

このようなものが生成されます

lrwxrwxrwx 1 root root 0 Jan 15 15:30 /sys/block/sde -> ../devices/pci0000:00/0000:00:1f.5/Host2/target2:0:0/2:0:0:0/block/sde
15
insider

次のコマンドを使用します。

ls -l /sys/block/sd* | sed 's/.*\(sd.*\) -.*\(ata.*\)\/h.*/\2 => \1/'

私のシステムでは、これは出力を生成します:

ata1 => sda
ata2 => sdb
ata3 => sdc
ata4 => sdd
ata7 => sde
ata8 => sdf

これは、すべてのディスクが同じドライブモデルを持っている場合でも機能します(これらの6つのディスクの間には、2つの異なるモデルしかない)。これはsysfsの命名に依存し、私のカーネル3.10.17で機能することに注意してください。過去のある時点で、マッピングを取得するのがこれほどクリーンでなかったことがわかっていますが、これがどのカーネルバージョンの最初のバージョンで機能するかはわかりません。

うまくいかない場合は、このリンクを参照して、マッピングを決定するためのより回り道のある方法を参照してください。 http://www.miriup.de/index.php?option=com_content&view=article&id=84:mapping- linux-kernel-ata-errors-to-a-device&catid = 8:linux&Itemid = 25

8
casey

マッピングを行うことは、私が思っていたよりも簡単であることがわかりました。

dmesg | grep ata2 | headは、起動プロセス中のカーネルのドライブのマッピングを提供します。または、すぐにata2.00に行くこともできます。

[    2.448300] ata2: SATA max UDMA/133 abar m1024@0xfeb0b000 port 0xfeb0b180 irq 19
[    2.940139] ata2: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
[    2.942143] ata2.00: ATA-8: ST31000340NS, SN05, max UDMA/133
[    2.942149] ata2.00: 1953525168 sectors, multi 16: LBA48 NCQ (depth 31/32)
[    2.944573] ata2.00: configured for UDMA/133
  (and some stuff I'd rather never have to see about drive errors)

ご覧のとおり、これらの行の1つにドライブのモデル番号(ST31000340NS)が含まれており、これを使用して/devファイルにマップできます。

$ readlink /dev/disk/by-id/*ST31000340NS* | head -n1
../../sda
7
a CVn

これは、すべてを理解するためのオンラインですsd*デバイス:

LC_ALL=C ls -l /sys/block/sd* | Perl -npe 's#^.*?block/(sd[^/ ]+).*?/pci0000:00/0000:([^/]+/(?:ata[0-9]+|usb[0-9]+/[^/]+/[^/]+|[0-9:.]+/[^/]+/[^/]+)).*#$1 = $2#'

私にとって、出力は次のようになります

sda = 00:01.0/0000:01:00.0/Host0/port-0:0
sdb = 00:01.0/0000:01:00.0/Host0/port-0:1
sdc = 00:01.0/0000:01:00.0/Host0/port-0:2
sdd = 00:01.0/0000:01:00.0/Host0/port-0:3
sde = 00:1d.0/usb2/2-1/2-1.5
sdf = 00:1f.2/ata3
sdg = 00:1f.2/ata4
sdh = 00:1f.2/ata6

出力はかなり読みやすいはずで、PCI ExpressデバイスとUSBデバイスも正常です。次に、デバイスのスタートを使用して、実際のハードウェア接続を把握できます。たとえば、上記の例では01:00.0は、4つの200GB SSDサブデバイスを搭載したIntel SSD 910 PCI Expressカードです。 lspci -nn | grep -F 01:00.0同じハードウェアの出力は

01:00.0 Serial Attached SCSI controller [0107]: LSI Logic / Symbios Logic SAS2008 PCI-Express Fusion-MPT SAS-2 [Falcon] [1000:0072] (rev 03)

したがって、カーネルはsda...sddがLSI Logic PCI-Express SAS-2コントローラに接続されていると見なします。残念ながら、このデバイスが本当にIntel SSD 910 PCI Expressカードであることを簡単に「知る」方法はないようです。

1