df in linux zeigt nach dem entfernen der dateien nicht den korrekten freien platz an

143

Ich habe Dateiserver, die zum Speichern von Dateien verwendet werden. Die Dateien können sich dort eine Woche oder ein Jahr lang befinden. Leider dfspiegelt der Befehl beim Entfernen von Dateien vom Server nicht den freigewordenen Speicherplatz wider. Schließlich ist der Server also voll ( dfzeigt 99% an), und mein Skript sendet keine weiteren Dateien dorthin, außer dass möglicherweise ein paar Dutzend GB freier Speicherplatz vorhanden sind.

Ich habe ein noatimeFlag auf den gemounteten Partitionen, wenn das einen Unterschied macht.

Aminah Nuraini
quelle
Geschieht dies auf einer einzelnen Partition oder auf allen Partitionen?
Khaled
Nun, es geschieht auf meiner Hauptdatenpartition, die die einzige ist, die mir wichtig ist, da ich nur Dateien darauf schreibe / entferne.
Bitte klären Sie mich mit der Lösung oder einem Link zu einer auf.
Welches Dateisystem? DF führt einen Superblock-Befehl aus. Möglicherweise aktualisiert Ihr Dateisystem den sb-Inode nicht. Haben Sie versucht, den Cache zu leeren?
Bohnen
Mit ext4. Wie spült man Caches?

Antworten:

236

Durch Löschen des Dateinamens wird die Datei nicht wirklich gelöscht. Ein anderer Prozess hält die Datei geöffnet, sodass sie nicht gelöscht wird. Starten Sie diesen Prozess neu oder beenden Sie ihn, um die Datei freizugeben.

Verwenden

lsof +L1

um herauszufinden, welcher Prozess eine gelöschte (nicht verknüpfte) Datei verwendet.

Ignacio Vazquez-Abrams
quelle
2
Auf entfernte Dateien wurde in über einem Monat nicht zugegriffen, und der einzige Prozess, der auf sie zugreift, ist nginx, daher ist dies zweifelhaft.
39
+1. Außerdem zeigt "lsof + L1" an, welches Programm die Dateien geöffnet hält.
Pehrs
4
Wenn Sie als Root "lsof -n | grep file" ausführen, werden Sie überrascht sein, wie lange Dateien aufgrund von Prozessen, die sie aus irgendeinem Grund geöffnet halten, noch verfügbar sind. Wenn alles andere fehlschlägt, starte neu. Ich empfinde es als schlecht, aber es wird definitiv sicherstellen, dass nichts an der Datei festhält. Per pehrs ist lsof + L1 wahrscheinlich der bessere Weg.
ScottZ
3
Du hast mich gerade gerettet! Löschte eine 93G-Protokolldatei und bekam den Speicherplatz nicht zurück und konnte nicht herausfinden, warum. Vielen Dank.
Luke Cousins
1
In die gleiche Richtung und für den Fall, dass dies anderen hilft, habe ich eine große nginx access.log-Datei gelöscht, konnte den Speicherplatz jedoch erst nach einem Neustart von nginx zurückfordern: service nginx restart
Nick
28

Wie Ignacio erwähnt, wird durch das Löschen der Datei der Speicherplatz erst freigegeben, wenn Sie die Prozesse löschen, für die für diese Datei Handles geöffnet sind.

Trotzdem können Sie den Speicherplatz zurückfordern, ohne die Prozesse zu beenden. Sie müssen lediglich die Dateideskriptoren entfernen.

Führen Sie zuerst lsof | aus grep gelöscht, um den Prozess zu identifizieren, der die Datei enthält

[hudson@opsynxvm0055 log]$ /usr/sbin/lsof |grep deleted
java       8859   hudson    1w      REG              253,0 3662503356    7578206 /crucible/data/current/var/log/fisheye.out (deleted)

Dann führen Sie aus:

cd /proc/PID/fd

dann

[hudson@opsynxvm0055 fd]$ ls -l |grep deleted
total 0
l-wx------ 1 hudson devel 64 Feb  7 11:48 1 -> /crucible/data/current/var/log/fisheye.out (deleted)

Die "1" ist der Dateideskriptor. Geben Sie nun "> FD" ein, um diesen Speicherplatz freizugeben

> 1

Möglicherweise müssen Sie den Vorgang wiederholen, wenn die Datei in anderen Prozessen gespeichert ist.

Adrián Deccico
quelle
1
Was bedeutet das > FDtun?
Pred
es entfernt den Dateideskriptor
Adrián Deccico
2
Hat dieser >Befehl einen Namen? ich musste von zsh auf bash umsteigen, um es nutzen zu können. Ist es möglich, es auf zsh auszuführen?
Ariera
1
Es ist eine Ausgabeumleitung und schneidet daher die Datei ab. Das long from wäre "echo -n> 1" oder "true> 1". Das FD wird nicht wirklich entfernt, es zeigt nur auf eine leere Datei.
Eckes
8

Eine Möglichkeit ist, dass die gelöschten Dateien mehr Referenzen im Dateisystem haben. Wenn Sie Hardlinks erstellt haben, verweisen mehrere Dateinamen auf dieselben Daten, und die Daten (der tatsächliche Inhalt) werden erst dann als frei / verwendbar markiert, wenn alle Verweise darauf entfernt wurden. Bevor Sie Dateien löschen, geben Sie sie an (Eintrag mit dem Namen Links) oder geben Sie ls -l ein (sollte die zweite Spalte sein).

Wenn sich herausstellt, dass auf die Dateien an anderer Stelle verwiesen wird, müssen Sie vermutlich die Datei (en) mit ls -i suchen, um die Inode-Nummer zu finden, und dann mit -inum <Inode-Nummer> suchen, um die zu finden andere Verweise auf diese Datei (Sie möchten wahrscheinlich auch -mount verwenden, um im selben Dateisystem zu bleiben).

Kjetil Joergensen
quelle
4

Die Datei ist immer noch durch den Prozess gesperrt, der sie öffnet. Führen Sie die folgenden Schritte aus, um Speicherplatz freizugeben:

  1. Führen Sie aus, sudo lsof | grep deletedund überprüfen Sie, welcher Prozess die Datei enthält. Beispielergebnis:

    $ sudo lsof | grep deleted
    COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
    cron     1623 root    5u   REG   0,21        0 395919638 /tmp/tmpfPagTZ4 (deleted)
    
  2. Beenden Sie den Vorgang mit sudo kill -9 {PID}. In obigem Beispiel ist die PID 1623.

    $ sudo kill -9 1623
    
  3. Führen Sie dfden Befehl aus, um zu überprüfen, ob bereits Speicherplatz verfügbar ist. Wenn es immer noch voll ist, müssen Sie möglicherweise einige Sekunden warten und es erneut überprüfen.

Aminah Nuraini
quelle
4

Wenn die Partition so konfiguriert wurde, dass ein bestimmter Teil des Speicherplatzes nur für die Root-Verwendung reserviert dfwird , wird dieser Speicherplatz nicht als verfügbar angegeben.

[root@server]# df -h
Filesystem            Size  Used Avail Use% Mounted on
...
/dev/optvol           625G  607G     0 100% /opt
...

Auch nachdem Speicherplatz durch Löschen von Dateien / Verzeichnissen freigegeben wurde, kann ein Benutzer ohne Rootberechtigung nicht auf eine bestimmte Partition schreiben.

Sie können leicht überprüfen, ob dies der Fall ist, indem Sie versuchen, eine Datei auf einem Gerät als Root- und als Nicht-Root-Benutzer zu erstellen.

Zusätzlich können Sie die Dateisystemkonfiguration überprüfen, indem Sie ausführen

tune2fs -l <device> | egrep "Block count|Reserved block count

und Berechnen der tatsächlichen% auf eigene Faust.

Führen Sie den folgenden Befehl aus, um die für die Verwendung als Root reservierte Festplatte% zu ändern

tune2fs -m <percentage> <device>
luka5z
quelle
1

Die anderen Antworten sind richtig: Wenn Sie eine Datei löschen und der Speicherplatz nicht freigegeben wird, liegt dies in der Regel daran, dass die Datei noch geöffnet ist oder andere Hardlinks vorhanden sind.

Verwenden Sie zur Fehlerbehebung ein Tool, das angibt, wo der Speicherplatz verbraucht wird: Mit diesem Tool können Sie dusich einen Überblick über den Speicherplatz verschaffen. Verwenden Sie noch besser ein grafisches Tool wie xdiskusage (es gibt viele davon), um den Täter aufzuspüren. Mit xdiskusage und Freunden können Sie die größten Weltraumfresser durchsuchen, um herauszufinden, wohin der Weltraum geht.

Auf diese Weise finden Sie schnell Dateien, die aufgrund eines zweiten Hardlinks noch Speicherplatz belegen. Es wird auch den von gelöschten, aber geöffneten Dateien belegten Platz anzeigen (wie (Erlaubnis verweigert), glaube ich, da es den Dateinamen nicht lesen kann).

sleske
quelle
1

Da ich weiß, dass eine /varMenge von Ihnen dies für RedHat-In- und Gzipping-Dateien tut, die eine Verkleinerung des FS erwarten, aber stattdessen größer werden, stellen Sie einfach sicher, dass Sie einen Neustart des Syslog-Dienstes durchführen. und

lsof -v file

würde dir das sowieso zeigen.

user1802263
quelle
1
Das fügt nicht wirklich viel hinzu; Die akzeptierte Antwort deckte die Logik des Jahres 2001 ab. Wenn Sie 50 Wiederholungen haben, verwenden Sie Kommentare, wenn Sie den vorhandenen Antworten Qualifikatoren hinzufügen möchten.
Andrew B
0

Eine weitere Option: Die Festplatte ist möglicherweise aufgrund eines Prozesses voll, bei dem kontinuierlich Daten erstellt werden: Protokolle, Kerne und dergleichen. Es ist möglich, dass tatsächlich Speicherplatz freigegeben wird, der jedoch sofort voll ist. Ich habe tatsächlich einen solchen Fall gesehen. dfIn diesem Fall ergibt sich einfach kein Bild. Verwenden Sie du, um mehr zu erfahren.

Chen Levy
quelle
0

Ich benutze EXT2, FSCK hat mir in dieser Situation geholfen. Versuchen Sie shudown -F jetzt, nach einigen Neustarts und Fscks, sehe ich die Hälfte des verwendeten Speicherplatzes.

Marcellus
quelle
1
Lieber Marcellus, Ihre Lösung ist in der akzeptierten Antwort enthalten. und manchmal möchten Sie keinen Neustart durchführen, wenn Sie nicht gezwungen sind ...
Deer Hunter
-1

Um zu überprüfen, welche gelöschten Dateien Speicherplatz belegt haben, geben Sie den Befehl ein

 $ sudo lsof | grep deleted

Es werden die gelöschten Dateien angezeigt, die Speicher enthalten.

Beende dann den Prozess mit pid oder name

$ sudo kill <pid>
$ df -h

Überprüfen Sie jetzt, ob Sie den gleichen Speicher haben

Wenn nicht, geben Sie den folgenden Befehl ein, um festzustellen, welche Datei den Speicher belegt

# cd /
# du --threshold=(SIZE)

Erwähnen Sie eine beliebige Größe, die angibt, welche Dateien über der Schwellengröße liegen, und löschen Sie die Datei. Der Speicher bleibt erhalten

Javeed Shakeel
quelle
-4

Öffnen Sie das Terminal. Versuchen Sie diesen Befehl. und löschen Sie Ihre Datei

rilson
quelle