최근에 커널 메시지가 나타났습니다:
ata3.00: exception Emask 0x0 SAct 0x1 SErr 0x0 action 0x0
ata3.00: irq_stat 0x40000008
ata3.00: failed command: READ FPDMA QUEUED
ata3.00: cmd 60/08:00:98:b2:78/00:00:13:00:00/40 tag 0 ncq 4096 in
res 41/40:08:9a:b2:78/00:00:13:00:00/00 Emask 0x409 (media error) <F>
ata3.00: status: { DRDY ERR }
ata3.00: error: { UNC }
ata3.00: SB600 AHCI: limiting to 255 sectors per cmd
ata3.00: SB600 AHCI: limiting to 255 sectors per cmd
ata3.00: configured for UDMA/133
sd 2:0:0:0: [sda] Unhandled sense code
sd 2:0:0:0: [sda] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
sd 2:0:0:0: [sda] Sense Key : Medium Error [current] [descriptor]
Descriptor sense data with sense descriptors (in hex):
72 03 11 04 00 00 00 0c 00 0a 80 00 00 00 00 00
13 78 b2 9a
sd 2:0:0:0: [sda] Add. Sense: Unrecovered read error - auto reallocate failed
sd 2:0:0:0: [sda] CDB: Read(10): 28 00 13 78 b2 98 00 00 08 00
end_request: I/O error, dev sda, sector 326677146
ata3: EH complete
나는 오류를 수정하고 디스크를 복구하는 데 사용한 복잡한 프로세스를 자세히 설명했습니다. 그런 다음 그것을 게시하는 것을 귀찮게 하지 않았습니다(이번 주말에 게시할 것이라고 생각했습니다).
지금 내가 하고 싶은 것은 프로세스를 자동화하는 프로그램을 만드는 것입니다. 이렇게 하려면 "커널 오류를 잡아야" 합니다.
트랩이란 다음을 의미합니다. 1) 오류를 발생시킨 시스템 호출을 종료합니다. 저는 이와 같은 오류로 인해 하드 드라이브가 중단되고 프로세스 실행이 완료될 때까지 다른 시스템 명령 호출의 요청이 무시되는 경우가 많다는 것을 확인했습니다. 다른 호출에서 오류를 반환하는 경우가 많습니다. 진단 절차를 통해 잘못된 작동이 원인으로 식별됩니다.
2) 호출 프로세스에 일종의 신호를 보내 그것이 범인임을 알립니다.
제안?
답변1
이를 "원인"시킨 프로그램(실제로는 불량 하드웨어로 인해 발생했으며 더 적절하게는 "피해자 프로그램")이 더 이상 존재하지 않을 수도 있습니다.
예를 들어 쓰기를 보낸 다음 종료합니다. 쓰기 작업은 커널이 쓰기 저장을 수행할 때까지 커널 버퍼에 유지됩니다. 이때 I/O 오류가 발생할 수 있습니다.
프로그램이 실행될 때하다그래도 오류가 통보되었습니다. 예를 들어 로 read
설정합니다 . (이 오류는 , , 또는 에서도 발생할 수 있습니다 .)errno
EIO
write
fsync
fdatasync
close
영원히 걸리는 이유는 커널과는 아무런 관련이 없으며 전적으로 드라이버입니다. 드라이브가 손상된 섹터를 이해할 수 있는지 확인하기 위해 읽기를 다시 시도하는 데 시간이 걸립니다. 이 작업을 원하지 않는 경우(예를 들어 RAID에서 실행 중이고 섹터를 디스크 미러로 다시 정렬하는 경우) smartctl을 사용하여 SCT 오류 복구 제어 설정을 변경할 수 있습니다. 기업용이 아닌 많은 디스크는 이 기능을 지원하지 않습니다.
RAID(또는 이와 유사한 것)의 경우를 제외하고는 자동으로 수정할 수 있는 방법이 없습니다. 데이터가 손실되었습니다. 커널은 이 문제를 해결할 수 없습니다.
Linux 소프트웨어 RAID(mdraid)를 실행 중인 경우, 새 커널을 사용하더라도 mdraid는 미러에서 불량 섹터를 읽은 다음 읽기 오류가 있는 올바른 섹터를 드라이브에 다시 쓰는 방식으로 문제를 자동으로 수정합니다.
당신이에 있다면쓰다바꾸다읽다를 누른 다음 드라이브를 교체하십시오.
(BTW: READ FPDMA QUEUED는 오류가 아닙니다. 단지 (S)ATA 명령 실패일 뿐입니다. "중간 오류"가 오류입니다.)