Làm cách nào để tìm bản sao dữ liệu của một tệp đã cho trong hệ thống tệp Btrfs?


7

Tôi đã sao chép hệ thống tệp Btrfs của mình với bedup, vì vậy bây giờ tất cả các tệp trùng lặp (trên một kích thước nhất định) là bản sao "phản xạ".

Có cách nào để xem, được cung cấp một tên tệp, những tập tin khác là cùng một phản xạ?


Nếu không có cách riêng btrfs, bạn luôn có thể chạy filefrag -vtrên tất cả các tệp và tìm phạm vi chung.
Stéphane Chazelas

@ StéphaneChazelas không hoạt động. hai tệp không liên quan không có gì chung hiển thị cùng một đầu ra
Hilikus

@Hilikus, bạn có thể cần phải đưa ra một syncđặc biệt là nếu cờ hiển thị unknown_loc hoặc delalloc
Stéphane Chazelas

@ StéphaneChazelas gist.github.com/theHilikus/5fd0e38fd72fbcc97ae45ced703b0b47 như bạn thấy, hai tập tin khác nhau với nội dung và kích thước khác nhau cung cấp cho các offsets cùng
Hilikus

1
@Hilikus, vâng, trong trường hợp đó, không có gì để phản xạ (giống như đối với các tệp trống hoặc liên kết tượng trưng ngắn, không có khối dữ liệu). Tóm lại, thay vì so sánh filefrag -v, hãy so sánh filefrag -v | grep -ve inline -e unknown_loc -e delallocvì những điều đó không thể được làm lại. Bạn sẽ nhận thấy một manh mối khác trong đó "phần bù vật lý" luôn là 0 đối với những người đó (mặc dù tất nhiên chúng không phải là tất cả nằm ở đầu thiết bị khối)
Stéphane Chazelas

Câu trả lời:


3

Điểm chung của việc có một hệ thống tệp Copy-On-Write (CoW) như btrfs là nội dung của nhiều phiên bản của một tệp có thể được chia sẻ một cách hiệu quả. Vì vậy, bạn có thể thấy một tệp dưới dạng tập hợp các phạm vi có nội dung, trong đó nội dung có thể hoặc không thể được chia sẻ bởi các tệp khác. Hoặc bởi các phiên bản khác của tập tin. Việc thực hiện giống như một cây kéo dài, nơi kéo dài có thể được chia sẻ.

Cơ chế tương tự hoạt động trong khi viết một thay đổi cho một tệp (và do đó tạo ra một phiên bản mới của tệp đó) đang được sử dụng để thực hiện khấu trừ. Việc triển khai được mô tả trên https://github.com/g2p/bedup :

Sự trùng lặp được thực hiện bằng tính năng Btrfs cho phép sao chép dữ liệu từ tệp này sang tệp khác. Các phạm vi nhân bản trở thành chia sẻ trên đĩa, tiết kiệm không gian.

Việc triển khai trong kernel là (ví dụ) tại http://lxr.free-electrons.com/source/fs/btrfs/ioctl.c#L2843 ; Nhận xét cho thấy rõ rằng đó không phải là về 'phản xạ' tệp, mà là về phạm vi:

2843 /**
2844  * btrfs_clone() - clone a range from inode file to another
2845  *
2846  * @src: Inode to clone from
2847  * @inode: Inode to clone to
2848  * @off: Offset within source to start clone from
2849  * @olen: Original length, passed by user, of range to clone
2850  * @olen_aligned: Block-aligned value of olen, extent_same uses
2851  *               identical values here
2852  * @destoff: Offset within @inode to start clone
2853  */

Vì vậy, nó không phải là tập tin được phản ánh, đó là phạm vi được chia sẻ. Một tệp mới cũng có thể được xây dựng bằng cách chia sẻ phạm vi với nhiều tệp. Hoặc được chia sẻ trên các tập. Hoặc (không chắc chắn nếu điều này hiện được hỗ trợ) thậm chí có cùng phạm vi nhiều lần trong cùng một tệp;)

Do đó, không có công cụ cấp cao nào tồn tại để tìm các tệp chia sẻ toàn bộ tệp vì đây là khái niệm dẫn xuất. Tất nhiên là có thể viết hỗ trợ cho nó, nhưng đó không phải là trường hợp theo như tôi biết ...


0

Tôi vừa phát hành một chương trình có tên fienode(← link) tính toán hàm băm SHA1 của các mức độ vật lý của một tệp. Bản sao CoW giống hệt nhau có cùng hàm băm.

Về nguyên tắc, bạn có thể chạy nó trên tất cả các tệp trên hệ thống tệp và sau đó tìm các giá trị băm giống hệt nhau.

Ngoài ra còn có một câu trả lời chi tiết hơn ở đây, giải thích tại sao điều này là cần thiết.

Tuy nhiên, lưu ý rằng BTRFS có quyền tự do thay đổi phạm vi vật lý. Tôi đã quan sát thấy một tệp lớn bị phản xạ thay đổi phạm vi vật lý của nó mà không bị khiêu khích, làm cho fienodeđầu ra khác đi, mặc dù phần lớn các phạm vi vật lý vẫn được chia sẻ.

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.