Löschen einer geöffneten Datei unter Linux


Linux-Symbol
ru.wikipedia.org

Es gibt eine Reihe kniffliger Linux-Fragen, die die meisten unerfahrenen Linux-Systemadministratoren verwirrend finden. Erfahrene Administratoren fragen sie gerne bei Interviews und im Internet nur die Faulen schrieben nicht über die Antworten auf sie. Seit wahrscheinlich anderthalb Jahrzehnten geht es vor allem darum, eine geöffnete Datei unter Linux zu löschen. Trotzdem machen die Kandidaten von Zeit zu Zeit auch weiterhin runde Augen. Das Maximum, das Sie von ihnen hören können, ist „Inodes. Ich habe von Inodes gehört, aber ich weiß nichts anderes über sie. “

Um dieses Problem ein für alle Mal zu klären, wurde dieser Artikel geschrieben.

Löschen einer geöffneten Datei unter Linux

Lassen Sie uns ein kleines Experiment durchführen, um zu testen, wie das Dateisystem unter Linux funktioniert.

Ausbildung

Um alle Tests durchführen zu können, benötigen wir eine virtuelle Maschine mit fast jeder Linux-Distribution und einer zusätzlichen Festplatte. Glücklicherweise ist dies im Zeitalter der Virtualisierung einfach zu bewerkstelligen. Nehmen wir zur Verdeutlichung eine Festplatte mit einigen Gigabyte und bereiten Sie sie im Voraus vor (wir werden in einem anderen Artikel grundlegende Vorgänge mit Festplatten betrachten).

Stellen Sie sich vor, Sie haben sich zuerst über ssh beim Server angemeldet, haben Root-Rechte und müssen nur das Festplattensubsystem herausfinden.

Freier Speicherplatz und freie Inodes

Als erstes überprüfen wir die Festplatten mit dem bekannten Befehl df (zusätzliche Daten aus der Ausgabe entfernt):

Das Dienstprogramm zeigt den im Dateisystem belegten Speicherplatz in 1K-Blöcken an. In den meisten Fällen reichen diese Informationen nur aus, um den Prozentsatz des freien Speicherplatzes anzugeben, und Sie sollten die Diagnose hierzu nicht beenden.

Probleme beim Schreiben neuer Dateien können auch durch das Fehlen von Inodes verursacht werden. Daher ist es hilfreich, diese mit demselben Befehl, jedoch mit einem anderen Schlüssel zu überprüfen:

1% des Platzes auf dem Abschnitt verwendet… Wir erinnern uns an die Ausgabe der Befehle, wir werden sie für die weitere Analyse benötigen.

Dateien auf der Festplatte erstellen

Als nächstes erstellen wir eine große Datei auf unserer Festplatte. Der einfachste Weg, dies zu tun, ist mit dem Dienstprogramm. ddDies ist standardmäßig im Lieferumfang des Systems enthalten (erstellen wir zunächst einige Verzeichnisse):

Und lassen Sie uns 10 kleine Dateien erstellen, aber auf eine andere Weise:

Nun schauen wir uns noch einmal die beiden df-Ausgänge an:

Wie Sie sehen können, jetzt auf der Festplatte beschäftigt 75%… Was ist mit Inodes?

Menge inod geändert auf 13, obwohl wir nur 11 Dateien erstellt haben.

Experimentieren Sie mit dem Löschen einer geöffneten Datei

Betrachten wir nun die Situation mit einem anderen Dienstprogramm, das auch für die Diagnose verwendet werden muss. Es geht um du:

Über beschäftigt 1 GB.

Hinweis: Geben Sie man du in die Konsole ein, um die Schlüssel zu überprüfen. Es ist auch für andere im Artikel beschriebene Dienstprogramme relevant.

Simulieren wir nun etwas Ähnliches wie das Sperren einer Datei (wenn es Warnungen gibt, stimmen Sie zu):

Der Befehl öffnet einfach die Datei zum Lesen und sendet die Aufgabe in den Hintergrund. Jetzt löschen wir die Datei:

Danach überprüfen wir den freien Speicherplatz:

Und freie Inodes:

Zusammenfassend Der Ort ist nicht geräumtobwohl die Datei gelöscht zu sein scheint. Die gleiche Anzahl von Inodes wird verwendet. Aber vielleicht von wird uns noch etwas zeigen:

8 KB beschäftigt. Ok, es gibt ein anderes Dienstprogramm, das besser als andere erklärt, was passiert lsof::

Wir haben alles gesehen, was wir wollten, wir können fertig werden.

Abschluss des Experiments

Wir schalten unser Experiment aus – wir beenden den Prozess, den wir zuvor im Hintergrund begonnen haben:

Jetzt überprüfen wir noch einmal den freien Speicherplatz:

Und auch Inodes:

Groß Die Datei wurde gelöscht, Speicherplatz und Inodes wurden freigegeben… Es ist sinnvoll, die Ausgabe zu überprüfen von Nein, es wird das gleiche wie beim vorherigen Mal angezeigt.

Ergebnisse

Was ist denn passiert? Und Folgendes geschah: Informationen von von und df vor dem Löschen einer großen Datei war offensichtlich und bedarf keiner Erklärung. Abgesehen von einem Punkt – warum wurden 11 Dateien erstellt und die Anzahl der Inodes um 13 erhöht? Hier ist alles einfach. Wahrscheinlich hat jeder den Ausdruck gehört, dass alles in linux – datei ? Und der Katalog auch, und wir haben zwei davon erstellt.

Als Nächstes haben wir die Datei gelöscht, die zum Lesen durch einen anderen Prozess geöffnet ist. Befehl rm Die vom Verzeichnisobjekt gehaltene Dateireferenz wurde gelöscht, die Datei konnte jedoch nicht physisch von der Festplatte gelöscht werden, da die Datei zum Lesen durch ein anderes Programm geöffnet wurde.

Hinweis: Ratet mal, warum Sie die Protokolle nicht bereinigen können, indem Sie einfach Dateien löschen, ohne die Anwendung neu zu starten.

Obwohl die Datei keinen Namen mehr hatte, hatte sie immer noch einen Dateideskriptor (= Inode), auf den das Programm weiterhin zugreifen konnte. Dies wurde auch aus der Schlussfolgerung deutlich lsof – Die Datei wurde als gelöscht markiert. Sobald Das Programm wurde gestoppt, die Datei wurde freigegeben und das System war in der Lage, das zu vervollständigen, was es gestartet hatte – die Datei und die abhängigen Datenstrukturen auf der Festplatte dauerhaft zu löschen.

In Dienstprogrammablesungen von Außerdem gibt es nichts Seltsames, da alle aufgelisteten Dateinamen im Verzeichnis gelesen und ihre Größe geschätzt werden. Da der Link zum Namen der großen Datei entfernt wurde, von konnte sein Volumen nicht abschätzen, aber es war in der Lage, es zu tun dfweil sie das Reale bewertet belegter Speicherplatz auf der Festplatte in Blöcken ohne Bezugnahme auf Namen… Hier ist das ganze Geheimnis.

Kommentare bereitgestellt von HyperComments

Leave a Reply

Your email address will not be published. Required fields are marked *