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
sieht hier vernünftig aus, sicher
ext2
für kleine Partitionen.