Warum gibt es so viele verschiedene Möglichkeiten, die Datenträgernutzung zu messen?

114

Wenn ich die Größe meiner Dateien zusammenfasse, erhalte ich eine Zahl. Wenn ich renne du, bekomme ich eine andere Figur. Wenn ich dualle Dateien auf meiner Partition ausführe , stimmen die verwendeten dfAnsprüche nicht überein . Warum gibt es so viele verschiedene Zahlen für die Gesamtgröße meiner Dateien? Können Computer nicht hinzufügen?

Apropos Hinzufügen: Wenn ich die Spalten "Verwendet" und "Verfügbar" von hinzufüge df, erhalte ich nicht die Gesamtzahl. Und diese Gesamtzahl ist kleiner als die Größe meiner Partition. Und wenn ich meine Partitionsgrößen addiere, erhalte ich meine Festplattengröße nicht! Was gibt?

Gilles
quelle

Antworten:

144

Das Aufsummieren von Zahlen ist einfach. Das Problem ist, dass viele verschiedene Nummern hinzugefügt werden müssen.

Wie viel Speicherplatz belegt eine Datei?

Die Grundidee ist, dass eine Datei mit n Bytes n Bytes Festplattenspeicher benötigt, plus ein Bit für einige Steuerinformationen: die Metadaten der Datei (Berechtigungen, Zeitstempel usw.) und ein bisschen Overhead für die Informationen, die das System benötigt Finden Sie, wo die Datei gespeichert ist. Es gibt jedoch viele Komplikationen.

Mikroskopische Komplikationen

Stellen Sie sich jede Datei als eine Reihe von Büchern in einer Bibliothek vor. Kleinere Dateien machen nur einen Datenträger aus, aber größere Dateien bestehen aus vielen Datenträgern, wie z. B. einer Enzyklopädie. Um die Dateien lokalisieren zu können, gibt es einen Kartenkatalog, der auf jeden Datenträger verweist. Jedes Volume hat aufgrund der Cover einen gewissen Overhead. Wenn eine Datei sehr klein ist, ist dieser Overhead relativ groß. Auch der Kartenkatalog selbst nimmt etwas Platz ein.

Technisch gesehen ist der Speicherplatz in einem typischen einfachen Dateisystem in Blöcke unterteilt . Eine typische Blockgröße ist 4 KB. Jede Datei belegt eine ganzzahlige Anzahl von Blöcken. Sofern die Dateigröße nicht ein Vielfaches der Blockgröße ist, wird der letzte Block nur teilweise verwendet. Eine 1-Byte-Datei und eine 4096-Byte-Datei nehmen also jeweils 1 Block ein, während eine 4097-Byte-Datei zwei Blöcke einnimmt. Sie können dies mit dem duBefehl beobachten: Wenn Ihr Dateisystem eine Blockgröße von 4 KB hat, duwird 4 KB für eine 1-Byte-Datei gemeldet.

Wenn eine Datei groß ist, werden zusätzliche Blöcke benötigt, um nur die Liste der Blöcke zu speichern, aus denen die Datei besteht (dies sind indirekte Blöcke ; komplexere Dateisysteme können dies in Form von Ausdehnungen optimieren ). Diese werden nicht in der Dateigröße angezeigt, die von ls -loder GNU gemeldet wurde du --apparent-size. du, die die Datenträgernutzung im Gegensatz zur Größe angibt, berücksichtigt diese.

Einige Dateisysteme versuchen, den im letzten Block verbleibenden freien Speicherplatz wieder zu verwenden , um mehrere Dateischwänze im selben Block zu packen . Einige Dateisysteme (wie ext4 seit Linux 3.8) verwenden 0-Blöcke für kleine Dateien (nur wenige Bytes), die vollständig in den Inode passen.

Makroskopische Komplikationen

Wie oben dargestellt, ist die von angegebene Gesamtgröße im Allgemeinen dudie Summe der Größen der von der Datei verwendeten Blöcke oder Bereiche.

Die von gemeldete Größe ist dumöglicherweise kleiner, wenn die Datei komprimiert ist. Unix-Systeme unterstützen traditionell eine grobe Form der Komprimierung: Wenn ein Dateiblock nur Null-Bytes enthält, kann das Dateisystem diesen Block weglassen, anstatt einen Block von Nullen zu speichern. Eine Datei mit so ausgelassenen Blöcken wird als Sparse-Datei bezeichnet . 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 dünn wird.

Einige Dateisysteme wie btrfs und zfs unterstützen die allgemeine Komprimierung .

Fortgeschrittene Komplikationen

Zwei Hauptmerkmale sehr moderner Dateisysteme wie zfs und btrfs sorgen dafür, dass die Beziehung zwischen Dateigröße und Datenträgernutzung wesentlich weiter auseinander liegt: Snapshots und Deduplizierung.

Snapshots sind ein eingefrorener Zustand des Dateisystems zu einem bestimmten Zeitpunkt. Dateisysteme, die diese Funktion unterstützen, können mehrere Schnappschüsse enthalten, die zu unterschiedlichen Zeitpunkten erstellt wurden. Diese Schnappschüsse nehmen natürlich Platz ein. Wenn Sie im Extremfall alle Dateien aus der aktiven Version des Dateisystems löschen, wird das Dateisystem nicht leer, wenn noch Snapshots vorhanden sind.

Alle Dateien oder Blöcke, die sich seit der Erstellung eines Schnappschusses oder zwischen zwei Schnappschüssen nicht geändert haben, sind im Schnappschuss und in der aktiven Version oder in einem anderen Schnappschuss identisch vorhanden. Dies erfolgt über Copy-on-Write . In einigen Randfällen ist es möglich, dass das Löschen einer Datei auf einem vollständigen Dateisystem fehlschlägt, da nicht genügend Speicherplatz zur Verfügung steht. Zum Entfernen dieser Datei muss eine Kopie eines Blocks im Verzeichnis erstellt werden, und für diesen einen Block ist kein Platz mehr vorhanden.

Die Deduplizierung ist eine Speicheroptimierungstechnik, bei der das Speichern identischer Blöcke vermieden wird. Bei typischen Daten lohnt sich die Suche nach Duplikaten nicht immer. Sowohl zfs als auch btrfs unterstützen optional die Deduplizierung.

Warum duunterscheidet sich die Summe von der Summe der Dateigrößen?

Wie wir oben gesehen haben, ist die Größe, die von dujeder Datei gemeldet wird, normalerweise die Summe der Größen der Blöcke oder Bereiche, die von der Datei verwendet werden. Beachten Sie, dass standardmäßig ls -lGrößen in Byte, aber duGrößen in KiB oder in 512-Byte-Einheiten (Sektoren) auf einigen traditionelleren Systemen aufgelistet werden (dies du -kerzwingt die Verwendung von Kilobyte). Die meisten modernen Unices unterstützen ls -lhund du -hverwenden „lesbare“ Zahlen mit K, M, G usw. (für KiB, MiB, GiB).

Wenn Sie duein Verzeichnis ausführen , wird die Festplattenbelegung aller Dateien in der Verzeichnisstruktur einschließlich der Verzeichnisse selbst zusammengefasst. Ein Verzeichnis enthält Daten (die Namen der Dateien und einen Zeiger auf die Metadaten der Datei), sodass ein wenig Speicherplatz benötigt wird. Ein kleines Verzeichnis nimmt einen Block ein, ein größeres Verzeichnis benötigt mehr Blöcke. Die Menge des von einem Verzeichnis verwendeten Speichers hängt manchmal nicht nur von den darin enthaltenen Dateien ab, sondern auch von der Reihenfolge, in der sie eingefügt wurden und in der einige Dateien entfernt wurden (bei einigen Dateisystemen kann dies zu Lücken führen - ein Kompromiss zwischen Speicherplatz und Leistung ), aber der Unterschied wird winzig sein (ein zusätzlicher Block hier und da). Wenn du rennstls -ld /some/directorywird die Größe des Verzeichnisses aufgelistet. (Beachten Sie, dass die Zeile „total NNN“ am oberen Rand der Ausgabe von ls -leine unabhängige Zahl ist. Dies ist die Summe der Größen in Blöcken der aufgelisteten Elemente, ausgedrückt in KB oder Sektoren.)

Beachten Sie, dass duauch Punktedateien enthalten sind, die nur lsangezeigt werden, wenn Sie die Option -Aoder verwenden -a.

Meldet manchmal duweniger als die erwartete Summe. Dies geschieht, wenn der Verzeichnisbaum feste Verknüpfungen enthält : duJede Datei wird nur einmal gezählt.

Meldet auf einigen Dateisystemen wie ZFSunter Linux dunicht den vollen Speicherplatz, der von erweiterten Attributen einer Datei belegt wird.

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

Wenn ein Dateisystem in ein nicht leeres Verzeichnis eingebunden ist , werden die Dateien in diesem Verzeichnis vom eingebundenen Dateisystem ausgeblendet. Sie nehmen immer noch ihren Platz ein, werden sie aber dunicht finden.

Gelöschte Dateien

Wenn eine Datei gelöscht wird , wird nur der Verzeichniseintrag entfernt, nicht unbedingt die Datei selbst. Zwei Bedingungen sind erforderlich, um eine Datei tatsächlich zu löschen und damit ihren Speicherplatz freizugeben:

  • Die Anzahl der Verknüpfungen der Datei muss auf 0 fallen: Wenn eine Datei mehrere feste Verknüpfungen enthält, wirkt sich das Entfernen einer davon 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 die Datei gelöscht. Die Ausgabe fuser -moder lsofein Mount-Punkt enthält die Prozesse, bei denen eine Datei in diesem Dateisystem geöffnet ist, auch wenn die Datei gelöscht wurde.
  • Selbst wenn kein Prozess die gelöschte Datei geöffnet hat, wird der Speicherplatz der Datei möglicherweise nicht freigegeben, wenn diese Datei das Backend eines loopGeräts ist. losetup -a(as root) kann Ihnen sagen, welche loopGeräte gerade eingerichtet sind und in welcher Datei. Das Loop-Gerät muss zerstört werden (mit losetup -d), bevor der Speicherplatz freigegeben werden kann.

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

Woher stammen diese Zahlen dfgenau?

Ein typisches Dateisystem enthält:

  • Blöcke, die Datei- (einschließlich Verzeichnis-) Daten und einige Metadaten enthalten (einschließlich indirekter Blöcke und erweiterter Attribute in einigen Dateisystemen).
  • Freie Blöcke.
  • Blöcke, die dem Rootbenutzer vorbehalten sind.
  • Superblocks und andere Steuerinformationen.
  • Inodes
  • Eine Zeitschrift

Nur die erste Art wird von gemeldet du. Wenn es darum geht df, was in die „gebrauchten“ geht, „verfügbar“ und insgesamt Spalten hängt von dem Dateisystem (natürlich Blöcke verwendet (einschließlich indirekten) sind immer in der „gebrauchten“ Spalte und nicht verwendete Blöcke sind immer in den „ verfügbar ”-Spalte).

Dateisysteme in ext2 / ext3 / ext4 reservieren 5% des Speicherplatzes für den Root-Benutzer. Dies ist nützlich für das Root-Dateisystem, um das System am Laufen zu halten, wenn es voll ist (insbesondere für die Protokollierung, und um den Systemadministrator ein wenig Daten speichern zu lassen, während das Problem behoben wird). Selbst für Datenpartitionen wie z. B. /homeist es nützlich, den reservierten Speicherplatz beizubehalten, da ein fast volles Dateisystem für Fragmentierung anfällig ist. Linux versucht, eine Fragmentierung (die den Dateizugriff verlangsamt, insbesondere bei rotierenden mechanischen Geräten wie Festplatten) zu vermeiden, indem beim Schreiben einer Datei viele aufeinanderfolgende Blöcke vorab zugewiesen werden. Wenn jedoch nicht viele aufeinanderfolgende Blöcke vorhanden sind, kann dies nicht funktionieren .

Herkömmliche Dateisysteme bis einschließlich ext4, jedoch nicht btrfs, reservieren beim Erstellen des Dateisystems eine feste Anzahl von Inodes . Dies vereinfacht das Design des Dateisystems erheblich, hat jedoch den Nachteil, dass die Anzahl der Inodes richtig bemessen werden muss: Bei zu vielen Inodes wird Speicherplatz verschwendet. Bei zu wenigen Inodes können dem Dateisystem die Inodes ausgehen, bevor der Speicherplatz knapp wird. Der Befehl gibt an df -i, wie viele Inodes verwendet werden und wie viele verfügbar sind (Dateisysteme, bei denen das Konzept nicht anwendbar ist, können 0 melden).

Das Ausführen tune2fs -lauf einem Volume mit einem ext2 / ext3 / ext4-Dateisystem meldet einige Statistiken, einschließlich der Gesamtzahl und Anzahl der freien Inodes und Blöcke.

Ein weiteres Merkmal , das die Materie verwirren kann Subvolumes (in unterstützt Btrfs und in zfs unter dem Namen Datensätze ). Mehrere Subvolumes teilen sich den gleichen Speicherplatz, haben jedoch separate Verzeichnisbaumstämme.

Wenn ein Dateisystem über das Netzwerk eingehängt ist (NFS, Samba usw.) und der Server einen Teil dieses Dateisystems exportiert (z. B. der Server hat ein /homeDateisystem und exportiert/home/bob ), dfspiegelt ein Client die Daten für das gesamte Dateisystem wider, nicht Nur für das Teil, das exportiert und auf dem Client montiert wird.

Was verbraucht der Speicherplatz auf meiner Festplatte?

Wie wir oben gesehen haben, dfberücksichtigt die von gemeldete Gesamtgröße nicht immer alle Steuerdaten des Dateisystems. Verwenden Sie dateisystemspezifische Tools, um bei Bedarf die genaue Größe des Dateisystems zu ermitteln. Führen Sie zum Beispiel mit 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 umschließenden Partition oder dem umschließenden Volume aus. Manchmal kann es vorkommen, dass Sie ein kleineres Dateisystem haben, wenn Sie Dateisysteme verschoben oder die Größe von Volumes geändert haben.

Bietet unter Linux lsblkeinen schönen Überblick über die verfügbaren Speichervolumina. Wenn Sie zusätzliche Informationen benötigen oder keine haben lsblk, können Sie mithilfe spezieller Volumeverwaltungs- oder Partitionierungstools überprüfen, über welche Partitionen Sie verfügen. Unter Linux gibt es ist lvs, vgs, pvsfür LVM , fdiskfür traditionellen PC-Stil ( „MBR“) Partitionen (sowie GPT auf neuere Systeme), gdiskfür GPT - Partitionen, disklabelfür BSD - Disklabels, Parted , 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 ein Swap- Volume.

Einige Computer verfügen über eine Partition, die das BIOS oder eine andere Diagnosesoftware enthält. Computer mit UEFI verfügen über eine dedizierte Bootloader-Partition.

Beachten Sie schließlich, 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 werden diese Einheiten als Kibibyte KiB, Mebibyte MiB usw. bezeichnet, aber die meisten Programme melden nur k oder kB. M oder MB usw. Auf der anderen Seite verwenden Festplattenhersteller systematisch metrische Einheiten (1000-Einheiten). Damit ist 1 TB Laufwerk nur 931 GiB oder 0,904 TiB.

Gilles
quelle
1
@Kiwy tune2fserfordert Lesezugriff auf das Blockgerät, auf dem sich das Dateisystem befindet. Dies erfordert im Allgemeinen, dass Sie als Root angemeldet sind, damit Sie den Inhalt einer beliebigen Datei lesen können.
Gilles
21
Ich weiß, dass "Danke" in SE nicht empfohlen wird, aber Gilles, Sie verdienen ein großes "Danke" für diesen großartigen Beitrag.
Dotancohen
1
Ich erinnere mich, einen Kartenkatalog gesehen zu haben, als ich 6 Jahre alt war. Ich frage mich, wie viele nicht wissen, was sie sind.
Izkata
1
@ illuminÉ Das ist für mich Solaris zu weit fortgeschritten, ich weiß nicht, auf welche Ebene es passt.
Gilles
1
du tut Konto für indirekte Blöcke. Das ist der Hauptunterschied zur Dateigröße, wie von gemeldet ls -l.
Stéphane Chazelas
4

Eine kurze Zusammenfassung der Komplikationen bei der Berechnung der Dateigröße und des Speicherplatzes:

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

    Es kann jedoch nur 1 zusätzlicher Verzeichniseintrag erforderlich sein, wenn die Datei eine feste Verknüpfung zu einer anderen Datei ist. Es wäre nur ein weiterer Verweis auf denselben Satz von Blöcken.

  • Die Größe des Inhalts der Datei. Dies ist, was lsangezeigt wird.
  • Freier Speicherplatz entspricht nicht der Größe der größten Datei, die Sie aufnehmen können, oder der Summe aller Dateigrößen, die auf die Festplatte passen. Es liegt irgendwo dazwischen. Es hängt von der Anzahl der Dateien (die Inodes aufnehmen), der Blockgröße und davon ab, wie stark der Inhalt jeder Datei die Blöcke vollständig ausfüllt.

Dies zerkratzt nur die Oberfläche von Dateisystemen und wird zu stark vereinfacht. Denken Sie auch daran, dass verschiedene Dateisysteme unterschiedlich funktionieren.

statist sehr hilfreich beim Erkennen einiger dieser Informationen. Hier sind einige Beispiele für die Verwendung von stat und deren Zweck : http://landoflinux.com/linux_stat_command_examples.html

Pedro
quelle
1
Eine 1-Byte-Datei benötigt in der Regel einen Block, nicht 8. Durch das Erstellen eines festen Links wird überhaupt kein Inode erstellt: Eine Datei ist ein Inode, unabhängig davon, wie viele Links zu der Datei vorhanden sind. Das Erstellen eines festen Links erfordert nur Platz für den Verzeichniseintrag.
Gilles
Vielen Dank für die Korrekturen, zugegebenermaßen ist meine Erinnerung an ext2 ein wenig verschwommen. Ich verfolgte die Ausgabe von stat re: the block count - es fühlte sich übertrieben an, aber genau das ist es. Ich werde die Antwort korrigieren.
Pedro
1
Das liegt daran, dass 1 ext2-Block = 8 stat-Blöcke ist, wenn das ext2-Dateisystem 4-KB-Blöcke verwendet: stat wird aus historischen Gründen in 512-Byte-Blöcken gezählt. Siehe unix.stackexchange.com/questions/14409/…
Gilles
3

Ich werde hier verschiedene Fälle veranschaulichen, von denen die Ursachen duverschieden sind df.

dfZählt die vom 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 der Anwendung geöffnet sind. Die Dateiinformationen fehlen, die Bausteine ​​sind noch vergeben. lsof +aL1 <filesystem>will hilft Ihnen, die Prozesse zu identifizieren. Die meiste Zeit müssen Sie die Prozesse beenden, um Speicherplatz freizugeben (dies hängt vom Prozess ab, manchmal ist ein erneutes Laden der Konfiguration ausreichend).

2) Dateien unter Einhängepunkten, die für, duaber nicht für, ausgeblendet sind df. debugfskann Ihnen helfen, das Dateisystem zu lesen.

$ 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-Dateien , die größer als die Realität aussehen. Nicht zugewiesene Blöcke werden nicht mitgezählt, dfaber die scheinbare Dateigröße wird mitgezählt du.

Beachten Sie, dass harte Links keine Narren sind du

Emmanuel
quelle
3

dfwird im Allgemeinen verwendet, um festzustellen, welche Dateisysteme vorhanden sind, wie voll die einzelnen sind und wo sie eingehängt sind. Sehr nützlich, wenn in einem Dateisystem nicht genügend Speicherplatz zur Verfügung steht und Sie möglicherweise Dinge zwischen den Dateisystemen verschieben oder eine größere Festplatte kaufen möchten.

duZeigt Details darüber an, wie viel kumulativen Speicher die einzelnen Verzeichnisse verbrauchen (ähnlich wie windirstatin Windows). Hervorragend geeignet, um herauszufinden, wo Sie beim Bereinigen von Dateien Speicherplatz beanspruchen.

Abgesehen von kleinen numerischen Unterschieden, die von anderen erklärt wurden, dienen die Hilfsprogramme duund meiner Meinung nach dfsehr unterschiedlichen Zwecken.

Jim Robertson
quelle