
나는 가능한 한 많은 데이터를 복구하려고 하는 오래된 3.5인치 플로피 디스크 모음을 가지고 있습니다.
문제는 일부 파일의 구조로 인해 발생합니다. 유지하려면 모든 파일의 길이가 필요합니다. 즉, 불량 섹터를 채워야 합니다. (tl;dr 이유는 일부 파일이 데이터와 코드가 있는 Acorn ADFS 파일인 이유입니다. 코드는 파일 시작 부분의 오프셋으로 데이터를 참조합니다. Linux에서는 ADFS 형식을 읽는 것이 문제가 되지 않지만 불량 섹터의 패딩은 문제입니다.
25년 동안 디스크를 읽지 않았기 때문에 예측할 수 없는 읽기, 정기적인 불량 섹터 및 잠재적으로 디스크를 읽을 수 없는 상태로 만들 것으로 예상됩니다. 이는 데이터 복구가 최대화되는 한 괜찮습니다.
이렇게 하려면 가능한 한 많이 읽으려면 여러 번의 패스가 필요할 것으로 예상됩니다.
dd
나는 첫 번째 실행을 약속하는 이 명령으로 dd를 보았습니다.
dd if=/dev/fd0 of=adfs.img conv=noerror,sync
이후의 통화가 이어졌습니다.
dd if=/dev/fd0 of=adfs.img conv=noerror,notrunc
어디:
오류 없음오류가 무시된다는 의미
동조불량 섹터가 널 문자로 채워져 있음을 의미합니다.
notruncdd가 호출될 때 (이미 존재하는) 출력 파일이 잘리지 않음을 의미합니다.
그러나 내가 읽어본 결과매뉴얼 페이지이notrunc에 대한 설명, notrunc가 설정되었음에도 불구하고 dd는 매번 출력을 덮어쓰므로 마지막 패스에서 읽은 내용만 나타내는 출력이 생성됩니다. 이전에는 올바르게 읽었지만 오래된 플로피 디스크 성능 저하 등으로 인해 현재 불량한 섹터는 null로 덮어쓰게 됩니다.
따라서 dd는 적합하지 않은 것 같습니다.
구출
구출로그 파일을 사용하여 성공적으로 작성된 내용을 기록하고 다음 패스가 완료될 때 참조되는 한 여러 패스에서 사용할 수 있다는 점에서 유망해 보입니다.
오류가 없는 블록만 읽는 첫 번째 패스
ddrescue -d -p --no-scrape /dev/fd0 output.img log/output.logfile
오류를 채우기 위한 첫 번째 패스와 후속 패스의 경우
ddrescue -d -r3 /dev/fd0 output.img log/output.logfile
어디
-디직접 디스크 액세스. 시스템 캐시 무시
--스크래핑 없음또는-N스크래핑 단계 건너뛰기
-피preallocate 복구 전에 디스크 공간을 미리 할당합니다. 즉, 출력 파일은 입력 파일/장치와 크기가 동일합니다.
-r3불량 섹터를 3회 재시도합니다(두 번째 패스부터 사용).
하지만 문제는 ddrescue가 불량 섹터가 발생할 때 패딩하지 않는 것 같습니다. -p를 설정하면 필요에 따라 파일 시작 부분의 데이터 오프셋을 유지하지 않고 파일 끝 부분에 모든 패딩이 발생하는 것으로 보입니다.
이는 디스크 공간을 절약하기 위해 ddrescue가 작성되어 불량 섹터가 잘린 다음 후속 패스에서 불량 섹터가 성공적으로 읽히면 추가되는 경우인 것 같습니다. -p를 설정하면 데이터를 채우려는 것이 아니라 공간을 절약하기 위해 입력 파일과 동일한 크기의 출력 파일을 생성합니다. 따라서 -p set 또는 unset을 사용한 출력 내용은 동일합니다. 즉, 파일 끝까지 채워지지 않습니다.
질문
그래서 내 질문은 세 부분으로 이루어진 것입니다.
-p를 설정해도 ddrescue가 복구된 파일을 채우지 않는다는 것이 맞습니까?
패드로 가져올 수 있는 방법이 있나요? 인터넷 검색에서 ddrescue로 생성된 로그 파일이 스크립트에서 관련 위치를 채우는 데 사용될 수 있다는 주석을 읽었습니다(다시 찾아 추가하겠습니다). 어떻게 알 수 있나요?
그리고
- 내가 하려는 작업(불량 섹터 패딩이 포함된 손상된 디스크를 여러 번 읽음으로써 최대 데이터 복구)을 수행하는 데 더 좋은 명령/프로그램/스크립트를 알고 있습니까?
저는 Ubuntu 18.04를 사용하고 있습니다. dd 버전은 (coreutils) 8.28이고 GNU ddrescue 버전은 1.22입니다. 둘 다 Ubuntu 리포지토리에서 가져온 것입니다.
어떤 도움을 주셔서 항상 감사드립니다
답변1
GNU 복구당신이 시도하고 있는 복구에 적합한 도구입니다.
1) -p를 설정해도 ddrescue가 복구된 파일을 채우지 않는다는 것이 맞습니까?
이 가정은 올바르지 않습니다. 당신은 혼란 스러울 수도 있습니다매뉴얼이렇게 말해요:
Ddrescue는 입력에서 불량 섹터를 발견할 때 출력에 0을 쓰지 않으며 요청되지 않은 경우 출력 파일을 자르지 않습니다.
이는 불량 섹터 대신 0이 기록되지 않음을 의미합니다. 불량 섹터에 있어야 할 내용이 모두 채워지지 않았습니다. 빈 디스크나 파일에 쓰는 경우,대상의 기록되지 않은 영역은 0으로 다시 읽혀집니다.(널 바이트).
또한 -p
/ --preallocate
옵션은 "패딩"과 아무 관련이 없습니다. "사전 할당"을 의미합니다. 지원되는 파일 시스템에서 이 옵션을 사용하면 대상에 소스 디스크를 저장할 충분한 디스크 공간이 있는지 확인할 수 있습니다.
2) 패드에 넣을 수 있는 방법이 있나요?
GNU ddrescue의 파일 출력은 논리적으로 소스 디스크와 동일한 레이아웃입니다. 소스에서 읽은 블록은 대상에서 동일한 위치로 이동합니다. 전체 복구를 되돌릴 수도 있으며( -R
/ --reverse
) 블록은 여전히 올바른 위치에 거꾸로 채워질 것입니다.
3) 내가 하려는 작업(불량 섹터 패딩이 포함된 손상된 디스크를 여러 번 읽음으로써 최대 데이터 복구)을 수행하는 데 더 좋은 명령/프로그램/스크립트를 알고 있습니까?
GNU ddrescue는 여러분이 원하는 것을 정확하게 수행합니다. 다중 패스( -r
/ ) 를 수행할 수 있으며 불량 섹터에 대해 원하는 "패딩"은 GNU ddrescue의 기본 동작입니다. 에서--retry-passes=n
매뉴얼:
출력 파일이 ddrescue에 의해 생성된 일반 파일인 경우 불량 섹터로 표시된 영역에는 0이 포함됩니다.
완벽하게 명확하게 하고, 성공적인 읽기에 이어 잘못된 읽기가 발생하면 null로 "패딩"될 수 있다는 우려를 해결하기 위해,ddrescue는 성공적인 읽기를 다시 읽으려고 시도하지 않습니다.―이미 데이터가 복구되었기 때문에 그럴 필요는 없습니다. 맵파일은 ddrescue가 이미 복구한 내용과 복구에 실패한 내용을 아는 방법입니다.