Dlaczego „cp -R --reflink = always” wykonuje standardową kopię w systemie plików btrfs?

12

Btrfs obsługuje kopiowanie przy zapisie. Próbowałem użyć tej funkcji do sklonowania katalogu:

cp -R --reflink=always foo_directory foo_directory.mirror

Oczekiwałem, że polecenie zakończy się prawie natychmiast (jak a btrfs subvolume snapshot), ale cpwydaje się, że polecenie wykonuje powolną, standardową kopię.

Według strony podręcznika spodziewałbym się, że będę --reflink=alwayswymuszał kopiowanie przy zapisie:

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.

Pytania:

  • Czy wiesz dlaczego --reflink=alwaysnie działa?
  • Jakich opcji (lub innych poleceń) powinienem użyć zamiast tego?
Philipp Claßen
źródło

Odpowiedzi:

20

cp --reflink=alwaysprawie na pewno działa poprawnie. Gdyby tak nie było, pojawiałby się błąd. Z założenia jest to różnica między --reflink=alwaysi --reflink=auto. Błąd wyglądałby następująco:

# Filesystem that does not support the feature at all
cp: failed to clone `xx' from `yy': Inappropriate ioctl for device

# Filesystem that does support it, but copy across filesystems
cp: failed to clone `xx' from `yy': Invalid cross-device link

Czy kopiujesz strukturę katalogów z dużą ilością małych plików? W takim przypadku cpnadal trzeba utworzyć każdy katalog oraz otworzyć i zamknąć każdy plik, więc w przeciwieństwie do niego, to zajmie trochę czasu btrfs subvolume snapshot. To najprawdopodobniej tłumaczy czas potrzebny na wykonanie operacji.

Celada
źródło
3
Tak, zawiera ogromną liczbę plików, w większości małych plików tekstowych. Nie wiedziałem, że cp nadal musi przetwarzać każdy plik. Dzięki, tej części nie zrozumiałem. Myślę, że w moim przypadku użycia lepiej jest utworzyć zapisywalną migawkę.
Philipp Claßen,
1
Tak, jeśli możesz stworzyć migawkę, wybierz ją. cp --reflink=alwaysnadal może się przydać, gdy to, co próbujesz sklonować, nie jest źródłem podobjętości, ponieważ btrfs subvolume snapshotdziała tylko na podobjętościach, a nie na częściach podobjętości.
Celada