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 du
Befehl beobachten: Wenn Ihr Dateisystem eine Blockgröße von 4 KB hat, du
wird 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 -l
oder 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 du
die Summe der Größen der von der Datei verwendeten Blöcke oder Bereiche.
Die von gemeldete Größe ist du
mö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 du
unterscheidet sich die Summe von der Summe der Dateigrößen?
Wie wir oben gesehen haben, ist die Größe, die von du
jeder 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 -l
Größen in Byte, aber du
Größen in KiB oder in 512-Byte-Einheiten (Sektoren) auf einigen traditionelleren Systemen aufgelistet werden (dies du -k
erzwingt die Verwendung von Kilobyte). Die meisten modernen Unices unterstützen ls -lh
und du -h
verwenden „lesbare“ Zahlen mit K, M, G usw. (für KiB, MiB, GiB).
Wenn Sie du
ein 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/directory
wird die Größe des Verzeichnisses aufgelistet. (Beachten Sie, dass die Zeile „total NNN“ am oberen Rand der Ausgabe von ls -l
eine 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 du
auch Punktedateien enthalten sind, die nur ls
angezeigt werden, wenn Sie die Option -A
oder verwenden -a
.
Meldet manchmal du
weniger als die erwartete Summe. Dies geschieht, wenn der Verzeichnisbaum feste Verknüpfungen enthält : du
Jede Datei wird nur einmal gezählt.
Meldet auf einigen Dateisystemen wie ZFS
unter Linux du
nicht den vollen Speicherplatz, der von erweiterten Attributen einer Datei belegt wird.
Beachten Sie, dass, wenn sich unter einem Verzeichnis Bereitstellungspunkte befinden, du
auch alle Dateien auf diesen Bereitstellungspunkten gezählt werden, sofern diese -x
Option 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 du
nicht 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 -m
oder lsof
ein 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
loop
Geräts ist. losetup -a
(as root
) kann Ihnen sagen, welche loop
Gerä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 df
genau?
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. /home
ist 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 -l
auf 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 /home
Dateisystem und exportiert/home/bob
), df
spiegelt 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, df
berü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 -l
die 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 lsblk
einen 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
, pvs
für LVM , fdisk
für traditionellen PC-Stil ( „MBR“) Partitionen (sowie GPT auf neuere Systeme), gdisk
für GPT - Partitionen, disklabel
für BSD - Disklabels, Parted , usw. Unter Linux cat /proc/partitions
gibt 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.
tune2fs
erfordert 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.