Sagt fs, dass JETZT Speicherplatz aus gelöschten Dateien freigegeben werden soll

73

Gibt es eine Möglichkeit, dem Kernel mitzuteilen, dass er den freien Speicherplatz jetzt zurückgeben soll? Wie schreibe ich etwas in / proc /? Verwenden von Ubuntu 11.10 mit ext4.

Dies ist wahrscheinlich ein altes und sehr wiederholtes Thema. Nachdem ich 0 Speicherplätze erreicht hatte, bemerkte ich nur, dass mein Editor meine geöffneten Quelltextdateien nicht speichern konnte. Zu meinem Entsetzen hatte die Ordnerliste nun eine Größe von 0 Byte.

Ich habe 100 MB große Dateien sowohl vom Benutzer als auch vom Root gelöscht und auch einige Hardlinks ausgeführt.

Kurz zuvor apt-get cleanbefanden sich in / var / cache / apt / archives über 900 MB, jetzt sind es nur noch 108 KB:

# du
108 /var/cache/apt/archives

Eine Stunde später noch kein freier Speicherplatz und kann meine im Editor geöffneten wertvollen Dateien nicht speichern, aber beachten Sie die Unterschiede unten:

# sync; df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda4             13915072  13304004         0 100% /

Irgendwelche Vorschläge? Ich habe einige Dienste / Prozesse ausgeschaltet, weiß aber nicht, wie ich überprüfen soll, wer möglicherweise aktiv Speicherplatz aufnimmt.

Mehr Info

# dumpe2fs  /dev/sda4
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              884736
Block count:              3534300
Reserved block count:     176715
Free blocks:              422679
Free inodes:              520239
First block:              0
Block size:               4096
Fragment size:            4096
Marcos
quelle
4
Das Dateisystem gibt den Speicherplatz sofort frei. Die root-reservierten Blöcke von ext [234] und die Art und Weise, wie der Kernel die offenen Dateien reserviert, können jedoch den Anschein eines verlorenen Speicherplatzes erwecken.
Hhaamu
Wenn Sie mehrere Dateisysteme (Patitionen) haben, hilft es nicht, Speicherplatz in einem freizugeben.
Vonbrand
Warum konnte ich die Partition füllen, bevor die "reservierten" 5Go-Blöcke sich selbst zurückfordern?
Psddp

Antworten:

116

Überprüfen Sie mit lsof, ob Dateien geöffnet sind. Speicherplatz wird erst freigegeben, wenn sie geschlossen sind.

sudo /usr/sbin/lsof | grep deleted

zeigt an, welche gelöschten Dateien noch geöffnet sind.

Aleksandar Ivanisevic
quelle
Gut. Zeigt mir einige mysqldSperren in / tmp, aber viele apport-gtVerwendungen ausgestorbener Dateien in / var / lib / apt / lists / partial /, die sich anscheinend angesammelt haben. Also werde ich es vielleicht killall apport-gterst untersuchen.
Marcos
1
Als naheliegendste Antwort markieren, obwohl der Speicherplatz unmittelbar nach dem Schließen der Datei-Handles / -Prozesse, die sie verwenden, nie wirklich "zurückgegeben" wurde. Suche nach anderen auf Kernel / Proc / Fs basierenden Ansätzen.
Marcos
18
Sie können auch verwenden lsof +L1(offene Dateien auswählen, die nicht verknüpft wurden).
Martin Fido
Die Informationen in dieser Antwort sind korrekt, aber das Problem, das das OP hatte, wurde wahrscheinlich nicht dadurch verursacht, sondern durch den reservierten Root-Speicherplatz (den eine andere Antwort adressiert).
Marcelm
37

Verwenden Sie lsofdiese Option , um die gelöschte, aber offene Datei zu finden, die noch Speicherplatz beansprucht:

lsof | grep deleted | grep etilqs_1IlrBRwsveCCxId
chrome     3446       user  128u      REG              253,2              16400       2364626 /var/tmp/etilqs_1IlrBRwsveCCxId (deleted)  

Suchen Sie den Eintrag /proc/<pid>/fd/, der dem Dateihandle entspricht:

ls -l /proc/3446/fd/etilqs_1IlrBRwsveCCxId
lrwx------. 1 user unix 64 Feb 11 15:31 128 -> /var/tmp/etilqs_1IlrBRwsveCCxId (deleted)

Nun, nur cat /dev/nullin die FD:

cat /dev/null > /proc/3446/fd/128

Beachten Sie, dass der Inode noch offen ist, aber jetzt die Länge 0 hat

chrome     3446       user  128u      REG              253,2         0    2364626 /var/tmp/etilqs_1IlrBRwsveCCxId (deleted)
BillQ
quelle
5
Überflüssige Verwendung von catzum Abschneiden. In der Bourne-Shell reicht das einfach aus > /proc/3446/fd/128.
200_success
2
Tun Sie dies NICHT, wenn von Ihrem Programm erwartet wird, dass es in Zukunft einen Teil der Datei erneut liest, der möglicherweise im Seiten-Cache verfügbar ist oder nicht.
Michael R. Hines
13

dfzeigt keinen reservierten Speicherplatz an root(auch wenn ausgeführt als root):

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

So ändern Sie den Prozentsatz für reservierte Blöcke

  1. Reservierten Platz auf 4% reduzieren

    # tune2fs -m4 /dev/sda4

df -h jetzt zeigte 45M frei.

  1. Schnell meine Dateien gespeichert
  2. Setzen Sie es zurück auf 5%

    # tune2fs -m5 /dev/sda4

Marcos
quelle
2
Der für root reservierte Platz ist heutzutage fast immer zu groß. Sie können es auf einige Prozent reduzieren. dfZeigt den für den normalen Benutzer nutzbaren Speicherplatz an. Da apt als root ausgeführt wird, ist der reservierte Speicherplatz nur zum Schutz vor Auffüllungen durch Nicht-Root-Benutzer (= normale Benutzer und Dienste, die ihren eigenen Benutzer haben) nützlich.
Jofel
Genau; an mkfsdiesen tagen sollte man zb reservieren. 5% oder 300 MB, je nachdem, welcher Wert geringer ist . Ich habe nur einige meiner Server auf 2% neu eingestellt und GBs wieder freigegeben!
Marcos
3
@jofel, nein, das ist es nicht. Jedes Mal, wenn die Auslastung über 90% liegt, kommt es zu einer starken Fragmentierung. Sie müssen mehr Speicherplatz freigeben und müssen nicht zu 100% ausgelastet sein.
Psusi
@psusi Du bist wahr, danke für deinen Kommentar. Aber die Gelegenheit (vorübergehend) zu verwenden fast alle verfügbaren Platz als normaler Benutzer wirklich praktisch sein könnte und mit ext4, sind die Dinge nicht mehr so schlimm, sehen unix.stackexchange.com/a/7965/15241
Jofel
7

Wenn Sie in Ubuntu Dateien mit dem Papierkorb gelöscht haben, wurden Ihre Dateien höchstwahrscheinlich nicht vollständig entfernt.

Auch nach dem Leeren Ihres Papierkorbs bleiben Ihre Dateien ~/.local/share/Trash/expungedbis nach einem Neustart und möglicherweise sogar länger erhalten.

Ich habe keinen guten Grund dafür gefunden, aber wenn mir der Speicherplatz ausgeht, werden rmdie gelöschten Papierkorbdateien immer manuell erstellt .

kwarrick
quelle
1
Guter Punkt. Obwohl ich einer von denen bin, die über die Befehlszeile leben und sterben und den grafischen Dateimanager selten verwenden. Ich habe den gelöschten Ordner noch nicht als Versteck bemerkt - ein Klick auf " Papierkorb leeren" war immer endgültig und gab meinen Speicherplatz zurück, wenn er benötigt wurde.
Marcos
6
sudo lsof | grep "(deleted)$" | sed -re 's/^\S+\s+(\S+)\s+\S+\s+([0-9]+).*/\1\/fd\/\2/' | while read file; do sudo bash -c ": > /proc/$file"; done

Erläuterung:
Grep- lsofAusgabe, um nur gelöschte Dateien zu extrahieren. Sed extrahiert die Prozess-ID und die Filedescriptor-ID aus jeder Zeile und erstellt eine Zeichenfolge im Format {pid}/fd/{fid}. While Schleife und Ausgabe nichts zu jeder Datei, setzen Sie sie auf leer.

Sepero
quelle
3
Ich habe einen Fehler "Syntaxfehler in der Nähe von unerwartetem Token" ("
Majid Golshadi
5

Ich frage mich, ob dies synchilfreich ist - aber es sollte nicht so sein, dass Dateisysteme bei den meisten ("vielen"?) Systemen alle 30 Sekunden synchronisiert werden.

Ich überprüfe das Kernel-Protokoll (so dmesg), um festzustellen, ob etwas Schlimmes vor sich geht, und führe es aus, um festzustellen lsof, ob noch eine große gelöschte Datei geöffnet ist (ich denke, gelöschte Dateien werden in der lsofAusgabe als solche markiert ).

Zwei Gründe (einer davon in der Frage, die Sie verknüpfen), die dazu führen können, dass gelöschte Dateien keinen Speicherplatz mehr freigeben, sind:

  • Dateien, die nicht wirklich gelöscht wurden: Sie haben eine Datei gelöscht, die an einer anderen Stelle fest verlinkt ist (genauer gesagt, Sie haben unlink()eine Datei mit mehr als einem Link bearbeitet).
  • Dateien, die noch geöffnet sind: Geöffnete Dateien werden mit Hilfe von Dateien, Inodes selbst und nicht mit Hilfe von Verzeichniseinträgen im Buch geführt. Wenn Sie den Eintrag löschen, bleibt der Inode so lange dort, wie er noch geöffnet ist.

Aber ich kenne keinen bestimmten Grund, warum das bei so vielen Dateien passieren könnte ...

njsg
quelle
synchat nie geholfen. Logs sind ein Ubuntu-System und daher ziemlich fehlerhaft. Ja, sie sind normalerweise laut. apportwird häufig bereitgestellt, da jedes nächtliche Update von apt-get abstürzt, obwohl / var / crash nur 77 MB hat. Es wurde auch bemerkt, dass atd/ var / log / syslog mit sich wiederholenden Zeilen überflutet wurde, wie atd[8892]: File a0015c0152ab76 is in wrong format - abortingwahrscheinlich, da die wenigen Dateien in / var / spool / cron / atspool alle 0 groß waren, was das Problem natürlich kreisförmig macht
Marcos
1

CentOS 6.3 leert auch den Mülleimer, wenn Sie ihn leeren. Ich konnte keinen Weg finden, den Raum zurückzugewinnen, bis ich gerade lief rm -rf ~/.local/share/Trash/expunged/. Verursachte viel Kopfkratzen.

Biggles
quelle