![두 개의 유사한 대형 원시 바이너리의 차이점](https://linux55.com/image/166861/%EB%91%90%20%EA%B0%9C%EC%9D%98%20%EC%9C%A0%EC%82%AC%ED%95%9C%20%EB%8C%80%ED%98%95%20%EC%9B%90%EC%8B%9C%20%EB%B0%94%EC%9D%B4%EB%84%88%EB%A6%AC%EC%9D%98%20%EC%B0%A8%EC%9D%B4%EC%A0%90.png)
abc
내 로컬 컴퓨터에 4GB 파일이 있다고 가정해 보겠습니다 . SFTP를 통해 원격 서버에 업로드했는데, 몇 시간이 걸렸습니다.
이제 로컬에서 파일을 약간 수정하고(최대 50MB, 파일의 연속 바이트는 아님) 에 저장합니다 abc2
. 원본 파일도 abc
로컬 컴퓨터에 보관합니다.
abc
합계의 이진 차이를 계산하는 방법은 무엇입니까 abc2
?
애플리케이션:
전체 파일을 다시 업로드하고(몇 시간이 걸릴 수 있음!)
patch
원격 서버에서 다시 생성하는 대신 단일 파일(최대 100MB) 만 원격 서버에 보낼 수 있습니다 .abc2
abc2
abc
patch
로컬에서는 백업에 8GB를 낭비하는 대신
abc
< 4100MB만 +로 저장할 수 있습니다.abc2
abc
patch
어떻게 해야 하나요?
추신: 텍스트의 경우에는 알고 있지만 diff
여기서는 원시 바이너리 형식, 즉 zip 파일, 실행 파일 또는 다른 유형의 파일과 함께 작동할 수 있는 것을 찾고 있습니다.
PS2: 가능하다면 사용하고 싶지 않습니다 rsync
. 변경되지 않은 데이터를 다시 보내지 않고 효율적인 방식으로 두 시스템 간에 변경 사항을 복사할 수 있다는 것을 알고 있지만 여기서는 둘 다 patch
할 수 있는 경우 파일이 필요합니다. 나중에 파일을 복사하세요.abc
patch
답변1
restic
borgbackup
두 번째 응용 프로그램/문제의 경우 "패치"나 차이점을 수동으로 추적하는 대신 또는 같은 중복 제거 백업 프로그램을 사용합니다 . 이 restic
백업 프로그램을 사용하면 여러 컴퓨터의 디렉터리를 동일한 백업 저장소에 백업할 수 있으므로 단일 컴퓨터와 컴퓨터 간 파일 조각 간에 백업 데이터의 중복이 제거됩니다. (저는 이 프로그램에 대한 사용자 경험이 없기 borgbackup
때문에 이 프로그램에 대해 아무 말도 할 수 없습니다.)
파일과의 차이점을 계산하고 저장하는 데 사용할 수 있습니다 abc
.abc2
rsync
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
했습니다 .abc2
abc-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
하도록 수정됩니다 .abc2
abc-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
파일에 패치를 적용하여 해당 내용을 abc
diff가 생성된 시스템의 파일과 동일하게 변환할 수 있습니다.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
다음 abc2
diff 파일을 생성해 보겠습니다.
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에서도 테스트했습니다.여기효과가있다.