Kein Speicherplatz mehr: Wie finde ich heraus, was den Speicherplatz belegt?

81

Auf einem meiner Server mit 16.04 ist ein Problem aufgetreten: Es ist kein Speicherplatz mehr verfügbar.

Ich habe keine Ahnung, was den Raum einnimmt. Gibt es einen Befehl zum Auflisten der aktuellen Verzeichnisgrößen, damit ich den gesamten Speicherplatz in dem Verzeichnis beanspruchen kann?

Karl Morrison
quelle
1
Überprüfen Sie die Datenträgernutzungsanalyse
Pranal Narayan
@PranalNarayan Keine GUI wie es auf meinem Server ist Ich fürchte :(
Karl Morrison
1
Verdammt, jetzt habe ich gesucht und dieses bugs.launchpad.net/ubuntu/+source/baobab/+bug/942255 gefunden. Ich wünschte, es wäre eine Sache.
Sam
1
wrt "no GUI, is a server": Sie könnten die GUI-App installieren (vorausgesetzt, Sie sind damit zufrieden und die Support-Bibliotheken befinden sich auf einem Server) und sie wird auf Ihrem lokalen Bildschirm über X11-getunnelled-through-SSH mit so etwas wie verwendet export DISPLAY=:0.0; ssh -Y <user>@<server> filelight(Ersetzen Sie filelightmit Ihrem bevorzugten Werkzeug). Natürlich ist absolut kein Speicherplatz mehr vorhanden. Wenn Sie das Tool noch nicht installiert haben, müssen Sie trotzdem etwas anderes verwenden!
David Spillett
4
@DavidSpillett Wie bereits erwähnt, ist auf dem Server kein Speicherplatz mehr verfügbar . Ich kann also nichts installieren.
Karl Morrison

Antworten:

93

Wie immer unter Linux gibt es mehrere Möglichkeiten, um die Arbeit zu erledigen. Wenn Sie dies jedoch von CLI aus tun müssen, ist dies meine bevorzugte Methode:

Ich starte als root oder mit sudo:

du -cha --max-depth=1 / | grep -E "M|G"

Das Problem besteht darin, die zurückgegebenen Zeilen auf diejenigen zu beschränken, die Werte im Megabyte- oder Gigabyte-Bereich zurückgeben. Wenn Ihre Festplatten groß genug sind, können Sie |Tauch Terabyte-Mengen hinzufügen . Möglicherweise werden auf /proc, /sysund / oder einige Fehler angezeigt, /devda es sich nicht um echte Dateien auf der Festplatte handelt. Es sollte jedoch weiterhin eine gültige Ausgabe für die übrigen Verzeichnisse im Stammverzeichnis liefern. Nachdem Sie die größten gefunden haben, können Sie den Befehl in diesem Verzeichnis ausführen, um den Täter einzugrenzen. Wenn also zum Beispiel /vardas größte wäre, könntest du es als nächstes so machen:

du -cha --max-depth=1 /var | grep -E "M|G"

Das sollte Sie zu den Sorgenkindern führen!

Weitere Überlegungen

Der obige Befehl wird sicherlich den Trick machen, aber ich hatte einige konstruktive Kritik in den Kommentaren unten, die auf einige Dinge hinwiesen, die Sie auch einschließen könnten.

  1. Der von grepmir angegebene Wert kann dazu führen, dass gelegentlich der Wert "K" zurückgegeben wird, wenn der Name des Verzeichnisses oder der Datei die Groß- oder Kleinschreibung "G" oder "M" hat Ihr Regex-Spiel wird kreativer und komplexer. z.Bgrep -E "^[0-9\.]*[MG]"
  2. Wenn Sie wissen, um welches Laufwerk es sich handelt und auf dem Laufwerk andere Laufwerke installiert sind, die Sie nicht in die Suche einbeziehen möchten, können Sie das -xFlag zu Ihrem duBefehl hinzufügen . Manpage Beschreibung dieses Flags:

      -x, --one-file-system
          skip directories on different file systems
    
  3. Sie können die Ausgabe des duBefehls so sortieren , dass der höchste Wert unten steht. Hänge dies einfach an das Ende des Befehls an:| sort -h

TopHat
quelle
Genau das mache ich.
Leichtigkeitsrennen im Orbit
5
Ihr grep gibt auch Ordner mit den Buchstaben M oder G im Namen zurück. Ein Creative-Regex sollte Zahlen mit einem optionalen Punkt + M | G "^[0-9]*[.]*[0-9]*[MG]"
treffen
4
Wenn Sie wissen, dass es sich um ein Laufwerk handelt, können Sie mithilfe der -xOption festlegen, dass es duauf diesem einen Laufwerk verbleibt (in der Befehlszeile angegeben). Sie können auch durchleiten sort -h, um die von Menschen lesbaren Megabyte- / Gigabyte-Werte korrekt zu sortieren. Normalerweise habe ich die --max-depthOption weggelassen und das gesamte Laufwerk auf diese Weise durchsucht und entsprechend sortiert, um die größten Dinge unten zu finden.
Muzer
1
@alexis Meiner Erfahrung nach lande ich manchmal mit anderem Müll unter dem Mountpoint, an dem ich interessiert bin (vor allem, wenn das der Fall ist /), und die Verwendung -xgibt mir die Garantie, dass ich keine Dinge falsch zählen werde. Wenn Ihr /voll ist und Sie einen separat montierten /homeoder was auch immer haben, ist die Verwendung -xso ziemlich eine Notwendigkeit, das irrelevante Zeug loszuwerden. Ich finde es einfach einfacher, es die ganze Zeit zu benutzen, nur für den Fall.
Muzer
1
Wenn Sie die Sorte haben, brauchen Sie das grep nicht.
OrangeDog
77

Sie können dafür verwenden ncdu. Es funktioniert sehr gut.

sudo apt install ncdu

Bildbeschreibung hier eingeben

Duncan
quelle
34
Ich mache mir einen Kick, da ich dieses Programm normalerweise verwende. Da jedoch kein Platz mehr vorhanden ist, kann ich es nicht installieren, haha
Karl Morrison,
@KarlMorrison Ich sehe mehrere mögliche Lösungen. Hänge es einfach über sshfs auf einen anderen Computer und starte dort ncdu (vorausgesetzt, du hast bereits einen ssh-Server) - oder wenn du keinen ssh-Server hast, kannst du das tun Installieren Sie umgekehrt ncdu auf einem anderen Server und mounten Sie das mit sshfs und führen Sie ncdu vom Mount aus aus (vorausgesetzt, Sie haben bereits sshfs auf dem Server) - oder, wenn Sie keines haben, ... wenn ncdu ein einzelnes Skript ist, Sie kann nur curl http://path/to/ncdu | sh, und es wird in einem In-Memory-I / O-Standard-Cache ausgeführt, aber das erfordert etwas Glück. es gibt wahrscheinlich auch eine
möglichkeit
@KarlMorrison oder Sie können ein Live-Image von Linux starten und dort installieren.
Nach der Installation geben Sie sudo ncdu /über die Befehlszeile Folgendes ein. sudoDenn wenn Sie nicht sudo setzen, werden keine Größen für Ordner /angezeigt, die root gehören, und wenn Sie nicht eingeben, werden nur wiederkehrende Berichte aus dem Ordner ausgegeben, in dem Sie sich befinden
Max Carroll
19

Ich benutze diesen Befehl

sudo du -aBM -d 1 . | sort -nr | head -20

Gelegentlich muss ich es aus dem /Verzeichnis ausführen , da ich etwas an einer ungeraden Stelle platziert habe.

Charles Green
quelle
Ich gebe dir +1 dafür, dass es funktioniert! Allerdings liest die TopHats-Lösung mein Laufwerk tatsächlich schneller!
Karl Morrison
Ich finde es oft sinnvoller, dies ohne den -d 1Schalter (und normalerweise mit lessanstelle von head -20) zu tun , damit ich eine vollständige rekursiv aufgeführte Liste aller Dateien und Verzeichnisse erhalte, sortiert nach dem Speicherplatz, den sie belegen. Auf diese Weise kann ich, wenn ein Verzeichnis viel Speicherplatz belegt, einfach nach unten scrollen, um festzustellen, ob der größte Teil des Speicherplatzes tatsächlich von einer bestimmten Datei oder einem bestimmten Unterverzeichnis belegt ist. So finden Sie nicht benötigte Dateien und Verzeichnisse zum Löschen, um Speicherplatz freizugeben: Blättern Sie nach unten, bis Sie etwas sehen, von dem Sie sicher sind, dass es nicht beibehalten werden soll, löschen Sie es und wiederholen Sie es.
Ilmari Karonen
@KarlMorrison es liest es nicht schneller, es sortwartet nur darauf, dass die Ausgabe abgeschlossen ist, bevor mit der Ausgabe begonnen wird.
muru
@muru Ah in Ordnung. Ich erhalte jedoch schneller Informationen, damit ich schneller mit dem Durchqueren beginnen kann, wenn das ein besserer Begriff ist!
Karl Morrison
13

Es gibt bereits viele gute Antworten, wie Sie Verzeichnisse finden können, die den größten Teil des Speicherplatzes beanspruchen. Wenn Sie Grund zur Annahme haben, dass nur wenige große Dateien das Hauptproblem sind, und nicht viele kleine, können Sie so etwas verwenden find / -size +10M.

Luca Citi
quelle
11

Ich kenne Ubuntu nicht und kann meine Antwort nicht überprüfen, aber ich poste hier meine Antwort basierend auf meiner Erfahrung als Unix-Administrator vor langer Zeit.

  1. Finden Sie heraus, auf welchem ​​Dateisystem nicht genügend Speicherplatz vorhanden ist

    df -h
    

    listet alle Dateisysteme, ihre Größe und ihren freien Speicherplatz auf. Sie verschwenden nur Zeit, wenn Sie nach Dateisystemen suchen, die über genügend Speicherplatz verfügen. Angenommen, das vollständige Dateisystem ist / myfilesystem. Überprüfen Sie die df-Ausgabe, wenn Dateisysteme auf Unterverzeichnissen von / myfilesystems eingebunden sind. In diesem Fall müssen die folgenden Schritte an diese Situation angepasst werden.

  2. Finden Sie heraus, wie viel Speicherplatz die Dateien dieses Dateisystems belegen

    du -sh /myfilesystem
    

    Die Option -x kann verwendet werden, um sicherzustellen, dass nur die Dateien berücksichtigt werden, die Mitglied dieses Dateisystems sind. Einige Unix-Varianten (z. B. Solaris) kennen die Option -x für du nicht. Dann müssen Sie einige Problemumgehungen verwenden, um die Du Ihres Dateisystems zu finden.

  3. Überprüfen Sie nun, ob das du der sichtbaren Dateien ungefähr der Größe des von df angezeigten Speicherplatzes entspricht. In diesem Fall können Sie die großen Dateien / Verzeichnisse des Dateisystems / myfilesystem suchen, um sie zu bereinigen.

  4. um die größten Unterverzeichnisse eines Verzeichnisses zu finden /.../dir verwenden

    du -sk /.../dir/*|sort -n
    

    Die Option -k erzwingt die Ausgabe der Sie in Kilobyte ohne Einheit. Dies kann auf einigen Systemen die Standardeinstellung sein. Dann können Sie diese Option weglassen. Die größten Dateien / Unterverzeichnisse werden am Ende der Ausgabe angezeigt.

  5. Wenn Sie eine große Datei / ein großes Verzeichnis gefunden haben, das Sie nicht mehr benötigen, können Sie es auf geeignete Weise entfernen. Kümmern Sie sich nicht um die kleinen Verzeichnisse oben in der Ausgabe. Es wird Ihr Problem nicht lösen, wenn Sie sie löschen. Wenn Sie immer noch nicht genügend Speicherplatz haben, können Sie Schritt 4 in den großen Unterverzeichnissen wiederholen, die am Ende der Liste angezeigt werden.

Aber was ist passiert, wenn die du-Ausgabe nicht ungefähr dem von df angezeigten verfügbaren Speicherplatz entspricht?

Wenn die du-Ausgabe größer ist, haben Sie ein Unterverzeichnis übersehen, in dem ein anderes Dateisystem eingehängt ist. Wenn die du-Ausgabe viel kleiner ist, werden einige Dateien in keinem Verzeichnis angezeigt, das Sie überprüfen. Es kann verschiedene Gründe für sein Phänomen geben.

  1. Einige Prozesse verwenden eine bereits gelöschte Datei. Daher wurden diese Dateien aus dem Verzeichnis entfernt und du kannst sie nicht sehen. Aber für das Dateisystem werden ihre Blöcke noch verwendet, bis die Prozesse die Dateien schließen. Sie können versuchen, die relevanten Prozesse herauszufinden (z. B. mit lsof) und sie zum Schließen dieser Dateien zwingen (z. B. durch Stoppen der Anwendung oder Beenden der Prozesse). Oder Sie starten einfach Ihre Maschine neu.

  2. Es gibt Dateien in Verzeichnissen, die nicht mehr sichtbar sind, da in einem ihrer übergeordneten Verzeichnisse ein anderes Dateisystem eingehängt ist. Wenn Sie also eine Datei / myfilesysem / subdir / bigfile haben und nun ein anderes Dateisystem auf / myfilesystem / subdir mounten, können Sie diese Datei nicht mehr sehen und

    du -shx /myfilesystem 
    

    meldet einen Wert, der nicht die Größe von / myfilesystem / subdir / bigfile enthält. Der einzige Weg, um herauszufinden, ob solche Dateien existieren, besteht darin, / myfilesystem / subir zu entfernen und mit zu überprüfen

    ls -la /myfilesystem/subdir 
    

    wenn es Dateien enthält.

  3. Es kann spezielle Arten von Dateisystemen geben, die Speicherplatz auf einer Festplatte belegen / reservieren, der für den Befehl ls nicht sichtbar ist. Sie benötigen spezielle Werkzeuge, um dies anzuzeigen.

Neben dieser systematischen Verwendung des Befehls du gibt es noch einige andere Möglichkeiten. Sie können den Befehl find verwenden, um nach Dateien zu suchen, die größer als ein von Ihnen angegebener Wert sind. Sie können nach Dateien suchen, die größer als ein von Ihnen angegebener Wert sind oder neu erstellt wurden oder einen speziellen Namen haben (z. B. * .log, core, * .trc). Sie sollten jedoch immer eine df wie in 1 beschrieben ausführen, damit Sie mit dem richtigen Dateisystem arbeiten

miracle173
quelle
Auf einem ausgelasteten Server können Sie die Bereitstellung nicht immer aufheben. Sie können jedoch das übergeordnete Verzeichnis an einen temporären Speicherort binden. Die anderen Bereitstellungen werden nicht berücksichtigt, und der Zugriff auf die ausgeblendeten Dateien wird ermöglicht.
Zan Lynx
Vor dem System hatte ich oft Mount-Fehler, die dazu führten, dass / mount mit Papierkorb gefüllt wurde. Schreiben einer Sicherung nach / mnt / backup, ohne dass beispielsweise das USB-Laufwerk angeschlossen ist. Jetzt stelle ich sicher, dass diese Jobeinheiten Mount-Anforderungen haben.
Zan Lynx
@ZanLynx Danke, ich noch nie gehört Bind Mounts vor
miracle173
@ZanLynx: Nicht nur auf ausgelasteten Servern. Stellen Sie sich vor, Sie haben /tmpein separates Dateisystem (z. B. ein tmpfs) und etwas, in dem Dateien erstellt wurden, /tmpbevor es zu einem Einhängepunkt für ein anderes Dateisystem wurde. Jetzt befinden sich diese Dateien im Root-Dateisystem, im Schatten eines Mount-Punkts, und Sie können nicht auf sie zugreifen, ohne einen Neustart im Wiederherstellungsmodus (der nicht verarbeitet wird /etc/fstab) oder, wie Sie vorschlagen, im Bind-Mount- Modus .
David Foerster
9

Wenn Sie auch keinen Befehl verwenden möchten , finden Sie hier eine App: Filelight

Damit können Sie schnell visualisieren, was in einem Ordner Speicherplatz belegt.

Bildbeschreibung hier eingeben

Gabriel
quelle
Es ist ein Server, in den ich SSH, keine GUI.
Karl Morrison
@ KarlMorrison Ich denke, es gibt Möglichkeiten, GUI-Programme über ssh auszuführen, aber das ist eine Idee für später, wenn Sie Platz zum Installieren von Paketen haben
Xen2050
@ David Oh ja, ich versuche, da rauszukommen. Früher war es auf einer anderen Plattform notwendig, die ich benutzte. Ich werde diesen Kommentar korrigieren.
@ Karl Ja, es ist einfach, wenn X bereits auf dem Client installiert ist: ssh -X <your host>Führen Sie Ihr Programm dann über die Befehlszeile aus
@MarkYisri Der Punkt ist, dass Sie das Programm und seine Abhängigkeiten installieren müssen. Und der Fall von Filelight erfordert mindestens KDElibs und Qt, die nicht wirklich klein sind. Sehen Sie zB auf dieser Seite nach , wie viele Abhängigkeiten das Ubuntu-Paket hat.
Ruslan
5

Versuchen Sie sudo apt-get autoremove, die nicht verwendeten Dateien zu entfernen, wenn Sie dies nicht getan haben

Donald Shahini
quelle
1
Hab das schon mal gemacht :( Aber gute Idee für andere!
Karl Morrison
3

Ich benutze diesen oft

du -sh /*/

Wenn ich dann große Ordner finde, wechsle ich zu diesen und mache weitere Nachforschungen

cd big_dir
du -sh */

Bei Bedarf können Sie es auch automatisch mit sortieren lassen

du -s /*/ | sort -n
phuclv
quelle
2

Keine wirkliche Antwort - aber ein Nachtrag.

Sie haben nicht genügend Speicherplatz und können ncdu nicht von @erman 's Antwort installieren.

Einige Vorschläge

  • sudo apt clean allum bereits heruntergeladene Pakete zu löschen. SICHER
  • sudo rm -f /var/log/*gzProtokolldateien löschen, die älter als ein oder zwei Wochen sind - löscht keine neueren / aktuellen Protokolle. Am sichersten
  • sudo lsof | grep deletedlistet alle offenen Dateien auf, filtert jedoch nach den Dateien, die von der Festplatte gelöscht wurden. ZIEMLICH SICHER
  • sudo rm /tmp/*Löschen Sie einige temporäre Dateien - wenn sie von irgendetwas verwendet werden, können Sie einen Prozess stören. NICHT WIRKLICH SICHER

Das `lsof kann man Zeilen wie folgt zurückgeben:

server456 ~ $ lsof | grep deleted
init          1          root    9r      REG              253,0  10406312       3104 /var/lib/sss/mc/initgro                        ups (deleted)
salt-mini  4532          root    0r      REG              253,0        17     393614 /tmp/sh-thd-1492991421                         (deleted)

Kann nicht viel für die Init-Zeile tun, aber die zweite Zeile legt nahe, dass Salt-Minion eine Datei geöffnet hat, die gelöscht wurde. Die Plattenblöcke werden zurückgegeben, sobald alle Datei-Handles durch einen Neustart des Dienstes geschlossen wurden.

Andere häufige Verdächtige sind syslog / rsyslog / syslog-ng, squid, apache oder ein Prozess, den Ihr Server ausführt und der "schwer" ist.

Criggie
quelle
2

Besonders wertvoll finde ich die Ausgabe von Tools wie Filelight, aber wie in Ihrem Fall ist auf Servern normalerweise keine GUI installiert, aber der duBefehl ist immer verfügbar.

Was ich normalerweise mache ist:

  • schreibe die duAusgabe in eine Datei ( du / > du_output.txt);
  • Kopieren Sie die Datei auf meinen Computer.
  • Verwenden Sie DuFSdiese Option, um die duAusgabe in einem temporären Verzeichnis "einzuhängen" . DuFSverwendet FUSE, um ein virtuelles Dateisystem zu erstellen (= es werden keine Dateien erstellt, es ist alles falsch), entsprechend der duAusgabe;
  • Führen Sie Filelight oder ein anderes GUI-Tool in diesem temporären Verzeichnis aus.

Haftungsausschluss: Ich habe geschrieben dufs- gerade weil ich oft herausfinden muss, welcher Speicherplatz auf kopflosen Maschinen knapp wird.

Matteo Italia
quelle
Sie können -n du_output.txt
Zan Lynx
Die grafische Darstellung des genutzten Raumes finde ich wesentlich intuitiver.
Matteo Italia
-1

Entspricht @TopHat, filtert jedoch einige Dateien, wenn der Name M, G oder T enthält. Ich glaube nicht, dass es die Größe in der ersten Spalte verfehlen wird, aber es wird nicht mit dem Dateinamen übereinstimmen, wenn Sie Dateien nicht kreativ benennen.

du -chad 1 . | grep -E '[0-9]M[[:blank:]]|[0-9]G[[:blank:]]|[0-9]T[[:blank:]]'

Befehlszeilenoptionen werden hier erklärt , da ich nicht wusste, was das c oder a tat.

user685769
quelle