Der Befehl „du“ im Detail: Beispiele zur Analyse der Festplattennutzung

Linux 8 Min. Lesezeit

Der Befehl „du“ (disk usage) zeigt an, wie viel Speicherplatz eine Datei oder ein Verzeichnis auf der Festplatte belegt. Für eine schnelle Suche bietet der Artikel „Wie lässt sich die Festplattennutzung auf einem Linux-Server überprüfen?“ zusammen mit dem Befehl „df“ eine Anleitung. Dieser Artikel befasst sich mit den Optionen und Besonderheiten von „du“: Warum zeigt es andere Ergebnisse als „ls“ an, wie geht es mit Hardlinks und „sparse“-Dateien um und wie lässt sich die Ausgabe filtern?

Die Beispiele wurden auf einem AlmaLinux 10.2-System mit dem Befehl „du“ aus GNU coreutils 9.5 in einem Beispielverzeichnis (/var/www/pelda.hu) ausgeführt, das Logdateien, ein hochgeladenes Video, eine Sicherungskopie, einen Hardlink dazu sowie ein 2-GB-Disk-Image mit geringer Dichte enthielt.

Grundlagen

du -sh /var/www/pelda.hu      # egy könyvtár összesen
du -h /var/www/pelda.hu       # minden alkönyvtár, rekurzívan
  • -s (summarize): nur die Summe, ohne Unterverzeichnisse;
  • -h (menschenlesbar): Einheiten K, M, G anstelle der Blockzahlen.

Als normaler Benutzer hat „du“ keinen Zugriff auf die Verzeichnisse anderer Benutzer und meldet dies als Fehler („du: cannot read directory '/var/log/chrony': Permission denied“). Auch in diesem Fall wird ein Wert ausgegeben, der jedoch geringer ist als der tatsächliche: Im Test gab „du -sh /root“ als normaler Benutzer den Wert 0 aus, zeigte die Fehlermeldung an und beendete den Vorgang mit dem Exit-Code 1. Messen Sie die Systemverzeichnisse mit sudo und unterdrücken Sie die Fehlermeldungen nicht (2>/dev/null), solange Sie nicht wissen, was du übersehen hat.

Die Ersetzung durch * schließt (versteckte) Dateien und Verzeichnisse, die mit einem Punkt beginnen, nicht ein. Der Befehl „du -sh *“ zeigt daher möglicherweise weniger an als „du -sh .“; im Test wurde eine 5 MB große Datei namens „.rejtett-nagy“ in der Liste nicht berücksichtigt. Zusammen mit den versteckten Elementen listet der Befehl „du -h -d 1 .“ diese auf.

Ebene und Sortierung

sudo du -h -d 1 /var/www/pelda.hu | sort -h
85M     /var/www/pelda.hu/logs
120M    /var/www/pelda.hu/public_html
300M    /var/www/pelda.hu/backup
505M    /var/www/pelda.hu

Die Option „-d 1“ (ausgeschrieben: „--max-depth=1“) gibt nur die direkten Unterverzeichnisse aus. Der Befehl „sort -h“ sortiert die Größenangaben im lesbaren Format (K, M, G) in der richtigen Reihenfolge; „sort -rh“ sortiert umgekehrt, beginnend mit dem größten Wert, und „| head“ behält nur die ersten Zeilen bei.

Die „du“-Befehle unter AlmaLinux 10: Nach den Optionen „-d 1“ für die Verzeichnisgröße und „-h“ für die Zeilenhöhe beträgt die scheinbare Größe 2,5 G; laut „ls -lh“ beträgt die Größe des Backup-Verzeichnisses 600 M. Der Befehl „du“ zählt den Hardlink nur einmal, die seltene Festplattenkopie beträgt 0.

Auch Dateien, nicht nur Verzeichnisse

sudo du -ah /var/www/pelda.hu | sort -rh | head -5

Die Option -a (all) gibt auch die Dateien aus. Im Test begann die Liste mit dem gesamten Verzeichnis, der 300-MB-Sicherung und dem 120-MB-Video.

Zusammenfassung mehrerer Positionen: -c

sudo du -ch /var/www/pelda.hu/logs/*.log*
15M     logs/access.log.1
15M     logs/access.log.2
15M     logs/access.log.3
40M     logs/error.log
85M     total

Das „-c“ fügt am Ende eine „total“-Zeile ein. Dies ist nützlich, wenn Sie die totale Größe aller Dateien kennen möchten, die einem bestimmten Muster entsprechen (beispielsweise aller Logdateien).

Ausschluss und Schwellenwert

sudo du -sh --exclude='*.log*' /var/www/pelda.hu   # naplók nélkül: 420M
sudo du -h -t 100M -d 3 /var/www/pelda.hu          # csak a 100 MB fölöttiek

Die Option „--exclude“ lässt Dateien und Verzeichnisse aus, die dem Muster entsprechen (kann mehrfach angegeben werden). Setzen Sie das Muster in Anführungszeichen, da die Shell es sonst bereits vor dem Befehl „du“ auflöst. Die Option „-t“ (--threshold) blendet Einträge aus, die kleiner als der angegebene Wert sind, sodass auch in einer tief verschachtelten Verzeichnisstruktur nur die großen Einträge übrig bleiben. Mit einem negativen Wert funktioniert es umgekehrt: „-t -100M“ zeigt nur Einträge mit einer Größe von maximal 100 MB an (im Test das Verzeichnis „logs“). Mit einem positiven Schwellenwert:

120M    ./public_html/wp-content/uploads
120M    ./public_html/wp-content
120M    ./public_html
300M    ./backup
505M    .

Innerhalb eines Dateisystems: -x

Bei der Messung des Stammverzeichnisses wechselt das Programm „du“ standardmäßig auch zu den anderen eingebundenen Dateisystemen (beispielsweise zur separaten /boot-Partition oder zu einem Netzlaufwerk). Die Option -x verhindert dies:

sudo du -h -d 1 -x / | sort -h | tail

Im Test lief „du -shx /“ ohne Fehlermeldung mit 1,3 GB ab, „du -sh /“ zeigte 1,4 GB an und gab dabei aufgrund der gerade verschwindenden Dateien im Verzeichnis /proc Fehlermeldungen aus („du: cannot access '/proc/1210/fd/4': No such file or directory“). Der Unterschied ergibt sich aus den auf einer separaten Partition befindlichen Verzeichnissen /boot und /boot/efi sowie dem im Arbeitsspeicher befindlichen Verzeichnis /run. Die gemounteten Dateisysteme werden mit dem Befehl „df -h“ aufgelistet.

Die Option „-d 1“ beschränkt lediglich die Anzahl der ausgegebenen Zeilen: „du“ durchläuft auch in diesem Fall den gesamten Verzeichnisbaum, um die Summen zu berechnen. Bei einem großen Dateisystem beschleunigt die Tiefenbegrenzung daher die Messung nicht, sondern verkürzt lediglich die Ausgabe. Die Option „2>/dev/null“ leitet Fehlermeldungen aus Verzeichnissen wie /proc und ähnlichen Verzeichnissen in die Ausgabedatei „/dev/null“ um.

Andere Maßeinheiten: -B, -k, -m

du -s -BM logs      # megabájtban: 85M
du -sk logs         # kilobájtban, egység nélkül, szkriptekhez
du -sb logs         # bájtban (látszólagos méret)

In Skripten sind die Optionen „-k“ oder „-b“ besser geeignet als „-h“, da die Ausgabe als Zahl verarbeitet werden kann.

Warum werden andere Ergebnisse angezeigt als bei „ls“?

Belegter Speicherplatz und scheinbare Größe

Der Befehl „ls -l“ zeigt die scheinbare Größe der Datei an (wie viele Bytes sie enthält), während der Befehl „du“ den tatsächlich auf der Festplatte belegten Speicherplatz angibt. Beide Werte liegen in der Regel nahe beieinander, weichen jedoch in zwei Fällen stark voneinander ab.

Sparse-Dateien

Virtuelle Festplattenabbilder, Datenbankdateien und bestimmte Protokolle können „dünn“ sein: Die Datei ist zwar groß, doch die Teile mit dem Inhalt Null belegen keinen Speicherplatz. Im Test wurde ein Festplattenabbild mit dem Befehl „truncate -s 2G“ erstellt:

ls -lh backup/lemezkep.img                  # 2.0G
du -h backup/lemezkep.img                   # 0
du -h --apparent-size backup/lemezkep.img   # 2.0G

Die Option „--apparent-size“ gibt die scheinbare Größe an, ähnlich wie bei „ls“. Das gesamte Beispielverzeichnis erschien somit statt 505 MB als 2,5 GB. Wenn Sie eine solche Datei mit einem Tool kopieren, das keine spärlichen Dateien verarbeitet, kann die Kopie die gesamte Größe einnehmen (cp unterstützt dies standardmäßig, bei rsync ist der Schalter „--sparse“ erforderlich).

Wenn eine Datei zwei Namen hat (Hardlink), belegt sie auf der Festplatte nur einmal Speicherplatz. Der Befehl „ls -l“ zeigt in der zweiten Spalte an, wie viele Namen eine Datei hat, und zählt in der Zeile „total“ beide mit; der Befehl „du“ zählt sie nur einmal:

-rw-r--r--. 2 root root 300M Oct 28 20:36 hardlink.tar.gz
-rw-r--r--. 1 root root 2.0G Oct 28 20:36 lemezkep.img
-rw-r--r--. 2 root root 300M Oct 28 20:36 mentes-2026-10.tar.gz

Im Test ergab der Befehl „ls -lh backup/“, dass der Ordner 600 MB groß war, während „du“ 300 MB anzeigte. Der Befehl „du -h backup/*“ gab den zweiten Namen gar nicht erst aus, da dieser bereits beim ersten gezählt worden war. Wenn Sie dennoch jeden Namen separat zählen möchten, verwenden Sie die Option -l (--count-links): Das Beispielverzeichnis ergab so 805 MB. Hardlinks werden beispielsweise von einigen Backup-Programmen verwendet (gemeinsame Dateien aufeinanderfolgender Backups belegen nur einmal Speicherplatz), weshalb die mit du gemessene Größe eines Backup-Verzeichnisses deutlich kleiner sein kann als die Summe der Dateigrößen.

du misst grundsätzlich den Link selbst und nicht das, worauf er verweist. Im Test betrug die Größe eines auf das Verzeichnis „backup“ verweisenden Links laut du -sh 0, mit dem Schalter -H hingegen 300M:

sudo du -sh /tmp/mentes-link     # 0
sudo du -shH /tmp/mentes-link    # 300M

-H folgt nur dem in der Befehlszeile angegebenen Link, nicht jedoch den Links in der Verzeichnisstruktur. -L folgt allen Links, weshalb sich die Messung auch auf Bereiche außerhalb des untersuchten Verzeichnisses erstrecken kann; verwenden Sie diese Option daher nur in begründeten Fällen.

Anzahl der Dateien: –inodes

sudo du --inodes -s /usr /var

Die Option „--inodes“ gibt anstelle der Byte-Angabe die Anzahl der Dateien und Verzeichnisse an. Dies ist nützlich, wenn die Festplatte laut „df -i“ aufgrund der Inodes voll ist (viele kleine Cache- oder Sitzungsdateien); so lässt sich feststellen, in welchem Verzeichnis sich die meisten Dateien befinden. Mehr über Inodes erfahren Sie im Artikel „Was bedeutet ein Inode?“.

Änderungsdatum: –time

sudo du -h --time -d 1 /var/www/pelda.hu

Neben jeder Zeile wird das Datum der letzten Änderung der Datei im jeweiligen Verzeichnis angezeigt. So lässt sich erkennen, in welchen Ordner gerade etwas geschrieben wird (beispielsweise durch ein außer Kontrolle geratenes Log).

Interaktive Ansicht: ncdu

ncdu ist eine Variante des du-Menüs: Es durchläuft das Verzeichnis einmal vollständig, danach können Sie mit den Pfeiltasten darin navigieren, sortieren und mit der Taste „d“ auch löschen. Unter AlmaLinux befindet es sich im EPEL-Repository (siehe: Installation des EPEL-Repositorys unter AlmaLinux):

sudo dnf install ncdu
sudo ncdu /var/www/pelda.hu

ncdu 1.22 im Beispielverzeichnis: Die Größe der Ordner „backup“, „public_html“ und „logs“ wird in Bandbreite angegeben; unten wird die gesamte Festplattennutzung mit 505,0 MiB und die scheinbare Größe mit 2,5 GiB angezeigt.

Die unterste Zeile zeigt sowohl die tatsächliche Größe („Total disk usage“) als auch die scheinbare Größe („Apparent size“) an, ähnlich wie bei „du“ und „du --apparent-size“. Bei „ncdu“ ruft die Eingabe „?“ die Hilfe auf, „q“ beendet das Programm. Bei großen Verzeichnissen beschränkt der Schalter „-x“ auch hier die Anzeige auf ein Dateisystem („sudo ncdu -x /“).

Wenn „du“ einen geringeren Wert anzeigt als „df“

Wenn laut „df“ der Speicherplatz voll ist, die „du“-Angabe jedoch deutlich geringer ausfällt, hält wahrscheinlich ein laufendes Programm noch eine bereits gelöschte Datei offen; dies wird im Artikel „Der Speicherplatz ist voll, aber ‚du‘ zeigt nichts an“ beschrieben. Die Verwaltung großer Protokolldateien wird im Artikel „Suche nach großen error_log-Dateien“ behandelt.

Sollte auch nach der Bereinigung noch zu wenig Speicherplatz zur Verfügung stehen, können Sie zu einem KVM-VPS-Paket mit größerem Speicherplatz wechseln; bei cPanel-Hosting zeigt Ihnen der Artikel „Speicherplatznutzung in cPanel überprüfen“ an, wo Sie dies grafisch einsehen können.

Zurück: Linux-Artikel (62)