Có một hệ thống tập tin chỉ giữ một bản sao của một tập tin và các bản sao khác chỉ là tài liệu tham khảo?


18

Câu hỏi có thể không chính xác vì vậy tôi sẽ cố gắng giải thích chi tiết hơn.

Vì nhiều lý do, tôi có rất nhiều bản sao của cùng một tệp trên hệ thống tệp Linux của mình. Nhiều người trong số họ là khá lớn.

Nói rằng tôi có /path/to/some.filevà bản sao của tập tin này /other/path/file.name/yet/another/path/third.copy. Tôi tự hỏi nếu có một hệ thống tệp mà theo nghĩa đen sẽ làm cho hai trong số các tệp này hoạt động như một tham chiếu đến bản gốc. Đương nhiên, nếu người dùng sửa đổi một trong số họ, và sau đó họ trở thành các tệp độc lập.

Tái bút Tôi biết điều này có thể được thực hiện (một phần) bằng cách sử dụng các liên kết. Nhưng tôi muốn tính năng này tôi đã cố gắng giải thích ở trên để được xử lý trong suốt bởi hệ thống tệp.


Vì dường như chưa có một câu trả lời hoàn hảo nào, tại sao bạn không viết một tập lệnh (có thể chạy từ cron) thay thế các tệp bằng các liên kết cứng (hoặc, nếu nó an toàn cho một số trong số chúng, các liên kết tượng trưng)? Trong mọi trường hợp, nếu bạn chưa biết tất cả các bản sao ở đâu, hãy xem fdupes code.google.com/p/fdupes .
Joe

1
Tôi không thể làm điều đó bởi vì khi một số người dùng thay đổi dữ liệu theo một trong các bản sao, họ sẽ trở thành các tệp độc lập vì nội dung sẽ khác sau khi thay đổi ... Nếu tôi tạo liên kết tượng trưng, ​​thì sửa đổi sẽ thực sự thay đổi bản gốc. Hãy nghĩ về tệp gốc là một giá trị trong ngôn ngữ lập trình chức năng - khi bạn sửa đổi nó, bạn sẽ nhận được một đối tượng mới và tham chiếu đến nó.
DejanLekic

ĐỒNG Ý. Chỉ là một số ý tưởng: Có một số cách bạn có thể nhận được giữa người dùng của mình và các tệp này? Nếu bạn có thể, bạn có thể bắt đầu với một liên kết (sym hoặc hard) và sau đó ngắt liên kết nếu họ ghi bất cứ điều gì vào tệp. Bạn cũng có thể sử dụng một cái gì đó như diff để chỉ lưu trữ sự khác biệt để tiết kiệm nhiều không gian như trong một hệ thống kiểm soát phiên bản. Nếu bạn đặt các tệp vào một trong số đó, nó có thể quản lý sự khác biệt cho bạn. Tôi chưa sử dụng hệ thống vcs nhiều, vì vậy tôi không biết chi tiết.
Joe

Câu trả lời:


17

Tính năng này được gọi là trùng lặp . Không có hệ thống tập tin Linux phổ biến nào (ext *) hỗ trợ nó, nhưng rõ ràng, ZFS hỗ trợ nó một phần . Ngoài ra còn có một bảng liệt kê các hệ thống tập tin , trong số những người khác, trùng lặp, nhưng dường như không có bất kỳ lựa chọn phổ biến nào - mặc dù đó là một tính năng được lên kế hoạch cho Btrfs.

Tôi đoán rằng việc kiểm tra định kỳ hệ thống tập tin của bạn và tạo các liên kết cứng phù hợp là cách tốt nhất bạn có thể làm vào lúc này, mặc dù điều đó không bao hàm việc sao chép khi ghi.


Tôi hy vọng BTRFS sẽ có nó. Tôi không biết họ dự định có tính năng này - tin tốt! Cảm ơn!
DejanLekic

10

Từ khóa chính bạn muốn tìm là "sao chép trên ghi". BTRFS có một hoạt động nhân bản thực hiện chính xác những gì bạn muốn và cp --reflinksẽ làm những gì bạn đang tìm kiếm, miễn là hệ thống của bạn có kernel và coreutils đủ hiện đại 7.5. Nguồn Wiki Ngoài ra, bedup là một công cụ sẽ hợp nhất các bản sao trên toàn bộ một tập. CoW cũng là tính năng lái xe bên dưới công nghệ chụp nhanh của btrfs, IIRC.


Tôi biết cp --reflinknhưng lưu ý rằng tôi thực sự muốn FS phát hiện bản sao và sử dụng tài liệu tham khảo thay thế, một cách minh bạch. Tôi cũng là bedupcông cụ.
DejanLekic

Khi một quá trình ở cấp độ người dùng đọc từ một tệp và ghi vào một tệp khác, làm thế nào lớp FS sẽ biết rằng đó là một bản sao chính xác chứ không phải là một bản sao được sửa đổi? Đó là lý do tại sao có một ioctl riêng để nhân bản so với chỉ đọc và viết. Các ứng dụng muốn sao chép các tệp và muốn sử dụng CoW nên sử dụng những thứ đó khi có sẵn và quay lại nếu không. Không có phương pháp ma thuật đáng tin cậy nào mà lớp FS có thể phát hiện một bản sao xảy ra và thay vào đó làm CoW. Một ứng dụng phải sử dụng lệnh gọi thích hợp cho công việc ( cp --reflink/ clone) hoặc một công cụ riêng biệt để hoàn thành công việc sau này (bedup).
afrazier

Bằng cách so sánh các giá trị băm (an toàn hơn) hoặc crc + dấu thời gian. Viết chắc chắn sẽ khiến FS tạo một bản sao độc lập của một tệp. Hơn nữa, hệ thống này được triển khai ở cấp độ trang ...
DejanLekic

Và nơi chính xác trong kernel được thực hiện? Những gì bạn đang nói không phải là một vấn đề đơn giản. Làm điều đó ở cấp độ trang cũng có thể, nhưng yêu cầu số lượng RAM lớn để thực hiện nội tuyến - ZFS có thể hơn 20 GB RAM cho mỗi TB dữ liệu [Nguồn ] và OpenDedup muốn 8 GB RAM cho mỗi TB dữ liệu / 4k trang [Nguồn ]. Các yêu cầu của ZFS có thể được giảm với L2ARC với chi phí hiệu năng.
afrazier

1
WHS không thực hiện khấu trừ, trừ khi bạn đang nói về cửa hàng sao lưu. Trong trường hợp phần mềm sao lưu, máy khách có thể thực hiện hầu hết các công việc và kiểm tra hàm băm với máy chủ trước khi gửi bất kỳ dữ liệu nào tới nó để ghi. Một dịch vụ sao lưu là một con thú rất khác với một hệ thống tập tin. Các chiến lược hoạt động cho một người có thể không khả thi cho người khác.
afrazier

4

Có một hệ thống tệp trực tuyến S3QL được thiết kế để sao lưu với khả năng chống trùng lặp lớn.


Tôi nên nói rằng tôi cần điều này cho một hệ thống tập tin cục bộ ... +1 dù sao để có thông tin hữu ích.
DejanLekic

@DejanLekic, các url như local: // ... được cho phép.
Daniel Fanjul

0

Zfs, btrfs, ext3cow, bcachefs (afaik, nhưng có khả năng nó chưa được thực hiện). Microsoft đã có một trong quá trình phát triển nhưng họ đã dừng lại mà không rõ lý do.

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.