%EB%A1%9C%20%EB%91%90%20%EA%B0%9C%EC%9D%98%20%EB%B0%94%EC%9D%B4%EB%84%88%EB%A6%AC%20%EC%9D%B4%EB%AF%B8%EC%A7%80%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EB%B3%91%ED%95%A9%ED%95%A9%EB%8B%88%EB%8B%A4..png)
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의 첫 번째 연습이 될 수도 있습니다! 그럼에도 불구하고 이미 존재하는 것이 있다면 바퀴를 재발명하고 싶지는 않습니다. 성능에 너무 연연하지 마세요.
업데이트:(답변에 답글을 달기에 잘못된 장소라면 사과드립니다. '댓글' 옵션이 너무 적은 수의 문자를 허용하는 것 같아서 여기에 답글을 남깁니다!)
또한 '--fill-mode=?'를 사용하여 ddrescue를 시도했습니다. 위의 해결책으로 시도했지만 작동하지 않았습니다. 이것이 내가 한 일입니다:
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
옵션과 함께 호출되면 기본--generate-mode
"구조 모드"와는 다른 "생성 모드"에서 작동합니다. 즉, "생성 모드"에서는ddrescue
아무것도 구출되지 않습니다.mapfile
나중에 사용하기 위해 생성하려고만 합니다 .[…]
ddrescue
경우에 따라 대략적인mapfile
, 에서infile
및 의 (부분) 사본을 생성할 수 있습니다outfile
. 이는 정확한 와 거의 비슷합니다mapfile
. 이는 모두 0을 포함하는 섹터가 구출되지 않았다고 단순히 가정함으로써 가능합니다.[…]
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
도움이 되지 않는 경우는 의미가 없습니다). ). - 구조하려고 할 때 실수를 반복한 후 절차를 테스트했습니다.이상한 장치.