Festplatte voll, du erzählt anders. Wie soll weiter nachgeforscht werden?

110

Ich habe eine SCSI-Festplatte in einem Server (Hardware-RAID 1), 32G, ext3-Dateisystem. dfsagt mir, dass die Festplatte zu 100% voll ist. Wenn ich 1G lösche, wird dies korrekt angezeigt.

Wenn ich laufen jedoch du -h -x /dann dusagt mir , dass nur 12G verwendet werden (ich -xwegen einiger Samba Mounts).

Meine Frage bezieht sich also nicht auf subtile Unterschiede zwischen den Befehlen du und df, sondern darauf, wie ich herausfinden kann, woher dieser große Unterschied stammt.

Ich habe den Rechner für ein Fsck neu gestartet, bei dem keine Fehler aufgetreten sind. Soll ich rennen badblocks? lsofzeigt mir keine offenen gelöschten Dateien an, lost+foundist leer und es gibt keine offensichtliche warn / err / fail-Anweisung in der Nachrichtendatei.

Fragen Sie nach weiteren Einzelheiten zum Setup.

initial
quelle
3
Dies ist sehr nah an der Frage: Unterschied zwischen Linux und DF ( serverfault.com/questions/57098/du-vs-df-difference ). Die Lösung waren Dateien unter einem Einhängepunkt, als OldTroll antwortete.
Chris Ting

Antworten:

93

Suchen Sie nach Dateien unter Einhängepunkten. Wenn Sie ein Verzeichnis (z. B. einen Sambafs) in ein Dateisystem einbinden, in dem sich bereits eine Datei oder Verzeichnisse befinden, verlieren Sie häufig die Fähigkeit, diese Dateien anzuzeigen, sie belegen jedoch weiterhin Speicherplatz auf der zugrunde liegenden Festplatte. Im Einzelbenutzermodus wurden Dateikopien in Verzeichnisse kopiert, die ich nur im Einzelbenutzermodus sehen konnte (da andere Verzeichnissysteme darüber bereitgestellt wurden).

OldTroll
quelle
3
Sie können diese versteckten Dateien finden, ohne die Bereitstellung von Verzeichnissen aufheben zu müssen. Schauen Sie sich die Antwort von Marcel G an, die unten erklärt, wie.
Mhsekhavat
Sie sollten die CLI-Befehle in Ihrer Antwort anzeigen, um dies zu tun
Jonathan
1
ÜBERPRÜFEN SIE, auch wenn Sie der Meinung sind, dass dies für Sie keinen Sinn ergibt!
Chris
1
Hinweis: In dieser Antwort geht es um Dateien, die sich unterhalb von Einhängepunkten befinden (dh auf dem ursprünglichen Dateisystem versteckt sind) und nicht innerhalb von Einhängepunkten. (Sei kein Idiot wie ich.)
mwfearnley
92

Ich bin gerade auf dieser Seite gestolpert, als ich versucht habe, ein Problem auf einem lokalen Server aufzuspüren.

In meinem Fall stimmen die df -hund du -shum ca. 50% der Festplattengröße nicht überein.

Dies wurde dadurch verursacht, dass Apache (httpd) große Protokolldateien im Speicher hielt, die von der Festplatte gelöscht wurden.

Dies wurde festgestellt, indem ausgeführt wurde, lsof | grep "/var" | grep deletedwo /varsich die Partition befand, die ich zum Bereinigen benötigte.

Die Ausgabe zeigte folgende Zeilen:
httpd 32617 nobody 106w REG 9,4 1835222944 688166 /var/log/apache/awstats_log (deleted)

Die Situation wurde dann durch einen Neustart von apache ( service httpd restart) behoben und 2 GB Festplattenspeicher wurden freigegeben, indem die Sperren für gelöschte Dateien aufgehoben werden konnten.

KHobbits
quelle
Für mich wurden die Sperren nicht freigegeben, selbst nachdem ich das Programm beendet hatte (Zombies?). Ich musste kill -9 'pid'die Schlösser öffnen. zB: Für deinen httpd wäre es gewesen kill -9 32617.
Micka
6
Kleiner Hinweis: Möglicherweise müssen Sie ausführen, lsofda sudoalle geöffneten Dateideskriptoren
angezeigt
Ich bin mit H2 darauf gestoßen, das jeden Tag mehrere Gigs zu einer Logdatei hinzufügte. Anstatt H2 (langsam) neu zu starten, habe ich verwendet sudo truncate -s0 /proc/(h2 PID)/(descriptor number obtained from ls /proc/h2pid/fd).
Desty
In meinem Fall, auch wenn Neustart httpdSpeicherplatz nicht freigegeben wird. Als ich lief /etc/init.d/rsyslog restart, funktionierte es: D
Thanh Nguyen Van
2
Sie können die greps überspringen und einfach tun lsof -a +L1 /var, wo -aMittel und alle Bedingungen (Standard ist OR), +L1bedeuten Liste nur Dateien mit Link zählen weniger als 1 (dh Dateien mit offenen Dateien gelöscht), und /varbeschränkt auf Dateien unter diesem Mount - Punkt
kbolino
51

Ich stimme der Antwort von OldTroll als wahrscheinlichste Ursache für Ihren "fehlenden" Platz zu.

Unter Linux können Sie die gesamte Root-Partition (oder jede andere Partition in diesem Fall) problemlos an einer anderen Stelle in Ihrem Dateisystem erneut einbinden, z. B. mit / mnt

mount -o bind / /mnt

dann kannst du a

du -h /mnt

und sehen, was Ihren Raum verbraucht.

Ps: Entschuldigung, dass Sie eine neue Antwort und keinen Kommentar hinzugefügt haben, aber ich brauchte eine Formatierung, damit dieser Beitrag lesbar ist.

Marcel G
quelle
3
Vielen Dank für diesen Tipp. Erlaubte mir, meine großen, "versteckten" Dateien ohne Ausfallzeit zu finden und zu löschen!
Choover
Danke - dies zeigte, dass Docker meine Festplatte mit Differenzen füllte. In/var/lib/docker/aufs/diff/
naught101
25

Sehen Sie, was df -isagt. Es kann sein, dass Sie keine Inodes mehr haben, was passieren kann, wenn sich in diesem Dateisystem eine große Anzahl kleiner Dateien befindet, die alle verfügbaren Inodes verbrauchen, ohne den gesamten verfügbaren Speicherplatz zu belegen.

Eirescot
quelle
1
Die Größe einer Datei und der Speicherplatz, den sie in einem Dateisystem beansprucht, sind zwei verschiedene Dinge. Je kleiner die Dateien sind, desto größer ist die Diskrepanz zwischen ihnen. Wenn Sie ein Skript schreiben, das die Größe der Dateien zusammenfasst und mit dem du -sdes gleichen Teilbaums vergleicht, erhalten Sie eine gute Vorstellung davon, ob dies hier der Fall ist.
Marcin
24

In meinem Fall hatte dies mit großen gelöschten Dateien zu tun. Es war ziemlich schmerzhaft zu lösen, bevor ich diese Seite fand, die mich auf den richtigen Weg brachte.

Schließlich löste ich das Problem mit, indem lsof | grep deletedich sah, welches Programm zwei sehr große Protokolldateien enthielt (insgesamt 5 GB meiner verfügbaren 8 GB-Root-Partition).

Adrian
quelle
1
Diese Antwort lässt mich wundern, warum Sie Protokolldateien auf der Root-Partition speichern, insbesondere auf einer so kleinen ... aber für jede ihre eigene, nehme ich an ...
ein CVn
Ich hatte ein ähnliches Problem, ich hatte alle Anwendungen, die die gelöschte Datei verwendeten, neu gestartet. Ich glaube, es gab einen Zombie-Prozess, der noch an einer großen gelöschten Datei
festhielt
Dies war der Fall für uns, eine Linux-App zur Protokollverarbeitung, bekannt als Filebeat, hielt Dateien offen.
Pykler
@ Pykler Für uns war es auch Filebeat. Danke für den Tipp!
Martijn Heemels
7

Dateien, die von einem Programm geöffnet werden, werden beim Löschen nicht gelöscht (und belegen nicht mehr Speicherplatz). Sie werden gelöscht, wenn das Programm sie schließt. Ein Programm hat möglicherweise eine riesige temporäre Datei, die Sie (und du) nicht sehen können. Wenn es sich um ein Zombie-Programm handelt, müssen Sie möglicherweise einen Neustart durchführen, um diese Dateien zu löschen.

Paul Tomblin
quelle
OP gab an, dass er das System neu gestartet hatte und das Problem weiterhin bestand.
OldTroll
Ich hatte Zombies, die die Sperren für die Dateien nicht aufheben würden, ich kill -9 'pid'sie, um die Sperren aufzuheben und den Speicherplatz zurückzugewinnen.
Micka
5

Versuchen Sie dies, um festzustellen, ob ein Dead / Hung-Prozess gesperrt ist, während noch auf die Festplatte geschrieben wird: lsof | grep "/ mnt"

Versuchen Sie dann, alle festsitzenden PIDs zu eliminieren (achten Sie insbesondere auf Zeilen, die mit "(gelöscht)" enden).

Phirsk
quelle
Vielen Dank! Ich konnte feststellen, dass der SFTP-Serverprozess die gelöschte Datei
enthielt
4

Dies ist die einfachste Methode, die ich bisher gefunden habe, um große Dateien zu finden!

Hier ist ein Beispiel, wenn Ihr Root-Mount voll ist / (mount / root) Beispiel:

cd / (also bist du im root)

ls | xargs du -hs

Beispielausgabe:

 9,4 Mio. bin
 63M booten
 4.0K cgroup
 680K dev
 31M usw
 6.3G nach Hause
 313M lib
 32M lib64
 16K verloren + gefunden
 61G Medien
 4,0 K mnt
 113 Millionen opt
 du: Kein Zugriff auf proc / 6102 / task / 6102 / fd / 4: Keine solche Datei oder kein solches Verzeichnis
 0 proc
 19 Millionen root
 840K laufen
 19 Millionen sbin
 4.0K Selinux
 4,0 k srv
 25G speichern
 26 Mio. tmp

dann würden Sie feststellen, dass der Speicher groß ist, machen Sie eine CD / Store

und wieder laufen

ls | xargs du -hs

Beispielausgabe: 
 109M Backup
 358 Mio. fnb
 4.0G iso
 8,0 ks
 16K verloren + gefunden
 47 Millionen root
 11M-Skripte
 79 Mio. tmp
 21G vms

in diesem fall ist das vms-verzeichnis das space hog.

Riaan
quelle
1
Warum nicht einfachere Tools wie baobab? (Siehe marzocca.net/linux/baobab/baobab-getting-started.html )
Yvan
2
Hm ls+ xargswirkt wie Overkill, du -sh /*funktioniert von selbst ganz gut
ChrisWue
1
wenn du nichts über ncdu weißt ... wirst du mir später danken: dev.yorhel.nl/ncdu
Troy Folger
3

Für mich musste ich ausführen, sudo duda es eine große Anzahl von Docker-Dateien gab /var/lib/docker, für die ein Nicht-Sudo-Benutzer keine Leseberechtigung hat.

Jobevers
quelle
Das war mein Problem. Ich habe vergessen, dass ich die Speichersysteme in Docker gewechselt habe und die alten Volumes immer noch herumhingen.
Richard Nienaber
1

Eine weitere Möglichkeit, die Sie in Betracht ziehen sollten: Es ist fast sicher, dass Sie eine große Diskrepanz feststellen, wenn Sie Docker verwenden und df / du in einem Container ausführen, in dem Volume-Mounts verwendet werden. Im Fall eines Verzeichnisses, das auf einem Volume auf dem Docker-Host gemountet ist, meldet df die df-Summen des Hosts. Dies ist offensichtlich , wenn man darüber nachdenkt, aber wenn Sie einen Bericht über einen „Ausreißer Behälter füllt die Platte!“ Erhalten, stellen Sie sicher , dass Sie den Dateibereichsverbrauch mit so etwas wie dem Behälter überprüfen du -hs <dir>.

Troy Folger
quelle
1

Also hatte ich dieses Problem auch in Centos 7 und fand eine Lösung, nachdem ich ein paar Dinge wie Bleichbit und das Reinigen von / usr und / var ausprobiert hatte, obwohl sie jeweils nur etwa 7 G zeigten. Es wurden immer noch 50G von 50G angezeigt, die in der Root-Partition verwendet wurden, es wurden jedoch nur 9G der Dateiverwendung angezeigt. Führen Sie eine Ubuntu-Live-CD aus und entfernen Sie die anstößige 50G-Partition, öffnen Sie das Terminal und führen Sie xfs_check und xfs_repair auf der Partition aus. Ich habe dann die Partition neu gemountet und mein Fundbüro auf 40G erweitert. Sortierte das Fundbüro nach Größe und fand eine 38-G-Text-Protokolldatei für Steam, die schließlich einen MP3-Fehler wiederholte. Entfernte die große Datei und habe jetzt Platz und meine Festplattennutzung stimmt mit meiner Root-Partitionsgröße überein. Ich würde immer noch gerne wissen, wie ich das Steamlog dazu bringen kann, nicht wieder so groß zu werden.

Justin Chadwick
quelle
Ist Ihnen das bei der Arbeit passiert? serverfault.com/help/on-topic
Küken
Nein, nur auf meinem Heimcomputer.
Justin Chadwick
3
xfs_fsr
behebt
0

Wenn es sich bei dem bereitgestellten Datenträger um einen freigegebenen Ordner auf einem Windows-Computer handelt, zeigt df anscheinend die Größe und die Datenträgernutzung des gesamten Windows-Datenträgers an, aber du zeigt nur den Teil des Datenträgers an, auf den Sie ebenfalls Zugriff haben. (und ist montiert). In diesem Fall muss das Problem auf dem Windows-Computer behoben werden.

Sverre
quelle
0

Ähnliches passierte uns in der Produktion, die Festplattenauslastung lag bei 98%. Hat folgende Untersuchung durchgeführt:

a) df -iZur Überprüfung der Inode-Nutzung betrug die Inode-Nutzung 6%, also nicht viel kleinere Dateien

b) Hängen Sie rootversteckte Dateien ein und überprüfen Sie sie. Es konnten keine zusätzlichen Dateien abgelegt werden. duDie Ergebnisse waren die gleichen wie vor dem Einhängen.

c) Zuletzt überprüfte nginxProtokolle. Es wurde für das Schreiben auf die Festplatte konfiguriert, aber ein Entwickler hat die Protokolldatei direkt gelöscht nginx, um alle Protokolle im Speicher zu belassen. Da die Datei /var/log/nginx/access.logmit von der Festplatte gelöscht wurde, war rmsie mit nicht sichtbar, duaber auf die Datei wurde zugegriffen nginxund sie wurde daher weiterhin geöffnet

darxtrix
quelle
0

Ich hatte das gleiche Problem, das in diesem Thema erwähnt wird, aber in einem VPS. Ich habe also alles getestet, was in diesem Thema beschrieben ist, aber ohne Erfolg. Die Lösung war ein Support-Kontakt mit unserem VPS-Anbieter, der eine Quoten-Neuberechnung durchführte und die Speicherplatzdifferenz von df -hund korrigierte du-sh /.

ldxd
quelle
0

Ich bin heute auf einer FreeBSD-Box auf dieses Problem gestoßen. Das Problem war, dass es ein Artefakt von war vi(nicht vim, nicht sicher, ob vimdieses Problem entstehen würde). Die Datei beanspruchte Speicherplatz, wurde jedoch noch nicht vollständig auf die Festplatte geschrieben.

Sie können das überprüfen mit:

$ fstat -f /path/to/mount/point |sort -nk8 |tail

Hier werden alle geöffneten Dateien angezeigt und (numerisch über -n) nach der achten Spalte (Taste, -k8) sortiert , wobei die letzten zehn Elemente angezeigt werden.

In meinem Fall sah der letzte (größte) Eintrag so aus:

bob      vi         12345    4 /var      97267 -rwx------  1569454080 rw

Dies bedeutete, dass der Prozess (PID) 12345 1,46 G (die achte Spalte geteilt durch 1024³) der Festplatte verbrauchte, obwohl dies nicht dubemerkt wurde. viEs ist schrecklich, extrem große Dateien anzuzeigen. sogar 100 MB sind dafür groß. 1,5G (oder wie groß diese Datei auch war) ist lächerlich.

Die Lösung war sudo kill -HUP 12345(wenn das nicht sudo kill 12345klappen kill -9würde, würde ich und wenn das auch scheitern würde, würde das gefürchtete ins Spiel kommen).

Vermeiden Sie Texteditoren für große Dateien. Beispielumgehungen für schnelles Überfliegen:

Angenommene angemessene Leitungslängen:

  • { head -n1000 big.log; tail -n1000 big.log } |vim -R -
  • wc -l big.log |awk -v n=2000 'NR==FNR{L=$1;next}FNR%int(L/n)==1' - big.log |vim -R -

Unangemessen große Leitung (en) annehmen:

  • { head -c8000 big.log; tail -c8000 big.log } |vim -R -

Diese verwenden, vim -Ranstatt viewweil vimes fast immer besser ist ... wenn es installiert ist. Fühlen Sie sich frei, sie in viewoder vi -Rstattdessen zu leiten.

Wenn Sie eine solche große Datei sind Öffnen es tatsächlich zu bearbeiten, betrachten sedoder awkoder einem anderen programmatischen Ansatz.

Adam Katz
quelle
0

Überprüfen Sie, ob auf Ihrem Server ossec agent installiert ist. Oder ein Prozess verwendet die gelöschten Protokolldateien. Vor einer Zeit war ich ein ossec Agent.

Richard Mérida
quelle
1
OP erwähnte, dass die Maschine neu gestartet wurde, sodass keine gelöschten Dateien mehr vorhanden sein sollten.
RalfFriedl
-3

Überprüfen Sie die / lost + found, ich hatte ein System (Centos 7) und ein Teil der Datei in der / lost + found aß den gesamten Speicherplatz.

Jude Zhu
quelle
Wie würde dies den Unterschied in der gemeldeten Datenträgernutzung erklären, wie in der Frage beschrieben ?
Roaima