ddrescue가 읽기 및 쓰기 오류를 처리하기 위해 다른 매핑 파일을 사용하지 않는 이유는 무엇입니까? (그리고 쓰기 오류를 감지하는 방법은 무엇입니까?)

ddrescue가 읽기 및 쓰기 오류를 처리하기 위해 다른 매핑 파일을 사용하지 않는 이유는 무엇입니까? (그리고 쓰기 오류를 감지하는 방법은 무엇입니까?)

때때로 하드 드라이브를 정상으로 보이는 다른 드라이브에 복제해야 하지만(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또는 오류가 커널에서 애플리케이션으로 순차적으로 보고되면 다른 도구가 실패할 수 있습니다.

관련 정보