때때로 하드 드라이브를 정상으로 보이는 다른 드라이브에 복제해야 하지만(SMART 값은 정상) 표면에 불량 섹터가 있는지 완전히 검사할 수 없습니다.
일반적으로 정상적인 하드 드라이브를 복제하는 경우 이전에 삭제되지 않았으므로 완전히 확인되지 않은 대상 드라이브를 사용하게 될 것입니다.
내가 틀렸다면 알려주십시오.나는 ddrescue가 읽기 오류만 보고한다고 생각합니다. 이는 또한 쓰기 오류로 인해 일부 섹터를 대상 드라이브에 복사할 수 없는 경우에도 ddrescue가 오류 없이 복제에 성공했음을 나타냄을 의미합니다. 마찬가지로 매핑 파일은 대상 드라이브에 오류가 있는지 알려주지 않습니다.
그래서 ddrescue가 왜 두 개의 매핑 파일(read.log)(write.log) 생성을 허용하지 않는지 궁금했는데, 짧은 대답은 아마도 "아직 구현되지 않았습니다."가 아닐까 싶습니다.
이는 두 번째 질문으로 이어집니다. 쓰기 오류를 감지할 수 있는 방법이 있습니까?
참고: 복제 후 두 1TB 드라이브 모두의 체크섬을 계산하는 데 시간이 걸릴 것으로 가정합니다. 더 나은 해결책이 있습니까?
답변1
ddrescue
쓰기 오류는 치명적이므로 쓰기 오류는 기록되지 않습니다. 블록을 써야 할 때마다 기록될 것으로 예상되는 바이트 수를 추적하고, 해당 바이트가 성공적으로 기록되지 않으면 오류 메시지와 함께 중단됩니다. 이것을 실행하면 볼 수 있습니다
$ ddrescue --force /dev/zero /dev/full
GNU ddrescue 1.23
Press Ctrl-C to interrupt
ipos: 0 B, non-trimmed: 0 B, current rate: 0 B/s
opos: 0 B, non-scraped: 0 B, average rate: 0 B/s
non-tried: 9223 PB, bad-sector: 0 B, error rate: 0 B/s
rescued: 0 B, bad areas: 0, run time: 0s
pct rescued: 0.00%, read errors: 0, remaining time: n/a
time since last successful read: n/a
Copying non-tried blocks... Pass 1 (forwards)
ddrescue: Write error: No space left on device
성공적으로 완료 되면 ddrescue
최선을 다해 읽은 모든 데이터가 올바르게 기록된 것입니다.
답변2
프로그램 badblocks
은 읽기 오류, 쓰기 오류 및 손상 오류를 보고합니다.여기.
대상 디스크가 정상인지 확인하려면 badblocks
해당 디스크에서 파괴 모드로 실행하세요. 그러나 다른 답변에서 언급한 것처럼 불량 섹터는 쓰기 시 다시 매핑된다는 점을 명심하세요.
"쓰기 오류를 보고할지 여부"에 대해 ddrescue
가장 쉬운 방법은 코드를 살펴보거나 오류가 발생할 수 있는 일부 대상을 설정해 보는 것입니다. 하지만 내 가정은 글쓰기가 표준 유닉스 규칙을 따르고 다른 도구와 마찬가지로 예외 오류로 보고된다는 것입니다.
"왜"에 관해서는 당신의 추측이 내 것과 비슷하지만 유닉스의 기본 원칙 중 하나는 "간단하게 유지하고 문제를 다른 도구로 분리"하는 것입니다.
ddrescue
손상된 디스크에서 데이터를 가져오는 데 중점을 둡니다. 결과를 작성할 때 신뢰할 수 있는 도구가 있는지 확인하는 다른 도구가 있습니다.
답변3
최신 디스크는 실패한 섹터를 이 상황을 위해 특별히 설계된 예비 섹터 중 하나로 다시 매핑하여 쓰기 오류를 투명하고 자동으로 처리합니다.
SMART 결과에서 상태를 확인할 수 있습니다.
smartctl -a /dev/sda
...
SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE
5 Reallocated_Sector_Ct 0x0033 200 200 140 Pre-fail Always - 0
197 Current_Pending_Sector 0x0032 200 200 000 Old_age Always - 0
198 Offline_Uncorrectable 0x0030 100 253 000 Old_age Offline - 0
이 예에서 행 ID #5의 마지막 값은 섹터가 재할당되지 않았음을 나타냅니다. #197의 값은 읽기 오류를 보고했지만 아직 작성 및 재할당되지 않은 섹터 수입니다. #198의 값은 읽기/쓰기 오류가 있어 재할당할 수 없는 섹터 수입니다. 일반적으로 너무 많은 다른 섹터에 오류가 발생하여 더 이상 스페어를 사용할 수 없기 때문입니다.
마지막 경우에만 쓰기가 운영 체제에 실패로 보고됩니다. ddrescue
또는 오류가 커널에서 애플리케이션으로 순차적으로 보고되면 다른 도구가 실패할 수 있습니다.