Ich habe eine virtualisierte Umgebung mit sehr hoher Dichte und Containern, daher versuche ich, jeden Container wirklich klein zu machen. "Wirklich klein" bedeutet 87 MB auf Basis Ubuntu 14.04 (Trusty Tahr), ohne die Paketmanager-Kompatibilität zu beeinträchtigen.
Daher verwende ich LVM als Hintergrundspeicher für meine Container und habe kürzlich sehr merkwürdige Zahlen gefunden. Hier sind sie.
Lassen Sie uns ein logisches Volumen von 100 MiB (yeah, Potenz von 2) erstellen.
sudo lvcreate -L100M -n test1 /dev/purgatory
Ich möchte die Größe überprüfen, also stelle ich aus sudo lvs --units k
test1 purgatory -wi-a---- 102400.00k
Süß, das sind wirklich 100 MiB.
Jetzt machen wir ein ext4- Dateisystem. Und natürlich erinnern wir uns an -m 0
Parameter, die Platzverschwendung verhindern.
sudo mkfs.ext4 -m 0 /dev/purgatory/test1
mke2fs 1.42.9 (4-Feb-2014)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
25688 inodes, 102400 blocks
0 blocks (0.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67371008
13 block groups
8192 blocks per group, 8192 fragments per group
1976 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729
Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
Süß und sauber. Beachten Sie die Blockgröße - unser logisches Volumen ist klein, daher hat mkfs.ext4 beschlossen, einen Block mit einer Größe von 1 KB zu erstellen, nicht die üblichen 4 KB.
Jetzt werden wir es montieren.
sudo mount /dev/purgatory/test1 /mnt/test1
Und rufen df
wir ohne Parameter auf (wir möchten 1 KiB-Blöcke sehen)
/dev/mapper/purgatory-test1 95054 1550 91456 2% /mnt/test1
Warten Sie, oh shi ~
Wir haben insgesamt 95054 Blöcke. Aber das Gerät selbst hat 102400 Blöcke von 1 KiB. Wir haben nur 92,8% unseres Speichers. Wo sind meine Blöcke, Mann?
Schauen wir es uns an einem echten Blockgerät an. A hat eine virtuelle 16-GiB-Festplatte mit 16777216 1-KB-Blöcken, aber nur 15396784 Blöcke sind in der df-Ausgabe enthalten. 91,7%, was ist das?
Nun folgt die Untersuchung (Spoiler: keine Ergebnisse)
Dateisystem konnte nicht am Anfang des Geräts beginnen. Das ist seltsam, aber möglich. Glücklicherweise hat ext4 magische Bytes, lassen Sie uns ihre Anwesenheit überprüfen.
sudo hexdump -C / dev / purgatory / test1 | grep "53 ef"
Dies zeigt Superblock:
00000430 a9 10 e7 54 01 00 ff ff 53 ef 01 00 01 00 00 00 |...T....S.......|
Hex 430 = Dez 1072, also irgendwo nach dem ersten Kilobyte. Sieht vernünftig aus, ext4 überspringt die ersten 1024 Bytes für Merkwürdigkeiten wie VBR usw.
- Das ist Zeitschrift!
Nein ist es nicht. Journal nimmt Platz aus Verfügbar, wenn df ausgegeben wird.
- Oh, wir haben dump2fs und könnten die Größen dort überprüfen!
... viele Greps ...
sudo dumpe2fs /dev/purgatory/test1 | grep "Free blocks"
Autsch.
Free blocks: 93504
Free blocks: 3510-8192
Free blocks: 8451-16384
Free blocks: 16385-24576
Free blocks: 24835-32768
Free blocks: 32769-40960
Free blocks: 41219-49152
Free blocks: 53249-57344
Free blocks: 57603-65536
Free blocks: 65537-73728
Free blocks: 73987-81920
Free blocks: 81921-90112
Free blocks: 90113-98304
Free blocks: 98305-102399
Und wir haben eine andere Nummer. 93504 freie Blöcke.
Die Frage ist: Was ist los?
- Gerät blockieren: 102400k (lvs sagt)
- Dateisystemgröße: 95054k (df sagt)
- Freie Blöcke: 93504k (dumpe2fs sagt)
- Verfügbare Größe: 91456k (df sagt)
ext2
für kleine Partitionen.ext2
sieht hier vernünftig aus, sicherAntworten:
Versuche dies:
mkfs.ext4 -N 104 -m0 -O ^has_journal,^resize_inode /dev/purgatory/test1
Ich denke, das lässt Sie verstehen, "was los ist".
-N 104
(Legen Sie die Anzahl der iNodes fest, die Ihr Dateisystem haben soll.)-m 0
(keine reservierten Blöcke)-O ^has_journal,^resize_inode
(Deaktivieren Sie die Funktionenhas_journal
undresize_inode
resize_inode
"kostet" freien Speicherplatz (die meisten der 1550 1K-Blöcke / 2%, die Sie in Ihremdf
- 12K sehen, werden für den Ordner "lost + found" verwendet)has_journal
Nutzfläche "kostet" (4096 1K-Blöcke in Ihrem Fall)Wir
102348
raus102400
, weitere 52 Blöcke unbrauchbar (wenn wir den Ordner "lost + found" gelöscht haben). Deshalb tauchen wir ein indumpe2fs
:und zähle die verwendeten Blöcke (für Backup-Superblock, Gruppendeskriptoren, Block-Bitmap, Inode-Bitmap und Inode-Tabelle) oder wir
grep
und zähle:das gibt uns die Anzahl der Zeilen, die einen einzelnen Block haben (in unserem Beispiel) und
Das gibt uns die Anzahl der Zeilen, die zwei Blöcke haben (in unserem Beispiel).
Wir haben also (in unserem Beispiel)
13
Zeilen mit jeweils einem Block und19
Zeilen mit jeweils zwei Blöcken.Das gibt uns
51
Blöcke, die von ext4 selbst verwendet werden. Schließlich ist nur noch ein Block übrig. Der Block 0, der die übersprungenen1024
Bytes am Anfang für Dinge wie den Bootsektor sind.quelle
df
bei fs mit journal: 95054k -df
bei fs ohne jorunal 99150k - und mische nicht "nutzbaren" und "freien" speicherplatz.mkfs.xfs -l size=512 -d agcount=1
wird ein Dateisystem mit der absoluten minimalen Protokollgröße (aka Journalgröße) erstellen, aber die Schreibleistung kann darunter leiden. Ich glaube nicht, dass die XFS-Code-Unterstützung ohne Protokoll funktioniert. Möglicherweise schreibgeschützt, um Fälle zu unterstützen, in denen ein externes Protokollgerät defekt ist. (Auchagcount=1
ist wahrscheinlich eine andere schreckliche Idee für Schreibleistung, vor allem parallel. Und Allokationsgruppen-Header sind wahrscheinlich auch klein.)mkfs.xfs -d agcount=1
auf einer 100MiB Partition stellte ein FS von 95980kiB, mit 5196k verwendet, 90784k zur Verfügung. Die Standardanzahl ist 4, und die Standardprotokollgröße beträgt 1605 Blöcke (ebenfalls das Minimum). Daher verwendet XFS ein so kleines Protokoll, wie Sie es für kleine FSes angeben möchten.Die kurze Antwort:
Nicht der gesamte Speicherplatz auf dem Blockgerät wird verfügbarer Speicherplatz für Ihre Daten: Ein Teil des unformatierten Speicherplatzes wird für interne Dateisysteme benötigt, die Buchhaltung hinter den Kulissen.
Diese Buchhaltung umfasst den Superblock, Blockgruppendeskriptoren, Block- und Inode-Bitmaps und die Inode-Tabelle. Außerdem werden an mehreren Stellen Kopien des Superblocks für Sicherungs- / Wiederherstellungszwecke erstellt. Eine ausführliche Beschreibung der Interna des EXT4-Dateisystems finden Sie unter ext4.wiki.kernel.org .
Da EXT4 ein Journaled File-System ist, nimmt es auch etwas Platz ein.
Zusätzlich ist etwas Platz für zukünftige Erweiterungen des Dateisystems reserviert.
Die lange Antwort:
Ich habe Ihr Szenario auf einem meiner Testsysteme neu erstellt:
Dann, noch bevor das Dateisystem gemountet wird, wird Folgendes
dumpe2fs
angezeigt:und nach der Montage:
Was
df
zeigt uns das? Von den 102400 Blöcken des Raw-Speichergeräts sind 99150 1-KB-Blöcke für das Dateisystem sichtbar, was bedeutet, dass 3250 1-Kilobyte-Blöcke Raw-Speicherplatz für die tatsächliche Datenspeicherung unbrauchbar geworden sind.Wohin gingen diese Blöcke? Wenn Sie in der
dumpe2fs
Ausgabe nach unten scrollen, sehen Sie genau, wo:1 block
(Block # 0) Die ersten 1024 Bytes werden übersprungen, um die Installation von x86-Bootsektoren und anderen Kuriositäten zu ermöglichen.1 block
wird vom primären Superblock besetzt.1 block
enthält die Gruppendeskriptoren.256 blocks
sind für die Gruppendeskriptortabelle reserviert, um eine spätere Größenänderung des Dateisystems zu ermöglichen.16 blocks
werden für die Block-Bitmap vergeben.16 blocks
sind für die Inode-Bitmap zugewiesen.246 blocks
sind der Inode-Tabelle zugeordnet.Das sind bereits 537 der 3250 fehlenden Blöcke. Ein ext4-Dateisystem ist in eine Reihe von Blockgruppen unterteilt. Wenn Sie nach unten scrollen, wird eine ähnliche Zuordnung der Raw-Speicherkapazität zu den internen Dateisystemen in den anderen Blockgruppen angezeigt:
Nun zurück zur
df
Ausgabe:Der Grund, warum auf diesem neuen Dateisystem bereits 7% der Kapazität als belegt markiert sind, ist:
99150 (die Größe des Dateisystems) MINUS 5120 (die Anzahl der reservierten Blöcke) MINUS 5646 (verwendete Blöcke, von denen 4096 aus dem Journal stammen (wieder Teil der Ausgabe von dumpe2fs))
= 88384
Die Anzahl der freien Blöcke in dumpe2fs ist die verfügbare Größe des Dateisystems abzüglich der tatsächlichen Nutzung (und berücksichtigt nicht die reservierten Blöcke), also 99150 - 5646 = 93504.
quelle
Keine Antwort auf die Frage, aber ich wurde neugierig, also stelle ich mir vor, dass andere es tun werden. Da ich bereits eine Live-CD gebootet hatte und eine Festplatte hatte, mit der ich mich herumschlagen konnte, ohne mir Gedanken über Tippfehler zu machen, die irgendetwas beschädigten, fuhr ich fort und testete.
Ich habe Partitionen mit allen FSes, für die Ubuntu 14.10 ein mkfs liefert, auf 100MiB-Partitionen erstellt. (Mit Ausnahme von Minix, das nur 64 MB unterstützt, und BFS, einer SCO-Funktion, von der ich noch nie gehört habe.)
Zuerst habe ich sah
df -k
verfügbaren Platz (mit Standard mkfs Einstellungen), dann habe ichdd
ed/dev/zero
auf jeder FS in eine Datei , um sicherzustellen , könnten sie den ganzen Weg werden gefüllt. (Überprüfen Sie also, ob die angeforderteavailable space
tatsächlich verfügbar war.)for i in /media/ubuntu/small-*;do sudo dd if=/dev/zero of="$i/fill" bs=16k;done
Warum hat btrfs so viel unbenutzbaren Speicherplatz? Vielleicht für Metadaten? na nein:
Beide baumbasierten Dateisysteme können nirgendwo eine leere Datei packen, alle anderen jedoch.
Oder sehen Sie sich an, wie groß eine Datei sein kann:
(Ich habe meine ext4-Partition "small-ext" genannt, weil ich nicht vorhatte, alle Dateisysteme zu verrückt zu machen. Also ext = ext4 hier. NICHT die ursprüngliche ext2-Partition vor ext.)
Und
df -k
Ausgabe nach dem erneuten Entfernen:(jfs wurde auf 1% zurückgesetzt, nachdem ich "touched" ebenfalls entfernt hatte. Entweder gab es eine Zeitverzögerung, oder es dauerte einen weiteren Schreibvorgang, um die verfügbare Größe zum Aktualisieren zu erhalten.)
Jedenfalls denke ich, dass das für meine Neugier ungefähr ist.
quelle