Was passiert, wenn eine Datei während des Kopierens geändert wird?

19

Welche Auswirkungen hat das Kopieren einer Datei, z. B. fileA.big (900 MB), von Speicherort B nach Speicherort C? Wenn während dieses CP-Vorgangs, sagen wir, 35% während des Vorgangs, fileA.big mit neuen Informationen angehängt wird und von 900 MB auf 930 MB anwächst.

Was ist das Ergebnis der Endkopie (dh fileA.big bei locationC)?

Was ist, wenn die Kopie zu etwa 70% vollständig ist und die Originaldatei aktualisiert wird, diesmal jedoch auf 400 MB gekürzt wird (dh der Fortschritt der Kopie liegt jenseits des Abschneidepunkts), was ist das Ergebnis der Endkopie?

Verweis auf ein Linux-Betriebssystem auf einem ext3 / ext4-Dateisystem. Keine Volumenschattenmagie etc .. Einfach nur altes cp. Neugierde, die durch das Kopieren von Live-Couchdb-Dateien zum Sichern ausgelöst wurde, aber eher an allgemeinen Szenarien als an spezifischen Anwendungsfällen interessiert war.

Mâtt Frëëman
quelle
Danke, dass Sie diesen gefragt haben. Mein 'Wissen' war größtenteils eine Vermutung ... bis jetzt.
Tshepang

Antworten:

10

Wenn fileA.bigwährend des Kopiervorgangs vergrößert wird, enthält die Kopie die angehängten Daten.

Wenn die Datei kürzer als die aktuelle Position der Kopie abgeschnitten wird, wird die Kopie genau dort abgebrochen, wo sie sich befindet, und die Zieldatei enthält, was bis zum Abbruch kopiert wurde.

Patrick
quelle
27

Patrick hat es mehr oder weniger richtig, aber hier ist der Grund. So kopieren Sie eine Datei unter UNIX:

  1. Versuchen Sie, einige (mehr) Bytes von zu lesen fileA.
  2. Wenn wir keine Bytes abrufen konnten, weil wir am Ende der Datei (oder darüber hinaus) sind, sind wir fertig. Verlassen.
  3. Andernfalls schreiben Sie die Bytes in fileBund kehren zu Schritt 1 zurück.

Wenn wir das wissen und wissen, dass es so einfach ist, können wir einige Eckfälle sehen.

Sobald wir das Ende der Datei gefunden haben, ist der Kopiervorgang abgeschlossen. Nehmen wir also an, unsere Datei wächst während des Kopierens, wächst aber langsamer als wir es kopieren. Das Kopierprogramm überschreitet weiterhin die ursprüngliche Dateigröße, da die Datei zu diesem Zeitpunkt mehr enthält. Aber irgendwann, fängt sie mit dem Ende der Datei, und es weiß , dass es am Ende ist , weil es nicht lesen kann mehr Bytes jetzt . Es wird also sofort beendet, selbst wenn die Datei noch größer werden soll.

Wenn die Datei abgeschnitten ist, sagt das Kopierprogramm "Whoa, ich bin hinter dem Ende der Datei!" und beendet.

Und wenn Teile der Datei zufällig von einem Datenbankprogramm aktualisiert werden :-), wird Ihre Kopie eine Mischung aus alten und neuen Daten sein, da nicht alle Daten gleichzeitig kopiert werden. Das Ergebnis wird wahrscheinlich eine beschädigte Kopie sein, weshalb es im Allgemeinen keine gute Idee ist, Kopien von Live-Datenbanken zu erstellen.

(Allerdings kenne ich mich mit CouchDB nicht aus, und es ist möglich, eine Datenbank so zu gestalten, dass sie gegen diese Art von Korruption resistent ist. Aber das Beste, um absolut sicher zu sein.)

Jander
quelle
Gute Erklärung. Übrigens hat mich das immer wieder überrascht, warum dies unter UNIX-ähnlichen Betriebssystemen möglich ist, ohne dass die typische Fehlermeldung von Windows angezeigt wird ("Kann nicht auf Datei zugreifen - Datei wird verwendet"). Sie konnten nicht einmal eine MP3-Datei abspielen, die bereits gelöscht wurde beim spielen. Unter Unix ist dies (überraschenderweise) problemlos möglich. Ich denke, UNIX-basierte Betriebssysteme arbeiten immer mit Sicherungskopien der Dateien, so dass dies machbar ist.
Syntaxfehler
1
Das Lesen einer gelöschten Datei hängt von einer anderen UNIX-Funktion ab: Unter UNIX sind Dateien und Dateinamen verschiedene Dinge. Wenn Sie eine Datei löschen, löschen Sie in Wirklichkeit einen benannten "Link" zu der Datei. Wenn ein Programm eine Datei öffnet, zählt dies auch als Verknüpfung. Das System löscht die Datei selbst nur, wenn keine Links mehr vorhanden sind.
Jander
Wenn die Datei also schneller wächst, als wir sie kopieren können, wird cp niemals enden? Mir ist klar, dass dies unwahrscheinlich ist, da alles, was in die Datei schreibt, in der Lage sein müsste, in die Datei zu schreiben, schneller als CP daraus lesen kann.
Bladt,