Warum ist cp --reflink = auto nicht das Standardverhalten?


31

Warum ist cp --reflink=autonicht das Standardverhalten? Könnte es schaden, es zu aktivieren?

Ist es möglich, es zur Kompilierungszeit zu aktivieren, sodass es systemweit und nicht nur in interaktiven Shells verwendet wird?


4
Ja, gute Frage. IMHO wird es, da nur BTRFS anfängt, ein Standard-Linux-Dateisystem zu sein.
Adam Ryczkowski

Antworten:


38

Dies ist nicht die Standardeinstellung, da aus Gründen der Robustheit möglicherweise eine Kopie erstellt werden soll, um den Schutz vor Datenkorruption zu gewährleisten. Aus Gründen der Leistung möchten Sie möglicherweise, dass die Schreibvorgänge zum Zeitpunkt des Kopierens ausgeführt werden, anstatt dass ein latenzempfindlicher Prozess bei einer CoW-Datei ausgeführt wird und die Schreibvorgänge möglicherweise auf einen anderen Teil einer mechanischen Festplatte verzögert werden. Beachten Sie, dass mv ab Coreutils Version 8.24 standardmäßig neu verlinkt, da die oben genannten Einschränkungen nicht gelten.


8
(Dies könnte als maßgebliche Antwort angesehen werden, da Pádraig ein Betreuer von GNU coreutils ist.)
Stéphane Chazelas

8
Ich bezweifle, dass diese Antwort richtig ist, zumindest bei btrfs. Wenn in die Datei später geschrieben wird, werden die neuen Daten aufgrund von btrfs CoW ohnehin auf einen anderen Plattensektor geschrieben, so dass es keinen Latenzvorteil gibt, keine erneuten Links auszuführen. Dateien, für die NoDataCoW festgelegt ist, können ohnehin nicht erneut verknüpft werden. Und wenn Sie vor Datenkorruption schützen möchten, müssen Sie auf eine andere Partition kopieren, und auch ein erneutes Verknüpfen funktioniert nicht.
JanKanis

3
Es gibt Latenzprobleme, da BTRFS beim Schreiben Speicherplatz finden und zuweisen muss. Dies könnte nicht einmal verfügbar sein und ENOSPC-Fehler beim Schreiben auslösen
Pádraig Brady

1
Welchen Nutzen hat mv für den Rücklink?
Macil

1
Cross Subvolume Umbenennungen auf BTRFS
Pádraig Brady

17

Sie wissen nicht , warum es nicht der Standard, vielleicht so , dass es die gleichen wie andere Kopier Dienstprogramme verhält ( rsync, cpio, pax, tar...) , die keine Unterstützung hat für sie (oder , wenn Dateien über eine Schnittstelle kopiert werden , die nicht zulässt , dass (wie NFS, Samba, Sicherung Dateisystemebenen ...).

Ich war vor ein paar Jahren in der gleichen Situation und wenn ich mir den GNU-cp-Code schnell ansehe, ist er immer noch derselbe. Sie müssen den Code patchen, um ein anderes Standardverhalten zu erhalten:

--- 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

Ein großes Problem ist, dass beim Schreiben möglicherweise nicht genügend Speicherplatz zum Kopieren zur Verfügung steht.

Bei einer normalen Kopie müssen Sie sich keine Gedanken mehr darüber machen, ob ein Schreibvorgang in vorhandene Teile der Datei fehlschlägt. Der Speicherplatz wird vollständig zugewiesen und verschwindet erst, wenn Sie die Datei löschen. Bei einer Re-Link-Kopie besteht jedoch immer das Risiko, dass ein Schreibvorgang auf einen vorhandenen Teil der Datei in den nächsten Wochen oder Monaten fehlschlägt, da nicht genügend Speicherplatz zum Erstellen einer Kopie vorhanden ist.

Es wäre eine ziemlich böse Überraschung, festzustellen, dass Ihr System hinter Ihrem Rücken Re-Link-Kopien erstellt hat, als eine solche Operation fehlgeschlagen ist.


Zumindest bei btrfs kann sogar das Schreiben in einen bereits zugewiesenen Teil der Datei mit ENOSPC fehlschlagen ...
graywolf 21.07.18

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

Sinnvoller als das Patchen des Codes


6
Sieht so aus, als hätten Sie das übersehen. Ist es möglich, es beim Kompilieren zu aktivieren, so wird es systemweit verwendet, nicht nur in interaktiven Shells in der Frage des OP.
Stéphane Chazelas

5
@StephaneChazelas Man könnte es immer umbenennen /bin/cpund durch ein ähnliches Shell-Skript ersetzen
goncalopp

0
  1. Aus Gründen der Robustheit kann eine Kopie erforderlich sein, um den "Verlust" von Daten zu verhindern.

    Wir wissen nicht, dass dies der Grund ist, aber die schlechten Dinge, die passieren können, beschränken sich auf die Zerstörung von Medien. Die meisten Block-Geräte weisen eine Form der Korruptionsidentifikation (CRC) auf, wenn nicht eine Vorwärtsfehlerkorrektur (Parität).

  2. Nicht aus Performancegründen.

    CoW tritt auf, wenn nur ein Teil des Löschvorgangs ausgeführt wird. Block wird geschrieben. Mit modern! Disk! Gerät die Hardware-Blockgröße ist ein Vielfaches von 4k. Wenn ein Teil des 4k geändert wird, liest das Laufwerk den gesamten 4k und schreibt ihn erneut aus. Darüber hinaus wird der Kernel das Gleiche tun, sodass keine partiellen Schreibvorgänge auf das Block-Gerät, die SSD oder auf andere Weise gelangen . Der Kernel muss die CoW aus den gleichen Gründen ausführen. Wenn wir keine zwischengespeicherte Kopie haben, können wir die Daten, die in den anderen Teilen des Geräts vorhanden sind, nicht zusammenstellen. Speichern Sie sie für das Ende einer Datei, aber dann ist der Punkt streitig. Das Zwischenspeichern einer Kopie einer Datei und das Kopieren einer Datei sind jedoch von Vorgang zu Vorgang unterschiedlich. Ersteres ist viel billiger.

    Die Adresse des Schreibvorgangs spielt keine Rolle, aber Sie sollten wissen, dass "ein Teil des Geräts, der nicht verwendet wird", billiger zu finden ist als "wo sich die Blöcke der Datei derzeit befinden".

Tatsache ist, dass jede CoW-Methode entweder billiger oder gleichbedeutend mit dem einfachen Aktualisieren eines Blockgeräts ist. Wenn wir nicht über Blockgeräte sprechen würden, wäre es eine andere Geschichte ... Irgendwo auf Band geschrieben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.