Tạo một tập tin tar có tổng kiểm


16

Đây là vấn đề của tôi: Tôi cần lưu trữ vào các tệp tar rất nhiều (tối đa 60 TB) các tệp lớn (thường là 30 đến 40 GB mỗi tệp). Tôi muốn thực hiện tổng kiểm tra (md5, sha1, bất cứ điều gì) của các tệp này trước khi lưu trữ; tuy nhiên không đọc mọi tệp hai lần (một lần để kiểm tra, hai lần cho tar'ing) ít nhiều là cần thiết để đạt được hiệu suất lưu trữ rất cao (LTO-4 muốn duy trì 120 MB / s và cửa sổ sao lưu bị hạn chế).

Vì vậy, tôi cần một số cách để đọc một tập tin, cung cấp một công cụ kiểm tra ở một bên và xây dựng một tar để băng ở phía bên kia, một cái gì đó cùng:

tar cf - files | tee tarfile.tar | md5sum -

Ngoại trừ việc tôi không muốn tổng kiểm tra của toàn bộ kho lưu trữ (mã shell mẫu này chỉ thực hiện điều này) mà là tổng kiểm tra cho từng tệp riêng lẻ trong kho lưu trữ.

Tôi đã nghiên cứu các tùy chọn GNU tar, Pax, Star. Tôi đã xem nguồn từ Lưu trữ :: Tar . Tôi thấy không có cách rõ ràng để đạt được điều này. Có vẻ như tôi sẽ phải tự tay xây dựng một cái gì đó bằng C hoặc tương tự để đạt được những gì tôi cần. Perl / Python / etc đơn giản là sẽ không cắt giảm hiệu năng và các chương trình tar khác nhau bỏ lỡ "kiến trúc plugin" cần thiết. Có ai biết bất kỳ giải pháp hiện có nào cho việc này trước khi tôi bắt đầu viết mã không?


2
Chắc chắn âm thanh như một sự bổ sung hữu ích tarnếu bạn quyết định viết nó;)

1
Không câu hỏi của bạn, nhưng với 7zbạn có thể chọn các hash và in nó trong một cách mà sha1sumsha256sumcó thể hiểu được: 7zip.bugaco.com/7zip/7zip_15_09/MANUAL/cmdline/commands/... (và sami-lehtinen.net/blog/... ) Dùng thử: 7z h -scrcsha256 mydir/* | sed --regexp-extended 's, +[0-9]+ +, ,g' > mydir.sha256sum ; sha256sum -c mydir.sha256sum(đã thử nghiệm với p7zip Phiên bản 15.09 beta)
Nemo

Câu trả lời:


14

Trước khi tiếp tục và viết lại tar, bạn có thể muốn lập hồ sơ phương pháp đọc dữ liệu nhanh chóng và dễ dàng hai lần, vì nó có thể không chậm hơn nhiều so với thực hiện trong một lần.

Phương thức hai pass được ngụ ý ở đây:

http://www.g-loaded.eu/2007/12/01/veritar-verify-checksums-of-files-within-a-tar-archive/

với một lớp lót:

  tar -cvpf mybackup.tar myfiles/| xargs -I '{}' sh -c "test -f '{}' && 
  md5sum '{}'" | tee mybackup.md5

Mặc dù đúng là md5sum đang đọc từng tệp từ đĩa song song với tar, thay vì truyền dữ liệu qua đường ống, bộ đệm đĩa Linux nên đọc lần thứ hai này một cách đọc đơn giản từ bộ nhớ đệm, điều này thực sự không nên chậm hơn một stdin đọc. Bạn chỉ cần đảm bảo rằng bạn có đủ dung lượng trong bộ đệm đĩa để lưu trữ đủ từng tệp mà trình đọc thứ 2 luôn đọc từ bộ đệm và không đủ xa để lấy từ đĩa


2
Nó thực sự hoạt động khá tốt, nó có vẻ bị hạn chế bởi khả năng CPU để xử lý md5 (~ 280MB / s trên một lõi).
wazoox

4

Đây là một ví dụ về kịch bản Python. Nó tính toán tổng kiểm tra của tệp khi nó được thêm vào kho lưu trữ. Vào cuối tập lệnh, tệp tổng kiểm tra được thêm vào kho lưu trữ.

import hashlib,os
import tarfile
def md5(filename):
    ''' function to get md5 of file '''
    d = hashlib.md5()
    try:
        d.update(open(filename).read())
    except Exception,e:
        print e
    else:
        return d.hexdigest()

root="/home"
outtar=os.path.join(root,"path1","output.tar")
path = os.path.join(root,"path1")
chksum_file=os.path.join(root,"path","chksum.txt")
tar = tarfile.open(outtar, "w")
o_chksum=open(chksum_file,"w")
for r,d,f in os.walk(path):
    for files in f:
        filename=os.path.join(r,files)
        digest="%s:%s"%(md5(filename) , filename)
        o_chksum.write(digest+"\n")
        tar.add(os.path.join(r,files))

tar.add(chksum_file)
tar.close()
o_chksum.close()

Khi bạn mở khóa, sử dụng chksum_file để xác minh tổng kiểm tra


1
Vâng, đó là một cái gì đó giống như tôi nghĩ, nhưng thông thường các loại thư viện này tải tệp vào RAM trước khi thao tác và các tệp của tôi ít nhất là 20 GB ....
wazoox

1

Tôi nghĩ rằng vấn đề của bạn là vấn đề thiết kế tar vì tar không cho phép truy cập / định vị ngẫu nhiên bên trong tệp lưu trữ thông qua bảng nội dung, do đó tất cả các giao thức sẽ là tệp và không dựa trên bộ đệm.
Do đó, bạn có thể xem các định dạng khác nhau như PAX hoặc DAR cho phép truy cập ngẫu nhiên.


1
Thật không may, đầu ra tar là bắt buộc, bởi vì đó là những gì quy trình công việc dựa trên.
wazoox

0

Các định dạng lưu trữ gần đây thường bao gồm một số hàm băm để xác minh tệp, nhưng chúng có một vấn đề tương tự: bạn không thể luôn chọn chức năng băm của riêng mình, cũng không giữ một bản sao băm cục bộ.

Bạn có thể muốn lưu một bản sao băm cục bộ, khác với bản sao được nhúng trong chính kho lưu trữ: ví dụ: nếu kho lưu trữ được lưu trữ ngoại tuyến (trên băng hoặc trung tâm dữ liệu đắt tiền để đọc) và bạn muốn xác minh bản sao cục bộ của một tập tin / thư mục.

7zip có một số tùy chọn như 7z hvới hàm băm tùy chỉnh7z l -sltliệt kê tất cả các giá trị băm và không có gì, nhưng nếu bạn muốn có một danh sách băm md5 hoặc sha1 thì sao? Bạn có thể sử dụng -bb-bs để kiểm soát mức độ chi tiết và sử dụng lại phương pháp George Notara được đề cập trong câu trả lời được chấp nhận:

7z a -bsp1 -bb3 dir.7z dir 2>&1 \
| grep "^+" | sed 's,^+ ,,g' | xargs -d "\n" -I § -P 1 sh -c "test -f '§' && sha1sum '§'" \
| tee dir.sha1
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.