Was passiert, wenn ich 'cp' töte? Ist es sicher und hat es Konsequenzen?

23

Was sind die Konsequenzen für ein ext4-Dateisystem, wenn ich einen Kopierbefehl beende, indem ich + cptippe, während er ausgeführt wird?CtrlC

Wird das Dateisystem beschädigt? Ist der von der unvollständig kopierten Datei belegte Speicherplatz der Partition nach dem Löschen noch verwendbar?

Und ist es vor allem cpsicher, einen Prozess zu beenden ?

Seninha
quelle
1
Beachten Sie, dass Dateisysteme ohne Journaling möglicherweise nicht so sicher sind, obwohl die Antworten für ext4 korrekt sind.
Ave
3
@Ave Journaling hat damit nichts zu tun. Die Systemaufrufe sind atomar, unabhängig davon, welches Dateisystem Sie verwenden. Das Aufzeichnen ist in Situationen nützlich, in denen die Stromversorgung plötzlich unterbrochen werden kann.
Wald

Antworten:

22

Dies ist sicher, aber natürlich haben Sie die Kopie möglicherweise noch nicht fertiggestellt.

Wenn der cpBefehl ausgeführt wird, werden Systemaufrufe ausgeführt, die den Kernel anweisen, Kopien der Datei zu erstellen. Ein Syscall ist eine Funktion, die eine Anwendung aufrufen kann, um einen Dienst vom Kernel anzufordern, z. B. das Lesen oder Schreiben von Daten auf die Festplatte. Der Userspace-Prozess wartet einfach darauf, dass der Syscall beendet wird. Wenn Sie die Anrufe verfolgen würden, würde dies ungefähr so ​​aussehen:

open("/home/user/hello.txt", O_RDONLY)           = 3
open("/mnt/hello.txt", O_CREAT|O_WRONLY, 0644)   = 4
read(3, "Hello, world!\n", 131072)               = 14
write(4, "Hello, world!\n", 14)                  = 14
close(3)                                         = 0
close(4)                                         = 0

Dies wird für jede zu kopierende Datei wiederholt. Aufgrund der Funktionsweise dieser Systemaufrufe tritt keine Beschädigung auf. Wenn syscalls wie diese eingegeben werden, wird das fatale Signal erst wirksam, nachdem der syscall hat fertig , nicht während des Betriebs. Aus diesem Grund wird das gewaltsame Beenden des Prozesses erst beendet, nachdem der derzeit ausgeführte Systemaufruf beendet wurde. Dies bedeutet, dass der Kernel, in dem sich der Dateisystemtreiber befindet, die Vorgänge ausführen kann, die erforderlich sind, um das Dateisystem in einen vernünftigen Zustand zu versetzen. Solche E / A-Vorgänge werden niemals mitten in der Operation beendet, was sie zu atomaren Operationen macht.

Interessanterweise werden Befehle wie cpnicht sofort beendet, wenn sie getötet werden. Wenn Sie eine sehr große Datei kopieren und sie auch mit SIGKILL beenden, wird der Prozess weiterhin ausgeführt, bis der aktuelle Systemaufruf abgeschlossen ist. Bei einer großen Datei kann dies eine Weile dauern, da sich der Prozess in einem unterbrechungsfreien Zustand befindet.

Wald
quelle
2
@qwr Das ist höchstwahrscheinlich Teil der glibc-Bibliothek, nicht cpselbst. Es verfügt über verschiedene Dateizugriffsfunktionen, die diese intern als Wert verwenden.
Wald
2
Gute Antwort! Ich hätte nie cpgedacht, dass es nach dem SIGKILLING zu Verzögerungen beim Beenden von a kommt, auch wenn es sich um große Dateien handelt ... Vielleicht ist die Dauer dieser unterbrechungsfreien atomaren Vorgänge eines Prozesses zu kurz. Funktioniert die gleiche Erklärung für das Beenden ddund andere Lese- / Schreibvorgänge auf Datenträgern?
Seninha
1
@Seninha Die Vorgänge sind recht kurz, da die Zugriffe zwischengespeichert werden, sodass Sie viel mehr Daten pro Sekunde kopieren können, als Ihr Laufwerk tatsächlich verarbeiten kann, wenn sie in Bursts ausgeführt werden. Wenn die Datei sehr groß ist und sich auf einem langsamen Medium befindet, kann sich der Cache füllen und das Beenden des Vorgangs kann einige Zeit in Anspruch nehmen. Was das Töten angeht dd, hängt das davon ab, was bsSie dafür eingestellt haben. Wenn es nur 512 ist (die Standardeinstellung), sollte es schnell beendet werden. Wenn es größer ist, kann es etwas länger dauern.
Wald
3
@qwr 128-kb-Chunks sind in coreutils standardmäßig fest verdrahtet, wenn von Blockgeräten gelesen wird. Dies geschieht, um Systemaufrufe zu minimieren. Die Analyse ist in der coreutils-Quelle angegeben: git.savannah.gnu.org/cgit/coreutils.git/tree/src/ioblksize.h
Fiisch
1
@AndrewHenle Vielleicht hätte ich sagen sollen, dass die Metadaten des Dateisystems atomar sind. Sie haben Recht, dass ein Schreibvorgang teilweise sein kann.
Wald
20

Da cpes sich um einen Userspace-Befehl handelt, hat dies keine Auswirkungen auf die Integrität des Dateisystems.

Sie müssen natürlich darauf vorbereitet sein, dass mindestens eine Datei nicht vollständig kopiert wurde, wenn Sie ein laufendes cpProgramm beenden .

schily
quelle
14
Warum die Gegenstimme? Nur weil es schily ist?
Stephen Kitt
6
Es scheint definitiv mindestens eine Person zu geben, die alle meine Antworten ablehnt. Kennen Sie einen Weg, um herauszufinden, wer das Abstimmungsergebnis erzielt hat?
Schily
2
Nicht einmal Moderatoren können herausfinden, wer bestimmte Stimmen abgegeben hat - das ist verständlicherweise auf SO-Mitarbeiter beschränkt. Sie können den Link "Kontakt" verwenden, um sie zur Untersuchung aufzufordern.
Philip Kendall
1
Es wäre ziemlich traurig, wenn ein Userspace-Programm die Integrität des Dateisystems gefährden könnte. Hinweis: Natürlich kann es Fehler in Dateisystemimplementierungen geben, und es wird Fehler in Dateisystemimplementierungen geben. Hinweis Nr. 2: Natürlich können Userspace-Programme, die mit erhöhten Rechten ausgeführt werden (z. B. CAP_SYS_RAWIOunter Linux oder einem vergleichbaren Betriebssystem), die ihnen direkten Zugriff auf das zugrunde liegende Gerät des Dateisystems gewähren (z. B. sudo dd if=/dev/urandom of=/dev/sda1), alle möglichen Schäden anrichten.
Jörg W Mittag
3
Und wenn ein Dateisystem fehlerhaft genug wäre, um nach einer Unterbrechung beschädigt zu werden cp, würde es wahrscheinlich auch nach einer Beendigung beschädigt cpwerden ...
ilkkachu