부울 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의 첫 번째 연습이 될 수도 있습니다! 그럼에도 불구하고 이미 존재하는 것이 있다면 바퀴를 재발명하고 싶지는 않습니다. 성능에 너무 연연하지 마세요.

업데이트:(답변에 답글을 달기에 잘못된 장소라면 사과드립니다. '댓글' 옵션이 너무 적은 수의 문자를 허용하는 것 같아서 여기에 답글을 남깁니다!)

또한 '--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.isoIDTa.img. 대신 블록 장치가 있는 경우 작업 전의 "무작위" 콘텐츠가 ddrescue결과를 방해하고 망칠 수 있습니다(따라서 우선 크기가 다른 잠재적인 문제를 해결하는 데 truncate도움이 되지 않는 경우는 의미가 없습니다). ).
  • 구조하려고 할 때 실수를 반복한 후 절차를 테스트했습니다.이상한 장치.

관련 정보