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섹터 내용을 포함해야 하지만 0으로 가득 찬 메모리 버퍼를 계속 표시합니다. 이는 분명히 드라이브에서 읽은 내용이 아닙니다.

블록을 불량으로 표시하면 가능한 한 빨리 드라이브를 교체해야 하지만 한동안 드라이브를 계속 사용하는 데 도움이 될 수 있습니다. (그러나 불량 블록은 자동으로 표시되어야 합니다. 왜 수동으로 수행하려는지 모르겠습니다.) 그러나 해당 블록에서 데이터를 읽을 수는 없습니다.

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보려면 "지정된 섹터 번호에 0 쓰기" 및 "드라이브에서 불량 섹터를 강제로 복구(미디어 오류)" --repair-sector(별칭 --write-sector)를 사용해 볼 수 있습니다. , hdparm 매뉴얼 페이지를 참조하십시오.

관련 정보