Warum gibt es so viele verschiedene Möglichkeiten, die Festplattennutzung zu messen?

Warum gibt es so viele verschiedene Möglichkeiten, die Festplattennutzung zu messen?

Wenn ich die Größen meiner Dateien zusammenzähle, erhalte ich eine Zahl. Wenn ich ausführe du, erhalte ich eine andere Zahl. Wenn ich dualle Dateien auf meiner Partition ausführe, stimmt das nicht mit den dfverwendeten Angaben überein. Warum gibt es so viele verschiedene Zahlen für die Gesamtgröße meiner Dateien? Können Computer nicht addieren?

Apropos Addieren: Wenn ich die Spalten „Verwendet“ und „Verfügbar“ addiere df, erhalte ich nicht die Gesamtsumme. Und diese Gesamtsumme ist kleiner als die Größe meiner Partition. Und wenn ich meine Partitionsgrößen addiere, erhalte ich nicht die Größe meiner Festplatte! Was ist da los?

Antwort1

Das Addieren von Zahlen ist einfach. Das Problem besteht darin, dass viele unterschiedliche Zahlen addiert werden müssen.

Wie viel Speicherplatz belegt eine Datei?

Die Grundidee besteht darin, dass eine Datei mitNBytes verwendetNBytes an Festplattenspeicher, plus ein bisschen für einige Kontrollinformationen: die Metadaten der Datei (Berechtigungen, Zeitstempel usw.) und ein bisschen Overhead für die Informationen, die das System braucht, um herauszufinden, wo die Datei gespeichert ist. Allerdings gibt es viele Komplikationen.

Mikroskopische Komplikationen

Stellen Sie sich jede Datei als eine Reihe von Büchern in einer Bibliothek vor. Kleinere Dateien bilden nur einen Band, aber größere Dateien bestehen aus mehreren Bänden, wie eine Enzyklopädie. Um die Dateien finden zu können, gibt es einen Kartenkatalog, der auf jeden Band verweist. Jeder Band hat aufgrund der Umschläge einen gewissen Mehraufwand. Wenn eine Datei sehr klein ist, ist dieser Mehraufwand relativ groß. Auch der Kartenkatalog selbst nimmt etwas Platz ein.

Um es etwas technischer auszudrücken: In einem typischen einfachen Dateisystem ist der Speicherplatz aufgeteilt inBlöcke. Eine typische Blockgröße beträgt 4 KiB. Jede Datei nimmt eine ganzzahlige Anzahl von Blöcken ein. Sofern die Dateigröße kein Vielfaches der Blockgröße ist, wird der letzte Block nur teilweise verwendet. Eine 1-Byte-Datei und eine 4096-Byte-Datei nehmen also beide 1 Block ein, während eine 4097-Byte-Datei zwei Blöcke einnimmt. Sie können dies mit lsoder beobachten du: Wenn Ihr Dateisystem eine Blockgröße von 4 KiB hat, dann melden ls -sund 4 KiB für eine 1-Byte-Datei.du

Wenn eine Datei groß ist, werden zusätzliche Blöcke benötigt, um die Liste der Blöcke zu speichern, aus denen die Datei besteht (dies sindindirekte Blöcke; anspruchsvollere Dateisysteme können dies optimieren in Form vonAusmaßels -l). Diese werden in der von oder GNU gemeldeten Dateigröße nicht angezeigt du --apparent-size. duund ls -s, die die Festplattennutzung statt der Größe melden, berücksichtigen diese.

Einige Dateisysteme versuchen, den freien Speicherplatz im letzten Block wiederzuverwenden, ummehrere Aktenenden in einem Block verpacken. Einige Dateisysteme (wieext4 seit Linux 3.8Verwenden Sie 0 Blöcke für kleine Dateien (nur wenige Bytes), die vollständig in den Inode passen.

Makroskopische Komplikationen

Im Allgemeinen ist, wie oben gezeigt, die gemeldete Gesamtgröße dudie Summe der Größen der von der Datei verwendeten Blöcke oder Bereiche.

Die von gemeldete Größe dukann kleiner sein, wenn die Datei komprimiert ist. Unix-Systeme unterstützen traditionell eine grobe Form der Komprimierung: Wenn ein Dateiblock nur Nullbytes enthält, kann das Dateisystem diesen Block ganz weglassen, anstatt einen Block mit Nullen zu speichern. Eine Datei mit weggelassenen Blöcken wie diesen nennt manSparse-Datei. Sparse-Dateien werden nicht automatisch erstellt, wenn eine Datei eine große Reihe von Null-Bytes enthält. Die Anwendung muss dafür sorgen, dass die Datei Sparse-Dateien erhält.

Einige Dateisysteme wiebtrfsUndzfsUnterstützung für allgemeine ZweckeKompression.

Fortgeschrittene Komplikationen

Zwei Hauptfunktionen hochmoderner Dateisysteme wie zfs und btrfs lassen die Beziehung zwischen Dateigröße und Festplattennutzung deutlich distanzierter erscheinen: Snapshots und Deduplizierung.

Schnappschüssesind ein eingefrorener Zustand des Dateisystems zu einem bestimmten Datum. Dateisysteme, die diese Funktion unterstützen, können mehrere Snapshots enthalten, die an verschiedenen Daten erstellt wurden. Diese Snapshots beanspruchen natürlich Platz. Im Extremfall wird das Dateisystem nicht leer, wenn Sie alle Dateien aus der aktiven Version des Dateisystems löschen, sofern noch Snapshots vorhanden sind.

Jede Datei oder jeder Block, der sich seit der Erstellung eines Snapshots oder zwischen zwei Snapshots nicht geändert hat, ist im Snapshot und in der aktiven Version oder einem anderen Snapshot identisch vorhanden. Dies wird implementiert durchKopieren beim Schreiben. In einigen Grenzfällen ist es möglich, dass das Löschen einer Datei in einem vollen Dateisystem aufgrund von nicht ausreichend verfügbarem Speicherplatz fehlschlägt – weil zum Entfernen der Datei eine Kopie eines Blocks im Verzeichnis erstellt werden müsste und selbst für diesen einen Block kein Platz mehr vorhanden ist.

Deduplizierungist eine Speicheroptimierungstechnik, die darauf abzielt, die Speicherung identischer Blöcke zu vermeiden. Bei typischen Daten lohnt sich die Suche nach Duplikaten nicht immer. BeidezfsUndbtrfsunterstützt Deduplizierung als optionale Funktion.

Warum duweicht die Gesamtgröße von der Summe der Dateigrößen ab?

Wie wir oben gesehen haben, duist die von für jede Datei gemeldete Größe normalerweise die Summe der Größen der von der Datei verwendeten Blöcke oder Bereiche. Beachten Sie, dass ls -lGrößen standardmäßig in Bytes aufgelistet werden, aber duauf einigen traditionelleren Systemen in KiB oder in 512-Byte-Einheiten (Sektoren) ( du -kerzwingt die Verwendung von Kilobyte). Die meisten modernen Unix-Systeme unterstützen dies ls -lhund du -hdie Verwendung von „menschenlesbaren“ Zahlen mit K, M, G usw. (für KiB, MiB, GiB) reicht je nach Bedarf aus.

Wenn Sie es duin einem Verzeichnis ausführen, wird die Festplattennutzung aller Dateien im Verzeichnisbaum zusammengefasst.einschließlich der Verzeichnisseselbst. Ein Verzeichnis enthält Daten (die Namen der Dateien und einen Zeiger, wo die Metadaten der Datei sind), also braucht es ein bisschen Speicherplatz. Ein kleines Verzeichnis belegt einen Block, ein größeres Verzeichnis benötigt mehr Blöcke. Die Menge an Speicherplatz, die ein Verzeichnis nutzt, hängt manchmal nicht nur von den darin enthaltenen Dateien ab, sondern auch von der Reihenfolge, in der sie eingefügt und einige Dateien entfernt wurden (bei manchen Dateisystemen kann dies Lücken hinterlassen – ein Kompromiss zwischen Speicherplatz und Leistung), aber der Unterschied ist gering (ein zusätzlicher Block hier und da). Wenn Sie ausführen ls -ld /some/directory, wird die Größe des Verzeichnisses aufgelistet. (Beachten Sie, dass die Zeile „total NNN“ oben in der Ausgabe von ls -leine unabhängige Zahl ist, sondern die Summe der Größen in Blöcken der aufgelisteten Elemente, ausgedrückt in KiB oder Sektoren.)

Bedenken Sie, dass dubeinhaltetPunktdateienwelches lsnicht angezeigt wird, sofern Sie nicht die Option -Aoder verwenden -a.

Manchmal duwerden weniger als die erwartete Summe gemeldet. Dies geschieht, wennHardlinksinnerhalb des Verzeichnisbaums: duzählt jede Datei nur einmal. Mit du -ldem Schalter können Sie die Dateien zählenNmal, wenn sie habenNharte Links.

Auf einigen Dateisystemen, z. B. ZFSunter Linux, duwird nicht der gesamte Speicherplatz gemeldet, der durch erweiterte Attribute einer Datei belegt wird.

Beachten Sie, dass, wenn sich unter einem Verzeichnis Einhängepunkte befinden, duauch alle Dateien an diesen Einhängepunkten gezählt werden, sofern diese -xOption nicht angegeben ist. Wenn Sie also beispielsweise die Gesamtgröße der Dateien in Ihrem Root-Dateisystem wissen möchten, führen Sie aus du -x /, nicht du /.

Wenn ein Dateisystem in einem nicht leeren Verzeichnis gemountet ist, die Dateien in diesem Verzeichnis werden vom gemounteten Dateisystem ausgeblendet. Sie belegen noch immer den Speicherplatz, werden aber dunicht gefunden.

Gelöschte Dateien

Wenn eine Dateigelöscht, dadurch wird nur der Verzeichniseintrag entfernt, nicht notwendigerweise die Datei selbst. Um eine Datei tatsächlich zu löschen und so ihren Speicherplatz freizugeben, sind zwei Bedingungen notwendig:

  • Die Linkanzahl der Datei muss auf 0 zurückgehen: Wenn eine Datei mehrere Hardlinks hat, wirkt sich das Entfernen eines Links nicht auf die anderen aus.
  • Solange die Datei von einem Prozess geöffnet ist, bleiben die Daten erhalten. Erst wenn alle Prozesse die Datei geschlossen haben, wird sie gelöscht. Die Ausgabefuser -moderlsofan einem Einhängepunkt umfasst die Prozesse, die eine Datei in diesem Dateisystem geöffnet haben, auch wenn die Datei gelöscht wird.
  • selbst wenn kein Prozess die gelöschte Datei geöffnet hat, kann der Speicherplatz der Datei möglicherweise nicht zurückgefordert werden, wenn diese Datei das Backend eines loopGeräts ist. losetup -a(als root) kann Ihnen sagen, welche loopGeräte derzeit eingerichtet sind und auf welcher Datei. Das Loop-Gerät muss zerstört werden (mit losetup -d), bevor der Speicherplatz zurückgefordert werden kann.

Wenn Sie in einigen Dateimanagern oder GUI-Umgebungen eine Datei löschen, wird sie möglicherweise in einen Papierkorb verschoben, wo sie wiederhergestellt werden kann. Solange die Datei wiederhergestellt werden kann, wird ihr Speicherplatz weiterhin belegt.

Woher stammen diese Zahlen dfgenau?

Ein typisches Dateisystem enthält:

  • Blöcke, die Dateidaten (einschließlich Verzeichnisse) und einige Metadaten (einschließlich indirekter Blöcke und erweiterter Attribute in einigen Dateisystemen) enthalten.
  • Freie Blöcke.
  • Blöcke, die für den Root-Benutzer reserviert sind.
  • Superblöcke und andere Steuerinformationen.
  • Inodes
  • ATagebuch

Nur die erste Art wird von gemeldet du. dfWas bei in die Spalten „verwendet“, „verfügbar“ und „Gesamt“ kommt, hängt vom Dateisystem ab (natürlich stehen verwendete Blöcke (einschließlich indirekter) immer in der Spalte „verwendet“ und ungenutzte Blöcke immer in der Spalte „verfügbar“).

Dateisysteme im ext2/ext3/ext4Reservieren5 % des Speicherplatzes für den Root-Benutzer. Dies ist beim Root-Dateisystem nützlich, um das System am Laufen zu halten, wenn es voll ist (insbesondere für die Protokollierung und um dem Systemadministrator die Möglichkeit zu geben, einige Daten zu speichern, während das Problem behoben wird). Sogar für Datenpartitionen wie ist es /homenützlich, diesen reservierten Speicherplatz beizubehalten, da ein fast volles Dateisystem anfällig für Fragmentierung ist. Linux versucht, Fragmentierung zu vermeiden (die den Dateizugriff verlangsamt, insbesondere bei rotierenden mechanischen Geräten wie Festplatten), indem beim Schreiben einer Datei viele aufeinanderfolgende Blöcke vorab reserviert werden. Wenn es jedoch nicht viele aufeinanderfolgende Blöcke gibt, kann dies nicht funktionieren.

Traditionelle Dateisysteme, bis einschließlich ext4, aber nicht btrfs, reservieren eine feste Anzahl vonInodeswenn das Dateisystem erstellt wird. Dies vereinfacht das Design des Dateisystems erheblich, hat aber den Nachteil, dass die Anzahl der Inodes richtig bemessen sein muss: Bei zu vielen Inodes wird Speicherplatz verschwendet; bei zu wenigen Inodes kann es sein, dass dem Dateisystem die Inodes ausgehen, bevor der Speicherplatz aufgebraucht ist. Der Befehl df -imeldet, wie viele Inodes verwendet werden und wie viele verfügbar sind (Dateisysteme, bei denen das Konzept nicht anwendbar ist, melden möglicherweise 0).

Beim Ausführen tune2fs -lauf dem Datenträger, der ein ext2/ext3/ext4-Dateisystem enthält, werden einige Statistiken gemeldet, darunter die Gesamtzahl und die Anzahl der freien Inodes und Blöcke.

Ein weiteres Merkmal, das die Materie verwirren kann, istTeilvolumes(unterstützt inbtrfsund in zfs unter dem NamenDatensätze). Mehrere Untervolumes teilen sich den gleichen Speicherplatz, haben aber unterschiedliche Verzeichnisbaumwurzeln.

Wenn ein Dateisystem über das Netzwerk (NFS, Samba usw.) gemountet ist und der Server einen Teil dieses Dateisystems exportiert (z. B.Der Server verfügt über ein /homeDateisystem und exportiert/home/bob), dfspiegelt dann auf einem Client die Daten für das gesamte Dateisystem wider, nicht nur für den Teil, der exportiert und auf dem Client gemountet wird.

Was belegt den Speicherplatz auf meiner Festplatte?

Wie wir oben gesehen haben, berücksichtigt die von gemeldete Gesamtgröße dfnicht immer alle Steuerdaten des Dateisystems. Verwenden Sie bei Bedarf dateisystemspezifische Tools, um die genaue Größe des Dateisystems zu ermitteln. Führen Sie beispielsweise bei ext2/ext3/ext4 tune2fs -ldie Blockgröße aus und multiplizieren Sie sie mit der Blockanzahl.

Wenn Sie ein Dateisystem erstellen, füllt es normalerweise den verfügbaren Speicherplatz auf der umgebenden Partition oder dem umgebenden Datenträger. Manchmal erhalten Sie am Ende ein kleineres Dateisystem, wenn Sie Dateisysteme verschoben oder die Größe von Datenträgern geändert haben.

Unter Linux lsblkbietet eine gute Übersicht über die verfügbaren Speichervolumes. Für weitere Informationen oder wenn Sie nicht über verfügen lsblk, verwenden Sie spezielle Tools zur Volumeverwaltung oder Partitionierung, um zu überprüfen, welche Partitionen Sie haben. Unter Linux gibt es lvs, vgs, pvsfürLVM,fdiskfür traditionelle PC-Partitionen („MBR“) (sowie GPT auf neueren Systemen),gdiskfürGPTTrennwände,disklabelfür BSD-Disklabels,Getrennt, usw. Unter Linux cat /proc/partitionsgibt eine kurze Zusammenfassung. Typische Installationen haben mindestens zwei Partitionen oder Volumes, die vom Betriebssystem verwendet werden: ein Dateisystem (manchmal mehr) und eintauschenVolumen.

Einige Computer haben eine Partition mit demBIOSoder andere Diagnosesoftware. Computer mitUEFIhaben Sie eine dedizierte Bootloader-Partition.

Beachten Sie abschließend, dass die meisten Computerprogramme Einheiten verwenden, die auf Potenzen von 1024 = 2 10 basieren (weil Programmierer Binärzahlen und Potenzen von 2 lieben). Also 1 kB = 1024 B, 1 MB = 1048576 B, 1 GB = 1073741824, 1 TB = 1099511627776 B, … Offiziell sind diese Einheiten bekannt alskibibyteKiB,MebibyteMiB usw., aber die meisten Programme melden nur k oder kB, M oder MB usw. Festplattenhersteller hingegen verwenden systematisch metrische Einheiten (1000-basierte Einheiten). Das 1-TB-Laufwerk ist also nur 931 GiB oder 0,904 TiB groß.

Antwort2

Eine kurze Zusammenfassung der Komplikationen bei der Berechnung von Dateigrößen und Speicherplatz:

  • Der Speicherplatz, den die Datei auf der Festplatte einnimmt, ist ein Multiplikator aus der Anzahl der Blöcke, die sie einnimmt, und der Größe jedes Blocks + der Anzahl der Inodes, die sie einnimmt. Eine 1 Byte lange Datei benötigt mindestens 1 Block, 1 Inode und einen Verzeichniseintrag.

    Es könnte jedoch nur ein zusätzlicher Verzeichniseintrag erforderlich sein, wenn die Datei ein Hardlink zu einer anderen Datei ist. Es wäre nur ein weiterer Verweis auf denselben Satz von Blöcken.

  • Die Größe des Dateiinhalts. Dies wird lsangezeigt.
  • Der freie Speicherplatz ist nicht die Größe der größten Datei, die Sie unterbringen können, oder die Summe aller Dateiinhaltsgrößen, die auf die Festplatte passen. Er liegt irgendwo dazwischen. Er hängt von der Anzahl der Dateien (die Inodes belegen), der Blockgröße und davon ab, wie sehr der Inhalt jeder Datei die Blöcke vollständig ausfüllt.

Dies ist nur ein oberflächlicher Einblick in Dateisysteme und eine übermäßige Vereinfachung. Denken Sie auch daran, dass verschiedene Dateisysteme unterschiedlich funktionieren.

statist sehr hilfreich, um einige dieser Informationen zu erkennen. Hier sind einige Beispiele, wie man stat verwendet und wofür es gut ist:http://landoflinux.com/linux_stat_command_examples.html

Antwort3

dfwird im Allgemeinen verwendet, um zu sehen, um welche Dateisysteme es sich handelt, wie voll jedes ist und wo sie eingebunden sind. Sehr nützlich, wenn Ihnen der Platz in einem Dateisystem ausgeht und Sie vielleicht Dinge zwischen den Dateisystemen verschieben oder eine größere Festplatte kaufen möchten usw.

duzeigt Details dazu an, wie viel Speicherplatz jedes einzelne Verzeichnis insgesamt verbraucht (ähnlich wie windirstatin Windows). Ideal, um herauszufinden, wo Sie beim Bereinigen von Dateien Speicherplatz verbrauchen.

Abgesehen von kleinen numerischen Unterschieden, die von anderen erklärt wurden, denke ich, dass die Dienstprogramme duund dfsehr unterschiedliche Zwecke erfüllen.

Antwort4

Ich werde hier verschiedene Fälle veranschaulichen, in denen die Ursachen duunterschiedlich sind df.

dfZählt die dem Dateisystem zugewiesenen Blöcke, duverwendet die Größeninformationen der einzelnen Dateien. Ein Unterschied kann viele Ursachen haben:

  1. Nicht verknüpfte (gelöschte) Dateien, die noch von einer Anwendung geöffnet sind. Die Dateiinformationen fehlen, der Block ist noch zugeordnet. lsof +aL1 <filesystem>hilft Ihnen, die Prozesse zu identifizieren. In den meisten Fällen müssen Sie die Prozesse beenden, um Speicherplatz freizugeben (das hängt vom Prozess ab, manchmal reicht ein Neuladen der Konfiguration aus).

  2. Dateien unter Einhängepunkten, die in , duaber nicht in , versteckt sind df, debugfskönnen Ihnen beim Lesen des Dateisystems helfen.

    $ sudo debugfs 
    debugfs 1.42.12 (29-Aug-2014)
    debugfs:  open /dev/xxx    (the desired file system  device)
    debugfs:  cd /boot
    debugfs:  ls -l 
     1966081   40755 (2)      0      0    4096 26-May-2016 16:28 .
           2   40555 (2)      0      0    4096 11-May-2016 10:43 ..
     1974291  100644 (1)      0      0       0 26-May-2016 16:28 bob   <---<<< /boot/bob is hidden by /boot fs
    
  3. Sparse-Dateiendas sieht größer aus als es in Wirklichkeit ist. Nicht zugewiesene Blöcke werden nicht mitgezählt, dfaber die scheinbare Dateigröße wird mit gezählt du.

Beachten Sie, dass Hardlinks nicht täuschen du.

verwandte Informationen