Czy istnieje system plików, który przechowuje tylko jedną kopię pliku, a inne kopie są tylko referencjami?

18

Pytanie może być nieprecyzyjne, dlatego postaram się wyjaśnić je bardziej szczegółowo.

Z wielu powodów mam wiele kopii tego samego pliku w systemie plików Linux. Wiele z nich jest dość dużych.

Powiedz, że mam /path/to/some.filei kopie tego pliku /other/path/file.namei /yet/another/path/third.copy. Zastanawiam się, czy istnieje system plików, który dosłownie sprawiłby, że dwa z tych plików działałyby jako odniesienie do oryginału. Oczywiście, jeśli użytkownik zmodyfikuje jeden z nich, wtedy i tylko wtedy stają się niezależnymi plikami.

PS. Wiem, że można to (częściowo) osiągnąć za pomocą linków. Ale chcę, aby ta funkcja, którą starałem się wyjaśnić powyżej, była obsługiwana przez system plików w sposób przejrzysty.

DejanLekic
źródło
Ponieważ wydaje się, że nie ma jeszcze doskonałej odpowiedzi, dlaczego nie napisać skryptu (być może uruchomionego z crona), który zastępuje pliki twardymi linkami (lub, jeśli jest to bezpieczne dla niektórych z nich, dowiązaniami symbolicznymi)? W każdym razie, jeśli nie wiesz, gdzie są wszystkie duplikaty, sprawdź fdupes code.google.com/p/fdupes .
Joe
1
Nie mogę tego zrobić, ponieważ gdy jakiś użytkownik zmienia dane w jednym z duplikatów, powinien stać się niezależnym plikiem, ponieważ treść jest inna po zmianie ... Jeśli utworzę dowiązania symboliczne, modyfikacja faktycznie zmieni oryginał. Pomyśl o oryginalnym pliku jako wartości w funkcjonalnym języku programowania - po jego modyfikacji otrzymujesz dosłownie nowy obiekt i odniesienie do niego.
DejanLekic
DOBRZE. Tylko kilka pomysłów: czy jest jakiś sposób na uzyskanie dostępu między użytkownikami a tymi plikami? Jeśli możesz, możesz zacząć od linku (sym lub hard), a następnie przerwać link, jeśli coś zapisują w pliku. Możesz także użyć czegoś takiego jak diff, aby po prostu zapisać różnice i zaoszczędzić dużo miejsca, jak w systemie kontroli wersji. Jeśli umieścisz pliki w jednym z nich, może on zarządzać różnicami dla Ciebie. Nie korzystałem dużo z systemów vcs, więc nie znam szczegółów.
Joe

Odpowiedzi:

17

Ta funkcja nazywa się deduplikacją . Żaden z popularnych systemów plików Linux (ext *) nie obsługuje go, ale najwyraźniej ZFS obsługuje go częściowo . Istnieje również tabela systemów plików z listą, między innymi, deduplikacji, ale wydaje się, że nie ma żadnych popularnych wyborów - jest to jednak planowana funkcja dla Btrfs.

Sądzę, że okresowe sprawdzanie systemu plików i tworzenie odpowiednich twardych dowiązań to najlepsze, co możesz zrobić w tej chwili, chociaż nie oznacza to, że kopiowanie przy zapisie.

Klaudiusz
źródło
Miałem nadzieję, że BTRFS da to alraedy. Nie wiedziałem, że planują tę funkcję - dobra wiadomość! Dzięki!
DejanLekic
10

Głównym słowem kluczowym, którego chcesz szukać, jest „kopiuj przy zapisie”. BTRFS ma operację klonowania, która robi dokładnie to, co chcesz i cp --reflinkzrobi to, czego szukasz, pod warunkiem, że twój system ma wystarczająco nowoczesne jądro i coreutils 7.5. Wiki Źródło Również bedup jest narzędziem, które scali duplikaty na całej objętości. CoW to także funkcja jazdy pod technologią migawkową btrfs, IIRC.

afrazier
źródło
Jestem świadomy, cp --reflinkale zauważam, że tak naprawdę chcę, aby FS wykrywał klony i zamiast tego używał referencji, w sposób przezroczysty. Brakuje mi również tego bedupnarzędzia.
DejanLekic
Kiedy proces na poziomie użytkownika czyta z jednego pliku i zapisuje w innym, w jaki sposób warstwa FS będzie wiedzieć, że jest to dokładna kopia, a nie zmodyfikowana kopia? Właśnie dlatego istnieje oddzielny ioctl do klonowania, a nie tylko do czytania i pisania. Aplikacje, które chcą klonować pliki i chcą korzystać z oprogramowania CoW, powinny korzystać z takich rzeczy, jeśli są dostępne, i w przeciwnym razie mogą się wycofać. Nie ma niezawodnej magicznej metody, za pomocą której warstwa FS może wykryć zachodzącą kopię i zamiast tego wykonać CoW. Aplikacja musi albo użyć odpowiedniego wywołania zadania ( cp --reflink/ klon), albo osobnego narzędzia, aby zakończyć zadanie później (bedup).
afrazier
Porównując wartości skrótów (bardziej bezpieczne) lub crc + znacznik czasu. Zapis z pewnością spowodowałby, że FS utworzy niezależną kopię pliku. Ponadto system ten można wdrożyć na poziomie strony ...
DejanLekic,
I gdzie dokładnie to się dzieje w jądrze? To, o czym mówisz, nie jest prostym problemem. Wykonanie tego na poziomie strony jest również możliwe, ale wymaga ogromnej ilości pamięci RAM do wykonania w trybie bezpośrednim - ZFS może zawierać ponad 20 GB pamięci RAM na TB danych [Źródło ], a OpenDedup chce 8 GB pamięci RAM na TB danych w / 4k stron [Źródło ]. Wymagania ZFS można zmniejszyć za pomocą L2ARC kosztem wydajności.
afrazier
1
WHS nie robi deduplikacji, chyba że mówisz o magazynie kopii zapasowych. W przypadku oprogramowania do tworzenia kopii zapasowych klient może wykonać większość pracy i sprawdzić skrót z serwerem przed wysłaniem jakichkolwiek danych do zapisania. Usługa tworzenia kopii zapasowych to zupełnie inna bestia niż system plików. Strategie, które działają dla jednego, mogą nie być wykonalne dla drugiego.
afrazier
4

Istnieje internetowy system plików S3QL przeznaczony do tworzenia kopii zapasowych o dużej pojemności do deduplikacji.

Daniel Fanjul
źródło
Powinienem był powiedzieć, że potrzebuję tego dla lokalnego systemu plików ... w każdym razie +1 dla przydatnych informacji.
DejanLekic
@DejanLekic, adresy URL takie jak local: // ... są dozwolone.
Daniel Fanjul,
0

Zfs, btrfs, ext3cow, bcachefs (afaik, ale jest szansa, że ​​nie jest jeszcze zaimplementowany). Microsoft miał jeden w fazie rozwoju, ale zatrzymał się z nieznanych przyczyn.

orange_juice6000
źródło