У мене виртуалізоване середовище дуже високої щільності з контейнерами, тому я намагаюся зробити кожен контейнер справді маленьким. "Дійсно невеликий" означає 87 Мб на базі Ubuntu 14.04 (Trusty Tahr) без порушення сумісності менеджера пакунків.
Тому я використовую LVM як резервне сховище для своїх контейнерів, і нещодавно я знайшов дуже дивні номери. Ось вони.
Давайте створимо логічний об'єм 100 МіБ (так, потужність 2).
sudo lvcreate -L100M -n test1 /dev/purgatory
Я хотів би перевірити розмір, тому видаю sudo lvs --units k
test1 purgatory -wi-a---- 102400.00k
Солодко, це дійсно 100 Мб.
Тепер давайте зробимо файлову систему ext4 . І звичайно, ми пам’ятаємо -m 0
параметр, який запобігає марнотратству.
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
Солодке і чисте. Пам’ятайте про розмір блоку - наш логічний об'єм невеликий, тому mkfs.ext4 вирішив зробити блок розміром 1 KiB, а не звичайний 4 KiB.
Тепер ми його змонтуємо.
sudo mount /dev/purgatory/test1 /mnt/test1
І давайте зателефонуємо df
без параметрів (ми хотіли б бачити 1 KiB-блоки)
/dev/mapper/purgatory-test1 95054 1550 91456 2% /mnt/test1
Зачекайте, ой ши ~
Всього 95054 блоків. Але сам пристрій має 102400 блоків на 1 КіБ. У нас є лише 92,8% нашого сховища. Де мої квартали, чоловіче?
Давайте розглянемо це на реальному блоковому пристрої. У віртуального диска 16 GiB, 16777216 блоків 1 К, але лише 15396784 блоки є у вихідному форматі df. 91,7%, що це?
Тепер слід за розслідуванням (спойлер: результатів немає)
Файлова система може початися не на початку пристрою. Це дивно, але можливо. На щастя, у ext4 є магічні байти, давайте перевіримо їх наявність.
sudo hexdump -C / dev / чистилище / тест1 | grep "53 ef"
Це показує суперблок:
00000430 a9 10 e7 54 01 00 ff ff 53 ef 01 00 01 00 00 00 |...T....S.......|
Hex 430 = грудень 1072, тож десь після першого кілобайт. Здається, що ext4 пропускає перші 1024 байти для дивацтв, таких як VBR тощо.
- Це журнал!
Ні, це не так. Журнал займає місце з «Доступного», якщо вихід df.
- О, у нас є dump2fs і можемо перевірити розміри!
... багато грепсів ...
sudo dumpe2fs /dev/purgatory/test1 | grep "Free blocks"
Ой.
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
І у нас є інше число. 93504 безкоштовних блоків.
Питання: що відбувається?
- Блок пристрою: 102400k (lvs каже)
- Розмір файлової системи: 95054k (df каже)
- Безкоштовні блоки: 93504k (каже dumpe2fs)
- Доступний розмір: 91456k (df каже)
ext2
тут виглядає розумним, впевнено
ext2
для невеликих перегородок.