ddrescue를 복원할 때 잘못된 출력 파일 이름을 사용하여 어리석은 실수를 저질렀습니다. 일어나는 일은 다음과 같습니다.
ddrescue -b 2048 -d -v /dev/sr1 IDTa.img IDTa.ddrescue.log
그런 다음 컴퓨터가 충돌하여 실수로 복원했습니다.
ddrescue -b 2048 -d -v /dev/sr1 IDTa.iso IDTa.ddrescue.log
두 이미지 파일 모두 모두 0으로 시작될 것이라는 점을 수집했기 때문에 두 파일 모두에 대해 부울 OR을 수행하면 결과는 내가 실수하지 않았다면 ddrescue 출력이 될 것이라고 생각했습니다.
이러한 파일은 서로 연속되지 않습니다(예:두 개의 ddrescue 이미지를 병합하는 방법은 무엇입니까?) 이전에 실행한 적이 ddrescue -n
있고 성공적으로 완료되었기 때문입니다. 즉, IDTa.img에는 대부분의 데이터가 포함되어 있고 IDTa.iso에는 이미지 전체에 분산된 청크가 포함되어 있습니다(IDTa.img에서는 이러한 청크가 0입니다).
이를 수행하는 간단한 CLI 방법이 있습니까? 아마도 C에서 이것을 할 수 있을 것입니다. 그러나 나는 매우 녹슬었습니다! 또한 내가 한 번도 배워본 적이 없는 Python의 첫 번째 연습이 될 수도 있습니다! 그래도 이미 존재하는 것이 있다면 바퀴를 재발명하려는 유혹을 특별히 느끼지 마십시오. 성과에 너무 집중하지 않습니다.
고쳐 쓰다:(답변에 답글을 달기에 잘못된 위치라면 사과드립니다. '댓글' 옵션을 사용할 때 글자수가 너무 적은 것 같아서 여기에 답글을 남깁니다!)
또한 위의 문제에 대한 해결책으로 ddrescue에 '--fill-mode=?'를 사용해 보았으나 성공하지 못했습니다. 이것이 내가 한 일입니다:
ddrescue --generate-mode -b 2048 -v /dev/sr1 IDTa.img IDTa.img.log
cp IDTa.img IDTa.img.backup
ddrescue '--fill-mode=?' -b 2048 -v IDTa.iso IDTa.img IDTa.img.log
확인하기 위해 IDTa.iso에 데이터가 있는 첫 번째 위치를 찾았습니다.
hexdump -C IDTa.iso |less
출력은 다음과 같습니다
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
001da800 00 00 01 ba 21 00 79 f3 09 80 10 69 00 00 01 e0 |....!.y....i....|
...
001db000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
...
IDTa.img에서 001da800을 찾았습니다.
hexdump -C IDTa.img |less
/001da800
산출:
001da800 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
001db000 00 00 01 ba 21 00 7b 00 bf 80 10 69 00 00 01 e0 |....!.{....i....|
...
그렇다면 001da800 위치의 데이터가 IDTa.iso 파일에서 IDTa.img로 복사되지 않았나요?
IDTa.img.log를 확인하세요.
# Mapfile. Created by GNU ddrescue version 1.22
# Command line: ddrescue --fill-mode=? -b 2048 -v IDTa.iso IDTa.img IDTa.img.log
# Start time: 2021-06-28 13:52:39
# Current time: 2021-06-28 13:52:46
# Finished
# current_pos current_status current_pass
0x299F2000 + 1
# pos size status
0x00000000 0x00008000 ?
0x00008000 0x001D2800 +
0x001DA800 0x00000800 ?
0x001DB000 0x00049000 +
...
그리고 현실 확인:
diff -q IDTa.img IDTa.img.backup
차이가 반환되지 않습니다.
업데이트 2:
@Kamil은 매개변수를 제거하여 솔루션을 편집했습니다(아래 참조) --fill-mode=?
. 효과가 있는 것 같습니다!
답변1
내 생각엔 이 일은 스스로 할 수 있을 것 같아요 ddrescue
. 당신은해야합니다 --generate-mode
.
ddrescue
options 와 함께 호출 되면--generate-mode
기본 "구조 모드"와는 다른 "빌드 모드"에서 실행됩니다. 즉, "생성 모드"에서는ddrescue
아무것도 저장되지 않습니다 . 나중에 사용하기 위해 생성을 시도합니다mapfile
.[…]
ddrescue
어떤 경우에는 sum 의 (부분) 복사본인 summapfile
에서 근사값을 생성할 수 있는데 , 이는 거의 정확한 것만큼 좋습니다 . 이는 단순히 모두 0을 포함하는 섹터가 저장되지 않는다고 가정하여 수행됩니다.infile
outfile
mapfile
[…]
ddrescue --generate-mode infile outfile mapfile
(원천)
만약을 대비해 이 두 이미지를 복사하세요. 파일 시스템이 CoW 복사를 지원하는 경우 cp --reflink=always
각 이미지마다 복사가 거의 즉각적으로 이루어집니다.
두 이미지의 크기가 동일한지 확인해야 합니다. 그 중 하나가 더 작으면 확대해야 합니다. 즉, 0(희소한 0)을 추가해야 합니다. 이 코드는 자동으로 수행합니다( truncate
필수).
( f1=IDTa.img
f2=IDTa.iso
s1="$(wc -c <"$f1")"
s2="$(wc -c <"$f2")"
if [ "$s2" -gt "$s1" ]; then
truncate -s "$s2" "$f1"
else
truncate -s "$s1" "$f2"
fi
)
(서브쉘을 사용하고 있어서 변수가 사라지고 메인쉘은 영향을 받지 않습니다.)
이제 도구가 첫 번째 이미지를 분석하고 복구되지 않은 섹터를 찾아보겠습니다.
ddrescue --generate-mode -b 2048 -v /dev/sr1 IDTa.img new_mapfile
참고로 new_mapfile
이 파일은 새 파일입니다.아니요당신의 IDTa.ddrescue.log
. 만지지 마세요 IDTa.ddrescue.log
.
new_mapfile
일단 생성되면 해당 조각이 "구출됨" 또는 "시도되지 않음"으로 간주되는지 여부에 따라 그 안의 행에 상태 +
또는 이 표시되어야 합니다.?
IDTa.img
이제 "시도되지 않은" 청크를 IDTa.iso
. 다음 명령은 이를 수정합니다 IDTa.img
.
IDTa.img
데이터를 읽어 소위 "시도되지 않은" 블록을 복구합니다 IDTa.iso
.
ddrescue -b 2048 -v IDTa.iso IDTa.img new_mapfile
이제 수정된 콘텐츠 IDTa.img
와 수정되지 않은 콘텐츠 IDTa.ddrescue.log
는 실수하지 않은 것처럼 좋아야 합니다.
노트:
- 모두 0이 포함된 일부 섹터가 실제로 저장되었을 수도 있습니다.
--generate-mode
로 분류하십시오 . 그들은 "헛된"에서 가져온 데이터?
로 채워질 것입니다 .IDTa.iso
다른 파일에서도 모두 0이므로 최종 결과에는 중요하지 않습니다. IDTa.iso
전체적으로 합계를 바꾸면 결과는 동일해야 합니다IDTa.img
(단, 이렇게 하면 결과가 에 표시된다는 점에 유의하세요IDTa.iso
). 그래서 선택이 있습니다. 나는--generate-mode
마지막 명령에 대한 작업량을 최소화해야 하므로 모두 0을 포함할 것으로 예상되는 더 적은 수의 섹터가 있는 파일을 사용합니다.- 이 방법 은 일반 파일
IDTa.iso
및IDTa.img
. 도움ddrescue
이 되지 않는 첫 번째 장소truncate
). - 사람을 구하려다 오류를 재현한 후 프로그램을 테스트해 보았습니다.태블릿 장치.