Nhị phân / vá nhị phân cho các tệp lớn trên linux?


13

Tôi đã có hai hình ảnh phân vùng (A và B) và muốn sử dụng chúng để tạo một bản vá mà tôi có thể áp dụng trên A trên một máy tính khác để có được hình ảnh B mới mà không làm ngập mạng. Tôi có các yêu cầu sau:

  • hoạt động trên Linux
  • có thể tạo khác
  • có thể sử dụng diffs để vá các tập tin
  • có thể xử lý tệp nhị phân
  • có thể xử lý các tệp lớn (vài trăm GB nên hoạt động)
  • không cần tương tác người dùng (chỉ cần một ứng dụng giao diện điều khiển)
  • lý tưởng là có thể đọc từ / ghi vào các đường ống (để tôi có thể dẫn vào nó từ một tệp nén gzip và ghi vào một)

Có một cái gì đó như thế tồn tại?


Tôi nhấn phím Enter quá nhanh khi bắt đầu tiền thưởng. Đây là văn bản tôi muốn thêm:
Basj

Một câu trả lời với một ví dụ dễ tái tạo rdiffsẽ có giá trị để tham khảo trong tương lai. Ví dụ: Giả sử file1file2là hai tệp tương tự nhau mỗi tệp 1GB. 1) Làm thế nào để tính toán các thông số? 2) Làm thế nào để lưu thông tin này vào một patchtập tin? 3) Làm thế nào để áp dụng patchtập tin này file1để phục hồi file2?
Basj

Câu trả lời:


13

Có lẽ bạn nên xem xét các công cụ rsync liên quan đến: rdiffrdiff-backup . Các rdifflệnh cho phép bạn tạo ra một tập tin vá lỗi và áp dụng nó cho một số tập tin khác.

Các rdiff-backuplệnh sử dụng phương pháp này để đối phó với toàn bộ thư mục, nhưng tôi đoán bạn đang làm việc với hình ảnh đĩa đơn tập tin, vì vậy rdiffsẽ là một trong để sử dụng.


1
"Chữ ký" và "delta" có nghĩa là gì đối với ndiff? Trang người đàn ông không nói.
Tor Klingberg

1
Để trả lời câu hỏi của riêng tôi, tạo một delta với ndiff là một quá trình gồm hai bước. Đầu tiên tạo một tệp chữ ký từ tệp cũ, sau đó sử dụng chữ ký và tệp mới để tạo delta. Chúng có thể được chạy cùng vớirdiff signature oldfile | rdiff delta - newfile deltafile
Tor Klingberg

1
@TorKlingberg Bạn có thể gửi câu trả lời mới với một ví dụ không? Giả sử file1file2là hai tệp tương tự nhau mỗi tệp 1GB. 1) Làm thế nào để tính khác? 2) Làm thế nào để lưu khác biệt này vào một tập tin vá? 3) Làm thế nào để áp dụng tập tin vá này file1để phục hồi file2?
Basj

7

xdelta có thể làm mọi thứ bạn muốn. Cảnh báo Hội chợ tuy nhiên, nếu hình ảnh của bạn không phải là rất tương tự, bạn có thể kết thúc với một bản vá rất lớn, bởi vì sử dụng xdelta một nửa số bộ nhớ đệm được xác định cho việc tìm kiếm sự khác biệt. Thông tin thêm có sẵn tại trang wiki TuneMemoryB lí . Tăng kích thước bộ đệm có thể giúp đỡ khá nhiều.

bsdiff là một tùy chọn khác, nhưng nó rất ngốn RAM và hoàn toàn không phù hợp với bất kỳ kích thước nào của hình ảnh đĩa.

bsdiff khá đói bộ nhớ. Nó đòi hỏi max(17*n,9*n+m)+O(1)byte bộ nhớ, nkích thước của tệp cũ và mkích thước của tệp mới. bspatch yêu cầu n+m+O(1)byte.


3

Trả lời Canonical

Về rdiff bài viết, librsync 2.0.1 là một đọc tốt cho việc làm rõ chức năng lệnh vì vậy tôi đã tham chiếu mà dưới đây để bảo vệ nội dung cho câu trả lời này nếu không có gì khác.

Điều quan trọng là bạn phải cố gắng để có được một sự hiểu biết tốt về rdiff ba bước để cập nhật một tập tin: chữ ký , đồng bằng , và như nói về trên rdiff trang người đàn ông. Tôi cũng đã tìm thấy một tập rdifflệnh ví dụ lệnh trên GitHub rất hữu ích mà tôi sẽ tham khảo và trích dẫn.

Bản chất...

  1. Với "bắt đầu" hoặc tệp cơ sở [ file1] và bạn tạo một tệp chữ ký từ nó
    • Cái này thường nhỏ hơn nhiều so với tệp gốc / tệp gốc
  2. Với tệp chữ ký, bạn so sánh nó với tệp khác [ file2] tương tự tệp cơ sở của bạn nhưng khác ( ví dụ: được cập nhật gần đây ) và tạo tệp delta chỉ chứa sự khác biệt giữa hai tệp
  3. Sử dụng "chỉ khác biệt" hoặc tệp delta và so sánh nó với tệp cơ sở của bạn [ file1] để tạo tệp mới chứa các thay đổi từ tệp khác [ file2] khớp với hai tệp .

Lệnh nhanh (mỗi 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

ndiff-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

Giới thiệu

ndiff là một chương trình để tính toán và áp dụng deltas mạng. Một delta delta là một delta giữa các tệp nhị phân, mô tả cách có thể tự động chỉnh sửa tệp cơ sở (hoặc cũ) để tạo tệp kết quả (hoặc mới).

Không giống như hầu hết các chương trình khác, librsync không yêu cầu quyền truy cập vào cả hai tệp khi độ lệch được tính toán. Việc tính toán một delta yêu cầu chỉ cần một "chữ ký" ngắn của tệp cũ và nội dung đầy đủ của tệp mới. Chữ ký chứa tổng kiểm tra cho các khối của tập tin cũ. Sử dụng các tổng kiểm tra này, ndiff tìm thấy các khối phù hợp trong tệp mới và sau đó tính toán delta.

Deliff deltas thường ít gọn hơn và cũng chậm sản xuất hơn xdeltas hoặc khác biệt văn bản thông thường. Nếu có thể có cả tệp cũ và tệp mới khi tính toán delta, xdelta thường sẽ tạo ra một tệp nhỏ hơn nhiều. Nếu các tệp được so sánh là văn bản thuần túy, thì GNU diff thường là lựa chọn tốt hơn, vì các khác biệt có thể được xem bởi con người và được áp dụng dưới dạng khớp không chính xác.

Thông báo xuất hiện khi không thuận tiện để có cả hai tệp cùng một lúc. Một ví dụ về điều này là hai tệp nằm trên các máy riêng biệt và bạn chỉ muốn chuyển các khác biệt. Một ví dụ khác là khi một trong các tệp đã được chuyển sang lưu trữ hoặc sao lưu phương tiện, chỉ để lại chữ ký của nó.

Tượng trưng

signature(basis-file) -> sig-file

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

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

Sử dụng các mẫu

Một ứng dụng điển hình của thuật toán rsync là chuyển tệp A2 từ máy A sang máy B có tệp A1 tương tự. Điều này có thể được thực hiện như sau:

  1. B tạo chữ ký thứ 1 của A1. Gọi S1 này. B gửi chữ ký đến A. (Chữ ký thường nhỏ hơn nhiều so với tệp mà nó mô tả.)
  2. A tính toán đồng bằng bậc 1 giữa S1 và A2. Gọi delta này D. A gửi delta đến B.
  3. B áp dụng delta để tạo lại A2. Trong trường hợp A1 và A2 chứa các byte giống hệt nhau, thì thông báo sẽ tiết kiệm không gian đáng kể.

nguồn


1
Cảm ơn rât nhiều!
Basj

1

JDIFF là một chương trình đưa ra sự khác biệt giữa hai tệp (nhị phân).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.