리눅스에서 큰 파일을위한 바이너리 diff / patch?


13

두 개의 파티션 이미지 (A 및 B)가 있고이를 사용하여 다른 컴퓨터의 A에 적용 할 수있는 패치를 만들어 네트워크에 영향을주지 않고 새 B 이미지를 얻을 수 있습니다. 다음 요구 사항이 있습니다.

  • 리눅스에서 작동
  • diffs를 만들 수 있습니다
  • diff를 사용하여 파일을 패치 할 수 있습니다
  • 이진 파일을 처리 할 수 ​​있습니다
  • 큰 파일을 처리 할 수 ​​있습니다 (수백 GB가 작동해야 함)
  • 사용자 상호 작용이 필요하지 않음 (콘솔 애플리케이션 만)
  • 이상적으로는 파이프에서 읽거나 쓸 수 있어야합니다 (gzip 압축 파일에서 파이프로 쓰고 쓸 수 있어야합니다)

그런 것이 있습니까?


현상금을 시작할 때 Enter 키를 너무 빨리 쳤습니다. 여기에 내가 추가하고 싶은 텍스트가 있습니다 :
Basj

재현하기 쉬운 예를 가진 답 rdiff은 나중에 참조 할 때 유용 할 것입니다. 예 :하자 말 file1file21기가바이트 각각 두 개의 유사한 파일. 1) rdiff를 계산하는 방법? 2)이 rdiff를 patch파일 로 저장하는 방법 ? 3) 복구 patch하기 위해이 파일 을 적용하는 방법은 무엇입니까? file1file2
Basj

답변:


13

rsync 관련 도구 인 rdiffrdiff-backup을 살펴보십시오 . 이 rdiff명령을 사용하면 패치 파일을 생성하여 다른 파일에 적용 할 수 있습니다.

rdiff-backup명령은이 방법을 사용하여 전체 디렉토리를 처리하지만 단일 파일 디스크 이미지로 작업하고 있다고 생각합니다 rdiff.


1
rdiff의 "서명"과 "델타"는 무엇을 의미합니까? 맨 페이지는 말하지 않습니다.
Tor Klingberg

1
내 자신의 질문에 대답하기 위해 rdiff로 델타를 만드는 것은 두 단계 프로세스입니다. 먼저 이전 파일에서 서명 파일을 작성한 다음 서명 및 새 파일을 사용하여 델타를 작성하십시오. 그들은 함께 실행할 수 있습니다rdiff signature oldfile | rdiff delta - newfile deltafile
Tor Klingberg

1
@TorKlingberg 예를 들어 새로운 답변을 게시 할 수 있습니까? 의 말을하자 file1file21기가바이트 각각 두 개의 유사한 파일입니다. 1) diff를 계산하는 방법? 2)이 diff를 패치 파일로 저장하는 방법? 3) file1복구 하기 위해이 패치 파일을 적용하는 방법은 file2무엇입니까?
Basj

7

xdelta 는 원하는 모든 것을 할 수 있습니다. 그러나 이미지가 매우 유사 하지 않은 경우 xdelta는 차이를 찾기 위해 정의 된 메모리 버퍼의 절반을 사용하기 때문에 상당히 큰 패치로 끝날 수 있습니다. 자세한 정보는 TuningMemoryBudget 위키 페이지 에서 확인할 수 있습니다 . 버퍼 크기를 늘리면 약간 도움이 될 수 있습니다.

bsdiff 는 또 다른 옵션이지만 RAM 이 너무 배가 고프 므로 디스크 이미지 크기에 관계없이 전혀 적합하지 않습니다.

bsdiff 는 메모리가 많이 부족합니다. 여기에는 이전 파일 의 크기와 새 파일의 크기 인 max(17*n,9*n+m)+O(1)메모리 바이트가 필요 합니다. bspatch 에는 바이트 가 필요 합니다.nmn+m+O(1)


3

정식 답변

rdiff 게시물 과 관련 하여 librsync 2.0.1 은 명령 기능 설명을 잘 읽었으므로 아래 내용을 참조 하여이 답변에 내용을 보존합니다.

파일을 업데이트하기위한 rdiff 3 단계에 대한 이해를 높이는 것이 중요 합니다. rdiff 매뉴얼 페이지 에서 설명한대로 signature , deltapatch 또한 rdiffGitHub에서 참조하고 인용하는 데 도움이되는 명령 예제 스크립트를 찾았습니다 .

본질적으로 ...

  1. "시작"또는 기본 파일 [ file1]을 사용하여 서명 파일 을 작성하십시오.
    • 일반적으로 기본 / 원본 파일보다 훨씬 작습니다.
  2. 서명 파일 을 사용하면 file2기본 파일과 유사하지만 다른 파일 ( 예 : 최근에 업데이트 된 파일 )과 비교하여 두 파일 간의 차이점 만 포함 하는 델타 파일 을 만듭니다.
  3. "차이 만"또는 델타 파일 을 사용하여 기본 파일 [ file1] 과 비교 file2하여 두 파일과 일치하는 다른 파일 [ ] 의 변경 사항이 포함 된 새 파일을 생성하십시오 .

빠른 명령 (개당 rdiff-example.sh)

rdiff signature file1 signature-file            ## signature base file1
rdiff delta signature-file file2 delta-file     ## delta differences file2
rdiff patch file1 delta-file gen-file           ## compare delta to file1 to create matching file2

rdiff-example.sh

# $ rdiff --help
# Usage: rdiff [OPTIONS] signature [BASIS [SIGNATURE]]
#              [OPTIONS] delta SIGNATURE [NEWFILE [DELTA]]
#              [OPTIONS] patch BASIS [DELTA [NEWFILE]]

# Options:
#   -v, --verbose             Trace internal processing
#   -V, --version             Show program version
#   -?, --help                Show this help message
#   -s, --statistics          Show performance statistics
# Delta-encoding options:
#   -b, --block-size=BYTES    Signature block size
#   -S, --sum-size=BYTES      Set signature strength
#       --paranoia            Verify all rolling checksums
# IO options:
#   -I, --input-size=BYTES    Input buffer size
#   -O, --output-size=BYTES   Output buffer size

# create signature for old file
rdiff signature old-file signature-file
# create delta using signature file and new file
rdiff delta signature-file new-file delta-file
# generate new file using old file and delta
rdiff patch old-file delta-file gen-file
# test
diff -s gen-file new-file
# Files gen-file and new-file are identical

소개

rdiff는 네트워크 델타를 계산하고 적용하는 프로그램입니다. rdiff 델타는 이진 파일 간의 델타로, 결과 (또는 새) 파일을 생성하기 위해 기본 (또는 오래된) 파일을 자동으로 편집하는 방법을 설명합니다.

대부분의 diff 프로그램과 달리 librsync는 diff가 계산 될 때 두 파일 모두에 액세스 할 필요가 없습니다. 델타를 계산하려면 이전 파일의 짧은 "서명"과 새 파일의 전체 내용이 필요합니다. 서명에는 이전 파일의 블록에 대한 체크섬이 포함됩니다. 이 체크섬을 사용하여 rdiff는 새 파일에서 일치하는 블록을 찾은 다음 델타를 계산합니다.

rdiff 델타는 일반적으로 xdelta 또는 일반 텍스트 diff보다 크기가 작고 생성 속도가 느립니다. 델타를 계산할 때 이전 파일과 새 파일을 모두 사용할 수 있으면 xdelta는 일반적으로 훨씬 작은 파일을 생성합니다. 비교할 파일이 일반 텍스트 인 경우 사람이 diff를보고 부정확 한 일치로 적용 할 수 있으므로 GNU diff가 일반적으로 더 나은 선택입니다.

rdiff는 두 파일을 동시에 표시하는 것이 편리하지 않은 경우 자체적으로 제공됩니다. 이에 대한 한 가지 예는 두 파일이 별도의 시스템에 있으며 차이점 만 전송하려는 경우입니다. 또 다른 예는 파일 중 하나가 아카이브 또는 백업 미디어로 이동되어 서명 만 남은 경우입니다.

상징적으로

signature(basis-file) -> sig-file

delta(sig-file, new-file) -> delta-file

patch(basis-file, delta-file) -> recreated-file

패턴 사용

rsync 알고리즘의 전형적인 적용은 파일 A2를 머신 A에서 유사한 파일 A1을 갖는 머신 B로 전송하는 것입니다. 다음과 같이 수행 할 수 있습니다.

  1. B는 A1의 rdiff 서명을 생성합니다. 이 S1을 호출하십시오. B는 서명을 A로 보냅니다. 서명은 일반적으로 설명하는 파일보다 훨씬 작습니다.
  2. A는 S1과 A2 사이의 거리 차이를 계산합니다. 이 델타 D라고 부릅니다. A는 델타를 B로 보냅니다.
  3. B는 델타를 적용하여 A2를 다시 만듭니다. A1과 A2에 동일한 바이트 수가 포함 된 경우 rdiff는 공간을 크게 절약해야합니다.

출처


1
대단히 감사합니다!
Basj

1

JDIFF 는 두 (이진) 파일 간의 차이점을 출력하는 프로그램입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.