Dlaczego cp --reflink = auto nie jest zachowaniem domyślnym?


31

Dlaczego cp --reflink=autozachowanie domyślne nie jest ? Czy może to spowodować jakąkolwiek szkodę, aby to umożliwić?

Czy można go włączyć w czasie kompilacji, aby był używany w całym systemie, nie tylko w interaktywnych powłokach?


4
Tak, dobre pytanie. IMHO to zrobi, ponieważ tylko BTRFS zaczyna być domyślnym systemem plików Linux.
Adam Ryczkowski

Odpowiedzi:


38

Nie jest to ustawienie domyślne, ponieważ ze względu na niezawodność można chcieć wykonać kopię w celu ochrony przed uszkodzeniem danych. Również ze względu na wydajność możesz chcieć, aby zapisy miały miejsce w czasie kopiowania, a nie jakiś proces wrażliwy na opóźnienia, pracujący na pliku CoW i opóźniony przez zapisy na innej części dysku mechanicznego. Zauważ, że z coreutils v8.24 mv domyślnie odsyła link, ponieważ nie ma powyższych ograniczeń.


8
(można to uznać za wiarygodną odpowiedź, ponieważ Pádraig jest opiekunem GNU coreutils).
Stéphane Chazelas,

8
Wątpię, czy ta odpowiedź jest poprawna, przynajmniej na btrfs. Jeśli plik zostanie później zapisany, nowe dane i tak zostaną zapisane w innym sektorze dysku ze względu na oprogramowanie btrfs CoW, więc nie ma zaległości w opóźnieniu, jeśli nie robi się odsyłaczy. Pliki, które mają ustawiony zestaw NoDataCoW, nie mogą zostać ponownie połączone. Jeśli chcesz zabezpieczyć się przed uszkodzeniem danych, musisz skopiować na inną partycję, a łącza zwrotne również nie będą działać.
JanKanis,

3
Występują problemy z opóźnieniami, ponieważ BTRFS musi znaleźć i przydzielić miejsce w czasie zapisu. To może nawet nie być dostępne, a zatem generowanie błędów ENOSPC podczas zapisu
Pádraig Brady

1
Jakie zastosowanie ma mv dla reflink?
Macil

1
krzyżuj podwieszane nazwy na btrfs
Pádraig Brady

17

Nie wiem, dlaczego to nie jest domyślny, może dlatego, że zachowuje się tak samo jak innych narzędzi kopiujących ( rsync, cpio, pax, tar...), które nie mają wsparcia dla go (lub gdy pliki zostaną skopiowane całej interfejsu, który nie pozwala na to (jak NFS, samba, warstwy systemów plików bezpieczników ...).

Byłem w tej samej sytuacji kilka lat temu i patrząc szybko na kod GNU cp, wciąż jest tak samo, musisz załatać kod, aby uzyskać inne domyślne zachowanie:

--- coreutils-8.21/src/cp.c~    2013-06-22 21:50:26.265639114 +0100
+++ coreutils-8.21/src/cp.c     2013-06-22 21:51:06.880513924 +0100
@@ -775,7 +775,7 @@ cp_option_init (struct cp_options *x)
   x->interactive = I_UNSPECIFIED;
   x->move_mode = false;
   x->one_file_system = false;
-  x->reflink_mode = REFLINK_NEVER;
+  x->reflink_mode = REFLINK_AUTO;

   x->preserve_ownership = false;
   x->preserve_links = false;

4

Jednym z dużych problemów jest możliwość zabraknięcia miejsca na kopiowanie podczas pisania.

W przypadku normalnej kopii, gdy tylko kopia się zakończy, nigdy nie będziesz musiał się martwić, że zapis do istniejących części pliku nie powiedzie się: miejsce jest całkowicie przydzielone i nie zniknie, dopóki nie usuniesz pliku. Ale w przypadku kopii z odsyłaczem zawsze istnieje ryzyko, że w pewnym momencie tygodni lub miesięcy później zapis do istniejącej części pliku zakończy się niepowodzeniem, ponieważ nie ma wystarczającej ilości miejsca na kopię.

Odkrycie, że Twój system wykonywał kopie odnośników za twoimi plecami, gdy taka operacja nie powiodła się, byłoby dość paskudną niespodzianką.


Przynajmniej na btrfs nawet zapis do już przydzielonej części pliku może się nie powieść z ENOSPC ...
graywolf

2
alias cp='cp --reflink=auto --sparse=always'

ma lepszy sens niż łatanie kodu


6
Wygląda na to, że przeoczyłeś opcję Czy można ją włączyć w czasie kompilacji, więc jest używana w całym systemie, nie tylko w interaktywnych powłokach w pytaniu PO.
Stéphane Chazelas,

5
@StephaneChazelas Zawsze można zmienić nazwę /bin/cpi zastąpić go podobnym skryptem powłoki
goncalopp

0
  1. Powody niezawodności, które mogą być potrzebne, aby wykonać kopię w celu ochrony przed „utratą” danych.

    Nie wiemy, z tego powodu, ale złe rzeczy, które mogą się zdarzyć, ograniczają się do zniszczenia mediów. Większość wszystkich urządzeń blokowych będzie miała jakąś formę identyfikacji uszkodzenia (CRC), jeśli nie przesyła korekcji błędów (parzystość).

  2. Nie ze względu na wydajność.

    CoW dzieje się, gdy tylko część kasowania? blok jest zapisany do. Z nowoczesnym! Dyskiem! urządzenie rozmiar bloku sprzętowego jest wielokrotnością 4k. Zmiana części 4k powoduje, że dysk odczytuje cały 4k i zapisuje go ponownie, ale ponadto jądro zrobi to samo, więc nie dojdzie do częściowego zapisu do urządzenia blokowego, SSD lub w inny sposób . Jądro musi wykonać CoW z tych samych powodów, chyba że mamy buforowaną kopię, nie możemy stworzyć danych, które istnieją w innych częściach urządzenia, z wyjątkiem bajkowego końca pliku, ale wtedy chodzi o to, że sporny. Ale buforowanie kopii pliku i kopiowanie pliku to różne operacje, z których pierwsza jest znacznie tańsza.

    Adres zapisu jest nieistotny, ale należy wiedzieć, że „pewna nieużywana część urządzenia” jest tańsza do wykrycia niż „gdzie obecnie znajdują się bloki pliku”.

Faktem jest, że każda metoda CoW jest tańsza lub równa prostej aktualizacji urządzenia blokowego. Gdybyśmy nie rozmawiali o urządzeniach blokowych, byłaby to inna historia ... Zapisana gdzieś na taśmie.

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.