Có bất kỳ kịch bản sao chép nào sử dụng btrfs CoW làm khấu trừ không?


9

Tìm kiếm các công cụ chống trùng lặp trên Linux có rất nhiều, xem ví dụ trang wiki này .

Tất cả các tập lệnh đều chỉ phát hiện, in tên tệp trùng lặp hoặc xóa các tệp trùng lặp bằng cách liên kết chúng với một bản sao duy nhất.

Với sự gia tăng của btrfs, sẽ có một tùy chọn khác: tạo bản sao CoW (copy-on-write) của một tệp (như cp reflink=always). Tôi chưa tìm thấy công cụ nào thực hiện việc này, có ai biết công cụ này không?


Cập nhật: Chi nhánh phát triển của rmlint và tôi cũng tin là bậc thầy, đã thêm vào như sau: 1) Băm tập tin tăng dần. Nó sẽ không băm lại một tập tin, trừ khi nó thay đổi kể từ lần chạy trước [rất lớn]. 2) Khấu trừ gia tăng . Nó chỉ khấu trừ các tệp chưa có hoặc đã thay đổi. [Điều đó thậm chí còn hơn.] Kết hợp với chỉ các tệp băm sau khi tất cả các phương pháp so sánh nhanh khác đều thất bại, làm cho nó không thể đánh bại. Bedup bị bỏ rơi và dường như sẽ không được biên dịch. Tôi đã làm một so sánh chi tiết: docs.google.com.vn/sản ra / d / Sự
Jim

Câu trả lời:


17

Tôi đã viết bedup cho mục đích này. Nó kết hợp quét btree gia tăng với trùng lặp CoW. Sử dụng tốt nhất với Linux 3.6, nơi bạn có thể chạy:

sudo bedup dedup

Xin chào @Gabriel, một bình luận cho câu trả lời của tôi dưới đây nói rằng "... bedup ... đặt mọi thứ trong các thùng kích thước và chỉ đọc toàn bộ tệp, để tạo tổng kiểm tra, nếu cần thiết." Điều đó có đúng không? Nếu vậy, tôi muốn cập nhật câu trả lời của tôi dưới đây. (Và tự mình sử dụng bedup!) Thật không may, tôi không thể xác minh điều này ở bất cứ đâu. Tôi đã thử Google, tìm kiếm trên trang github của bạn và tìm kiếm trên mã. Cảm ơn.
Jim

4

Tôi đã thử bedup. Mặc dù tốt (và có một số tính năng khác biệt hữu ích có thể làm cho nó trở thành lựa chọn tốt nhất cho nhiều người), nó dường như quét toàn bộ tất cả các tệp mục tiêu để kiểm tra tổng.

Mà chậm một cách đau đớn.

Mặt khác, các chương trình khác, chẳng hạn như rdfind và rmlint, quét khác nhau.

rdfind có một tính năng "thử nghiệm" để sử dụng phản xạ btrfs. (Và các tùy chọn "rắn" cho liên kết cứng, liên kết tượng trưng, ​​v.v.)

rmlint có các tùy chọn "solid" cho btrfs clone, Reflink, liên kết cứng thông thường, symlink, xóa và các lệnh tùy chỉnh của riêng bạn.

Nhưng quan trọng hơn, rdfind và rmlint nhanh hơn đáng kể . Như trong, mệnh lệnh của độ lớn. Thay vì quét tất cả các tệp mục tiêu để kiểm tra, nó thực hiện điều này, khoảng:

  • Quét toàn bộ hệ thống tập tin đích, chỉ thu thập các đường dẫn và tập tin hóa.
  • Xóa khỏi xem xét, các tập tin với kích thước tập tin duy nhất. Điều này một mình, tiết kiệm thời gian và hoạt động đĩa. ("Scads" là một số hàm số mũ nghịch đảo hoặc một cái gì đó.)
  • Trong số các ứng cử viên còn lại, quét N byte đầu tiên. Xóa khỏi xem xét, những người có cùng kích thước tệp nhưng N byte đầu tiên khác nhau.
  • Làm tương tự cho N byte cuối cùng.
  • Chỉ còn lại (thường là một phần rất nhỏ), quét tổng kiểm tra.

Các ưu điểm khác của rmlint Tôi biết:

  • Bạn có thể chỉ định tổng kiểm tra. md5 quá đáng sợ? Hãy thử sha256. Hoặc 512. Hoặc so sánh bit-bit. Hoặc chức năng băm của riêng bạn.
  • Nó cung cấp cho bạn tùy chọn Btrfs "clone" và "Reflink", thay vì chỉ là Reflink. "cp --reflink = always" chỉ là một chút rủi ro, vì nó không phải là nguyên tử, nó không nhận thức được điều gì khác đang xảy ra đối với tệp đó trong kernel và nó không luôn bảo toàn siêu dữ liệu. "Clone", OTOH (là một thuật ngữ viết tắt ... Tôi đang bỏ trống tên liên quan đến API chính thức), là một cuộc gọi cấp hạt nhân là nguyên tử và bảo tồn siêu dữ liệu. Hầu như luôn luôn dẫn đến điều tương tự, nhưng một chút mạnh mẽ và an toàn hơn. (Mặc dù hầu hết các chương trình đều đủ thông minh để không xóa tệp trùng lặp, nhưng trước tiên, nó không thể tạo thành một phản xạ tạm thời cho người khác.)
  • Nó có rất nhiều tùy chọn cho nhiều trường hợp sử dụng (cũng là một nhược điểm).

Tôi đã so sánh rmlint với depuperemove - cũng quét một cách mù quáng tất cả các tệp mục tiêu để kiểm tra tổng. Duperemove mất vài ngày để hoàn thành âm lượng của tôi (4 tôi nghĩ), hoàn toàn nghiêng. fmlint mất vài giờ để xác định các bản sao, sau đó chưa đầy một ngày để khấu trừ chúng với bản sao Btrfs.

(Điều đó nói rằng, bất cứ ai nỗ lực để viết và hỗ trợ phần mềm mạnh mẽ, chất lượng và cung cấp miễn phí, xứng đáng với danh tiếng lớn!)

Btw: Bạn nên tránh khấu trừ bằng cách sử dụng các liên kết cứng thông thường như một giải pháp khấu trừ "chung", bằng mọi giá.

Mặc dù các liên kết cứng có thể cực kỳ tiện dụng trong các trường hợp sử dụng được nhắm mục tiêu nhất định (ví dụ: các tệp riêng lẻ hoặc với một công cụ có thể quét các loại tệp cụ thể vượt quá kích thước tối thiểu - hoặc là một phần của nhiều giải pháp sao lưu / sao lưu miễn phí và thương mại), nó có thể là thảm họa cho "sự trùng lặp" trên một hệ thống tập tin sử dụng chung lớn. Lý do là hầu hết người dùng có thể có hàng ngàn tệp trên hệ thống tệp của họ, giống hệt nhau nhị phân, nhưng khác nhau về chức năng.

Ví dụ: nhiều chương trình tạo tệp và / hoặc tệp cài đặt ẩn (đôi khi trong mọi thư mục có thể nhìn thấy), ban đầu giống hệt nhau - và hầu hết vẫn như vậy, cho đến khi bạn, người dùng, không cần phải như vậy.

Như một minh họa cụ thể: Các tệp bộ nhớ cache hình thu nhỏ ảnh, có vô số chương trình tạo trong thư mục chứa ảnh (và vì lý do chính đáng - tính di động), có thể mất hàng giờ hoặc nhiều ngày để tạo nhưng sau đó sử dụng ứng dụng ảnh một cách dễ dàng. Nếu các tệp bộ đệm ban đầu đó đều được liên kết cứng với nhau, thì sau đó bạn mở ứng dụng trên một thư mục và nó sẽ tạo một bộ đệm lớn ... sau đó hãy đoán xem: Bây giờ MỌI thư mục có bộ đệm được liên kết cứng trước đó, bây giờ có bộ đệm sai. Có khả năng, với kết quả thảm hại có thể dẫn đến hủy dữ liệu ngẫu nhiên. Và cũng có khả năng theo cách phát nổ một giải pháp sao lưu không nhận biết được liên kết cứng.

Hơn nữa, nó có thể làm hỏng toàn bộ ảnh chụp nhanh. Toàn bộ điểm chụp nhanh là để phiên bản "trực tiếp" có thể tiếp tục thay đổi, với khả năng quay trở lại trạng thái trước đó. Nếu mọi thứ được liên kết cứng với nhau mặc dù ... bạn "quay lại" với cùng một điều.

Mặc dù vậy, tin tốt là việc trích xuất bằng Btrfs clone / Reflink, có thể hoàn tác được thiệt hại đó (tôi nghĩ - vì trong quá trình quét, nó sẽ thấy các tệp được liên kết cứng giống hệt nhau ... trừ khi nó có logic để không xem xét các liên kết cứng. các tiện ích cụ thể thực hiện việc khấu trừ.)


Điều này LAF không đúng; bedup cũng làm như vậy, đặt mọi thứ vào các thùng kích thước và chỉ đọc toàn bộ tệp, để tạo tổng kiểm tra, nếu cần thiết. Ngoài ra, bedup lưu trữ kết quả của việc này để các lần chạy tiếp theo thậm chí còn nhanh hơn.
Peter Smit

@PeterSmit, tôi muốn cập nhật câu trả lời của mình (và xem xét tự mình quay lại bedup), nếu tôi có thể xác minh phần đầu tiên trong nhận xét của bạn. Github readme của Bedup không đề cập đến nó và việc tìm kiếm "kích thước tệp" hoặc "kích thước tệp" không mang lại câu trả lời rõ ràng. Làm thế nào tôi có thể xác minh?
Jim

Ngoài ra, bedup dường như bị bỏ rơi trong 3 năm qua. Thật là xấu hổ, vì nó có vẻ như là một ý tưởng thực sự tuyệt vời mà tôi thích sử dụng! Tôi hy vọng bạn chọn nó trở lại.
Jim
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.