부울 OR을 통해 두 개의 이진 이미지 파일을 병합합니다(ddrescue 출력 파일 이름이 잘못됨).

부울 OR을 통해 두 개의 이진 이미지 파일을 병합합니다(ddrescue 출력 파일 이름이 잘못됨).

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.

ddrescueoptions 와 함께 호출 되면 --generate-mode기본 "구조 모드"와는 다른 "빌드 모드"에서 실행됩니다. 즉, "생성 모드"에서는 ddrescue아무것도 저장되지 않습니다 . 나중에 사용하기 위해 생성을 시도합니다 mapfile.

[…]

ddrescue어떤 경우에는 sum 의 (부분) 복사본인 sum mapfile에서 근사값을 생성할 수 있는데 , 이는 거의 정확한 것만큼 좋습니다 . 이는 단순히 모두 0을 포함하는 섹터가 저장되지 않는다고 가정하여 수행됩니다.infileoutfilemapfile

[…]

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.isoIDTa.img. 도움 ddrescue이 되지 않는 첫 번째 장소 truncate).
  • 사람을 구하려다 오류를 재현한 후 프로그램을 테스트해 보았습니다.태블릿 장치.

관련 정보