hdparmはセクタを正常に読み込みましたが、cpは失敗します。

hdparmはセクタを正常に読み込みましたが、cpは失敗します。

データをコピーするドライブがありますが、cp毎回失敗して印刷されます。

cp: error reading 'path/to/always/same/file': Input/output error

出力には以下がdmesg含まれます。

[72481.869510] ata2.00: configured for UDMA/133
[72481.874133] ata2.01: configured for UDMA/133
[72481.874145] sd 1:0:1:0: [sdc] tag#0 FAILED Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
[72481.874147] sd 1:0:1:0: [sdc] tag#0 Sense Key : Medium Error [current] 
[72481.874149] sd 1:0:1:0: [sdc] tag#0 Add. Sense: Unrecovered read error - auto reallocate failed
[72481.874152] sd 1:0:1:0: [sdc] tag#0 CDB: Read(16) 88 00 00 00 00 00 f7 9f 4c 00 00 00 02 00 00 00
[72481.874154] print_req_error: I/O error, dev sdc, sector 4154412112
[72481.879316] ata2: EH complete
[72484.819205] ata2.01: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x0
[72484.824273] ata2.01: failed command: READ DMA EXT
[72484.829346] ata2.01: cmd 25/00:08:50:4c:9f/00:00:f7:00:00/f0 tag 0 dma 4096 in
                        res 51/40:00:50:4c:9f/40:00:f7:00:00/10 Emask 0x9 (media error)                                             
[72484.849742] ata2.01: status: { DRDY ERR }
[72484.854836] ata2.01: error: { UNC }

オンラインでこの問題について読んだ後、これは不良ブロックを手動で表示する必要があることに気づきました。ただし、リードコマンドを実行しても「失敗」は返されません。

$ sudo hdparm --read-sector 4154412112 /dev/sdc

/dev/sdc:
reading sector 4154412112: SG_IO: bad/missing sense data, sb[]:  70 00 03 00 00 00 00 0a 40 51 10 00 11 04 00 00 a0 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00
succeeded
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000

ここで何が起こっているのでしょうか?

答え1

hdparm成功ドライブと会話1. それが「成功」を意味します。ドライブに「SG_IO:検出されたデータエラー/損失」が表示されます。これがまさに何を意味するのかはわかりませんが、確かに良いわけではありません。hdparmそのセクタを正常に読み込めませんでした。

hdparmセクタの内容を含める必要がありますが、ゼロでいっぱいのメモリバッファを表示し続けます。これは明らかにドライブから読み取ったものではありません。

ブロックを不良としてマークすると、できるだけ早くドライブを交換する必要がありますが、しばらくドライブを使い続けるのに役立ちます。 (しかし、不良ブロックは自動的に表示される必要があります。なぜ手動で実行したいのかわかりません。)しかし、そのブロックからデータを読み取ることはできません。

1具体的に言えば、HDIO_DRIVE_TASKFILEI/W制御0を返します。 ²ソースコードを
読むと、その時点でこの特定のメッセージが表示されたことがわかります。この数が何を意味するのかわかりません。hdparmsb[0] != 0x72 || sb[7] < 14 || desc[0] != 0x09 || desc[1] < 0x0c

答え2

引用する

https://www.smartmontools.org/wiki/BadBlockHowto

そして

https://wiki.archlinux.org/index.php/Identify_damaging_files

より多くの情報を知りたいです。

つまり、debugfsやsleuthkitなどのツールを使用してどのファイルが破損しているのかを特定した後、詳細については、hdparm --read-sector「指定されたセクタ番号にゼロを書き込む」と「ドライブから不良セクタを強制的に回復する(メディアエラー)」--repair-sector(エイリアス--write-sector)試してみることができます。 、hdparm のマニュアルページを参照してください。

関連情報