Czy jakikolwiek system plików implementuje mechanizm kopiowania przy zapisie dla CP


16

Widzieliśmy, jak OS wykonuje optymalizację kopiowania przy zapisie podczas uruchamiania procesu. Powodem jest to, że przez większość czasu rozwidlenie jest wykonywane przez exec, więc nie chcemy ponosić kosztów alokacji stron i niepotrzebnego kopiowania danych z przestrzeni adresowej dzwoniącego.

Dzieje się tak również podczas wykonywania CP na systemie Linux z systemami plików ext4 lub xfs (kronikowanie). Jeśli tak się nie stanie, to dlaczego nie?


Mam nadzieję, że ktoś odpowie na to interesujące pytanie
Karim Manaouil,

Jednak nie sądzę, ponieważ na przykład skłanianie dużego pliku zajęłoby znacznie więcej czasu (kopiowanie danych do nowych bloków). Gdyby w takich systemach plików była COW (przynajmniej ext3 / ext4), nie zauważyłbyś opóźnienia czasowego (być może w takim przypadku replikacja i-węzła bez wskaźników do bloków danych i zaznaczenie flagi COW).
Karim Manaouil,

Kopiowanie przy zapisie jest zaimplementowane w ZFS i ma rzeczywiście bardzo tanie klony systemu plików / woluminów.
Wydaje

Odpowiedzi:


7

Szukane słowo kluczowe to reflink. Niedawno został zaimplementowany w XFS.

EDYCJA: implementacja XFS została początkowo oznaczona EKSPERYMENTALNA. To ostrzeżenie zostało usunięte w wersji 4.16 jądra, kilka miesięcy po napisaniu powyższego :-).


11

Ze cp strony podręcznika :

Jeśli podano opcję --reflink [= zawsze], wykonaj lekką kopię, w której bloki danych są kopiowane tylko po zmodyfikowaniu. Jeśli nie jest to możliwe, kopiowanie nie powiedzie się lub jeśli podano opcję --reflink = auto, wróć do standardowej kopii.

Działa to w systemach plików, które obsługują Copy-on-Write ( reflink ), obecnie głównie BTRFS. Implementacja odnośnika XFS jest w fazie rozwoju [1] [2] .


1
Niektóre sieciowe systemy plików, takie jak NFS, CIFS, OCFS2, mogą również przekazywać je do serwera.
Stéphane Chazelas

2

Linux ma wywołanie systemowe, które pozwala procesom przestrzeni użytkownika powiedzieć jądrze, aby wykonało kopię podczas zapisu kopii plików. FICLONERANGE i FICLONE używane jako opcje ioctl pozwalają na kopiowanie przy zapisie kopii plików i zakresów w plikach do wykonania.

Jest to używane przez cp --reflink do tworzenia kopii, w których system plików obsługuje to.


1

O ile nie wprowadzisz wywołania systemowego cp(lub przynajmniej skopiowania bloku), system operacyjny ma trudności z ustaleniem, że dane, które cpprogram będzie zapisywał, są takie same, jak dane, które właśnie odczytał z innego bloku. Co więcej, będziesz mieć dodatkowe koszty zarządzania scenariuszem „kilka plików ma te same bloki”. Duże podobne pliki, które różnią się tylko kilkoma blokami, zdarzają się rzadko. Tak więc ogólnie taniej jest po prostu skopiować te bloki, a następnie dodać to obciążenie administracyjne do wszystkich plików.

Teraz, jeśli „skopiujesz” pliki (ich wiele), dodając kolejny klon / migawkę systemu plików, powiedzmy, BTRFS, sytuacja wygląda inaczej: Teraz „skopiowałeś” wszystkie pliki w systemie plików i wszelkie zmiany w będą one kopiowane przy zapisie. Istnieje, ale nie w ext4.

„Journalling” to całkowicie niezależna koncepcja, liczą się struktury administracyjne plików.


Duże pliki, jeden będący kopią binarną innych, niezwykle rzadkich czasów, różnią się jednym bitem, a ponieważ tak się dzieje, jest to spowodowane błędem.
bitifet

Wprowadzono systemowe wezwanie do kopiowania (patrz moja odpowiedź).
Q dziobak
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.