Mam zwirtualizowane środowisko o bardzo dużej gęstości z kontenerami, dlatego staram się, aby każdy kontener był naprawdę mały. „Naprawdę mały” oznacza 87 MB na podstawowym Ubuntu 14.04 (Trusty Tahr) bez naruszenia kompatybilności menedżera pakietów.
Dlatego używam LVM jako miejsca do przechowywania moich pojemników, a ostatnio znalazłem bardzo dziwne liczby. Tutaj są.
Stwórzmy logiczny wolumin 100 MiB (tak, potęga 2).
sudo lvcreate -L100M -n test1 /dev/purgatory
Chciałbym sprawdzić rozmiar, więc wystawiam sudo lvs --units k
test1 purgatory -wi-a---- 102400.00k
Kochanie, to naprawdę 100 MiB.
Teraz stwórzmy system plików ext4 . I oczywiście pamiętamy -m 0
parametr, który zapobiega marnowaniu przestrzeni.
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łodko i czysto. Zwróć uwagę na rozmiar bloku - nasz wolumin logiczny jest mały, więc mkfs.ext4 postanowił stworzyć blok o wielkości 1 KiB, a nie zwykły 4 KiB.
Teraz go zamontujemy.
sudo mount /dev/purgatory/test1 /mnt/test1
I zadzwońmy df
bez parametrów (chcielibyśmy zobaczyć 1 blok KiB)
/dev/mapper/purgatory-test1 95054 1550 91456 2% /mnt/test1
Zaczekaj, o cholera ~
Łącznie mamy 95054 bloków. Ale samo urządzenie ma 102400 bloków 1 KiB. Mamy tylko 92,8% naszego magazynu. Gdzie są moje bloki, stary?
Spójrzmy na to na prawdziwym urządzeniu blokowym. A ma dysk wirtualny 16 GiB, 16777216 bloków 1K, ale tylko 15396784 bloków jest w formacie df. 91,7%, co to jest?
Teraz następuje śledztwo (spoiler: brak wyników)
System plików nie może rozpocząć się na początku urządzenia. To dziwne, ale możliwe. Na szczęście ext4 ma bajty magiczne, sprawdźmy ich obecność.
sudo hexdump -C / dev / purgatory / test1 | grep „53 ef”
To pokazuje superblok:
00000430 a9 10 e7 54 01 00 ff ff 53 ef 01 00 01 00 00 00 |...T....S.......|
Heks 430 = 1072 grudnia, więc gdzieś po pierwszym kilobajcie. Wygląda rozsądnie, ext4 pomija pierwsze 1024 bajty w przypadku takich osobliwości, jak VBR itp.
- To jest dziennik!
Nie, nie jest. Dziennik zabiera miejsce z Dostępne, jeśli wyjście df.
- Och, mamy dump2fs i możemy sprawdzić tam rozmiary!
... dużo greps ...
sudo dumpe2fs /dev/purgatory/test1 | grep "Free blocks"
Ojej.
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
I mamy inny numer. 93504 wolnych bloków.
Pytanie brzmi: co się dzieje?
- Zablokuj urządzenie: 102400k (lvs mówi)
- Rozmiar systemu plików: 95054k (mówi df)
- Darmowe bloki: 93504k (mówi dumpe2fs)
- Dostępny rozmiar: 91456 k (mówi df)
ext2
wygląda tutaj rozsądnie, pewnie
ext2
do małych partycji.