두 개의 유사한 대형 원시 바이너리의 차이점

두 개의 유사한 대형 원시 바이너리의 차이점

abc내 로컬 컴퓨터에 4GB 파일이 있다고 가정해 보겠습니다 . SFTP를 통해 원격 서버에 업로드했는데, 몇 시간이 걸렸습니다.

이제 로컬에서 파일을 약간 수정하고(최대 50MB, 파일의 연속 바이트는 아님) 에 저장합니다 abc2. 원본 파일도 abc로컬 컴퓨터에 보관합니다.

abc합계의 이진 차이를 계산하는 방법은 무엇입니까 abc2?

애플리케이션:

  • 전체 파일을 다시 업로드하고(몇 시간이 걸릴 수 있음!) patch원격 서버에서 다시 생성하는 대신 단일 파일(최대 100MB) 만 원격 서버에 보낼 수 있습니다 .abc2abc2abcpatch

  • 로컬에서는 백업에 8GB를 낭비하는 대신 abc< 4100MB만 +로 저장할 수 있습니다.abc2abcpatch

어떻게 해야 하나요?

추신: 텍스트의 경우에는 알고 있지만 diff여기서는 원시 바이너리 형식, 즉 zip 파일, 실행 파일 또는 다른 유형의 파일과 함께 작동할 수 있는 것을 찾고 있습니다.

PS2: 가능하다면 사용하고 싶지 않습니다 rsync. 변경되지 않은 데이터를 다시 보내지 않고 효율적인 방식으로 두 시스템 간에 변경 사항을 복사할 수 있다는 것을 알고 있지만 여기서는 둘 다 patch할 수 있는 경우 파일이 필요합니다. 나중에 파일을 복사하세요.abcpatch

답변1

resticborgbackup두 번째 응용 프로그램/문제의 경우 "패치"나 차이점을 수동으로 추적하는 대신 또는 같은 중복 제거 백업 프로그램을 사용합니다 . 이 restic백업 프로그램을 사용하면 여러 컴퓨터의 디렉터리를 동일한 백업 저장소에 백업할 수 있으므로 단일 컴퓨터와 컴퓨터 간 파일 조각 간에 백업 데이터의 중복이 제거됩니다. (저는 이 프로그램에 대한 사용자 경험이 없기 borgbackup때문에 이 프로그램에 대해 아무 말도 할 수 없습니다.)

파일과의 차이점을 계산하고 저장하는 데 사용할 수 있습니다 abc.abc2rsync

abc이는 153MB 크기의 예입니다 abc2. 파일이 abc2수정되어 파일의 처음 2.3MB를 일부 추가 데이터로 덮어썼습니다.

$ ls -lh
total 626208
-rw-r--r--  1 kk  wheel   153M Feb  3 16:55 abc
-rw-r--r--  1 kk  wheel   153M Feb  3 17:02 abc2

변환을 위한 패치를 만들고 이름을 다음과 같이 지정 abc했습니다 .abc2abc-diff

$ rsync --only-write-batch=abc-diff abc2 abc
$ ls -lh
total 631026
-rw-r--r--  1 kk  wheel   153M Feb  3 16:55 abc
-rw-------  1 kk  wheel   2.3M Feb  3 17:03 abc-diff
-rwx------  1 kk  wheel    38B Feb  3 17:03 abc-diff.sh
-rw-r--r--  1 kk  wheel   153M Feb  3 17:02 abc2

생성된 파일 abc-diff은 실제 diff("패치 파일")와 abc-diff.sh사용자를 위해 생성된 짧은 쉘 스크립트입니다.rsync

$ cat abc-diff.sh
rsync --read-batch=abc-diff ${1:-abc}

스크립트는 주어진 파일과 동일 abc하도록 수정됩니다 .abc2abc-diff

$ md5sum abc abc2
be00efe0a7a7d3b793e70e466cbc53c6  abc
3decbde2d3a87f3d954ccee9d60f249b  abc2
$ sh abc-diff.sh
$ md5sum abc abc2
3decbde2d3a87f3d954ccee9d60f249b  abc
3decbde2d3a87f3d954ccee9d60f249b  abc2

이제 이 파일을 abc-diff다른 곳으로 전송할 수 있습니다 abc. 명령을 사용하면 rsync --read-batch=abc-diff abc파일에 패치를 적용하여 해당 내용을 abcdiff가 생성된 시스템의 파일과 동일하게 변환할 수 있습니다.abc2

패치를 두 번째로 다시 적용하는 것이 안전한 것 같습니다. 오류 메시지가 없으며 파일 내용이 변경되지 않습니다(MD5 체크섬이 변경되지 않음).

명시적인 "역방향 패치"를 만들지 않으면 패치 적용을 쉽게 취소할 수 없습니다.


또한 2.3MB 수정 사항을 데이터의 다른 위치 abc2, 조금 더(약 50MB) 및 처음에 쓰는 것을 테스트했습니다. 결과 "패치" 크기는 4.6MB입니다. 이는 수정된 비트만 패치에 저장된다는 것을 나타냅니다.

답변2

abc와 abc2의 이진 차이를 계산하는 방법은 무엇입니까?

사용bsdiff/bspatch또는 xdelta 등.

$ bsdiff older newer patch.bin     # patch.bin is created
[...]
$ bspatch older newer patch.bin    # newer is created

그러나 매뉴얼 페이지에서 다음 경고에 유의하십시오.

  • bsdiff사용된 메모리는 크기의 17배와 같습니다.오래된 파일, 크기의 8배인 절대 최소 작업 세트 크기가 필요합니다.오래된 파일.
  • bspatch사용된 메모리 크기는 다음과 같습니다.오래된 파일플러스 크기새로운 파일, 그러나 상당한 성능 손실 없이 매우 작은 작업 세트를 허용할 수 있습니다.

답변3

diff파일을 텍스트로 처리하도록 강제해 보셨나요 ?

diff -ua abc abc2

설명대로여기.

  • -u통합 컨텍스트의 NUM(기본값 3)줄 출력
  • -a모든 파일을 텍스트로 처리

그러면 패치가 제공됩니다. 이것의 단점은 "선"이 매우 길어지고 패치가 부풀어오르게 될 수 있다는 것입니다.

답변4

내 테스트를 기반으로 한 다른 답변에 추가:

그리고diff

매우 유사한 두 개의 256MB 파일을 생성한 abc다음 abc2diff 파일을 생성해 보겠습니다.

diff -ua abc abc2 > abc-abc2.diff

abc2이제 원본 파일을 통해 abc복구를 시도해 보겠습니다 abc-abc2.diff.

cp abc abc3
patch abc3 < abc-abc2.diff

또는

cp abc abc3
patch abc3 -i abc-abc2.diff

또는

patch abc -i abc-abc2.diff -o abc3

Linux에서 실행할 수 있습니다. Windows에서도 시도했지만(patch.exe 및 diff.exe도 작동함) 알 수 없는 이유로 실패했습니다. 결과 abc3파일은 256MB가 아닌 1KB에 불과했습니다(나중에 이 답변을 여기에서 업데이트하겠습니다).

그리고rsync

허용된 답변에 자세히 설명된 대로 다음과 같이 작동합니다.

rsync --only-write-batch=abc-abc2-diff abc2 abc

cp abc abc3

rsync --read-batch=abc-abc2-diff abc3 

그리고rdiff

자세히보다이 답변, 이는 또한 해결책이기도 합니다.

rdiff signature abc abc-signature
rdiff delta abc-signature abc2 abc-abc2-delta

rdiff patch abc abc-abc2-delta abc3

rdiff.exe를 사용하여 Windows에서도 테스트했습니다.여기효과가있다.

관련 정보