Чому мій розділ рівно 100 міб на розмірі блоку 1 кіБ не має відповідних доступних блоків / простору?


33

У мене виртуалізоване середовище дуже високої щільності з контейнерами, тому я намагаюся зробити кожен контейнер справді маленьким. "Дійсно невеликий" означає 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%, що це?

Тепер слід за розслідуванням (спойлер: результатів немає)

  1. Файлова система може початися не на початку пристрою. Це дивно, але можливо. На щастя, у 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 тощо.

  1. Це журнал!

Ні, це не так. Журнал займає місце з «Доступного», якщо вихід df.

  1. О, у нас є 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для невеликих перегородок.
frostschutz

@frostschutz ext2тут виглядає розумним, впевнено
маніяк

Відповіді:


32

Спробуйте це: mkfs.ext4 -N 104 -m0 -O ^has_journal,^resize_inode /dev/purgatory/test1

Я думаю, що це дає зрозуміти "що відбувається".

-N 104 (встановіть кількість iNodes, які має мати файлова система)

  • кожен iNode "коштує" корисного простору (128 байт)

-m 0(без зарезервованих блоків)
-O ^has_journal,^resize_inode(деактивуйте функції has_journalтаresize_inode

  • resize_inode"коштує" вільний простір (більшість 1550 блоків 1К / 2%, які ви бачите у вашій df- 12K використовуються для папки "втрачено + знайдено")
  • has_journal"коштує" корисне місце (4096 1К-блоків у вашому випадку)

Ми отримуємо 102348 з 102400ще 52 блоків, непридатних для використання (якщо ми видалили папку "втрачено + знайдено"). Тому ми занурюємось у dumpe2fs:

Group 0: (Blocks 1-8192) [ITABLE_ZEROED]
  Checksum 0x5ee2, unused inodes 65533
  Primary superblock at 1, Group descriptors at 2-2
  Block bitmap at 3 (+2), Inode bitmap at 19 (+18)
  Inode table at 35-35 (+34)
  8150 free blocks, 0 free inodes, 1 directories, 65533 unused inodes
  Free blocks: 17-18, 32-34, 48-8192
  Free inodes: 
Group 1: (Blocks 8193-16384) [BLOCK_UNINIT, ITABLE_ZEROED]
  Checksum 0x56cf, unused inodes 5
  Backup superblock at 8193, Group descriptors at 8194-8194
  Block bitmap at 4 (+4294959107), Inode bitmap at 20 (+4294959123)
  Inode table at 36-36 (+4294959139)
  8190 free blocks, 6 free inodes, 0 directories, 5 unused inodes
  Free blocks: 8193-16384
  Free inodes: 11-16
Group 2: (Blocks 16385-24576) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Checksum 0x51eb, unused inodes 8
  Block bitmap at 5 (+4294950916), Inode bitmap at 21 (+4294950932)
  Inode table at 37-37 (+4294950948)
  8192 free blocks, 8 free inodes, 0 directories, 8 unused inodes
  Free blocks: 16385-24576
  Free inodes: 17-24
Group 3: (Blocks 24577-32768) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Checksum 0x3de1, unused inodes 8
  Backup superblock at 24577, Group descriptors at 24578-24578
  Block bitmap at 6 (+4294942725), Inode bitmap at 22 (+4294942741)
  Inode table at 38-38 (+4294942757)
  8190 free blocks, 8 free inodes, 0 directories, 8 unused inodes
  Free blocks: 24577-32768
  Free inodes: 25-32
Group 4: (Blocks 32769-40960) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Checksum 0x79b9, unused inodes 8
  Block bitmap at 7 (+4294934534), Inode bitmap at 23 (+4294934550)
  Inode table at 39-39 (+4294934566)
  8192 free blocks, 8 free inodes, 0 directories, 8 unused inodes
  Free blocks: 32769-40960
  Free inodes: 33-40
Group 5: (Blocks 40961-49152) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Checksum 0x0059, unused inodes 8
  Backup superblock at 40961, Group descriptors at 40962-40962
  Block bitmap at 8 (+4294926343), Inode bitmap at 24 (+4294926359)
  Inode table at 40-40 (+4294926375)
  8190 free blocks, 8 free inodes, 0 directories, 8 unused inodes
  Free blocks: 40961-49152
  Free inodes: 41-48
Group 6: (Blocks 49153-57344) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Checksum 0x3000, unused inodes 8
  Block bitmap at 9 (+4294918152), Inode bitmap at 25 (+4294918168)
  Inode table at 41-41 (+4294918184)
  8192 free blocks, 8 free inodes, 0 directories, 8 unused inodes
  Free blocks: 49153-57344
  Free inodes: 49-56
Group 7: (Blocks 57345-65536) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Checksum 0x5c0a, unused inodes 8
  Backup superblock at 57345, Group descriptors at 57346-57346
  Block bitmap at 10 (+4294909961), Inode bitmap at 26 (+4294909977)
  Inode table at 42-42 (+4294909993)
  8190 free blocks, 8 free inodes, 0 directories, 8 unused inodes
  Free blocks: 57345-65536
  Free inodes: 57-64
Group 8: (Blocks 65537-73728) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Checksum 0xf050, unused inodes 8
  Block bitmap at 11 (+4294901770), Inode bitmap at 27 (+4294901786)
  Inode table at 43-43 (+4294901802)
  8192 free blocks, 8 free inodes, 0 directories, 8 unused inodes
  Free blocks: 65537-73728
  Free inodes: 65-72
Group 9: (Blocks 73729-81920) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Checksum 0x50fd, unused inodes 8
  Backup superblock at 73729, Group descriptors at 73730-73730
  Block bitmap at 12 (+4294893579), Inode bitmap at 28 (+4294893595)
  Inode table at 44-44 (+4294893611)
  8190 free blocks, 8 free inodes, 0 directories, 8 unused inodes
  Free blocks: 73729-81920
  Free inodes: 73-80
Group 10: (Blocks 81921-90112) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Checksum 0x60a4, unused inodes 8
  Block bitmap at 13 (+4294885388), Inode bitmap at 29 (+4294885404)
  Inode table at 45-45 (+4294885420)
  8192 free blocks, 8 free inodes, 0 directories, 8 unused inodes
  Free blocks: 81921-90112
  Free inodes: 81-88
Group 11: (Blocks 90113-98304) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Checksum 0x28de, unused inodes 8
  Block bitmap at 14 (+4294877197), Inode bitmap at 30 (+4294877213)
  Inode table at 46-46 (+4294877229)
  8192 free blocks, 8 free inodes, 0 directories, 8 unused inodes
  Free blocks: 90113-98304
  Free inodes: 89-96
Group 12: (Blocks 98305-102399) [INODE_UNINIT, ITABLE_ZEROED]
  Checksum 0x9223, unused inodes 8
  Block bitmap at 15 (+4294869006), Inode bitmap at 31 (+4294869022)
  Inode table at 47-47 (+4294869038)
  4095 free blocks, 8 free inodes, 0 directories, 8 unused inodes
  Free blocks: 98305-102399
  Free inodes: 97-104

і підраховуємо використані блоки (для суперблоку резервного копіювання, дескрипторів групи, растрових блоків, растрових зображень Inode та таблиці Inode) або ми grepрахуємо:

LANG=C dumpe2fs /dev/mapper/vg_vms-test1 | grep ' at ' | grep -v ',' | wc -l

що дає нам кількість рядків, що мають єдиний блок (у нашому прикладі) та

LANG=C dumpe2fs /dev/mapper/vg_vms-test1 | grep ' at ' | grep ',' | wc -l

що дає нам кількість рядків, які мають два блоки (у нашому прикладі).

Отже, у нас є (у нашому прикладі) 13рядки з одним блоком кожен і 19рядки з двома блоками кожен.

13+19*2

що дає нам 51блоки, які використовує сам ext4. Нарешті залишився лише один блок. Блок 0, який є пропущеними 1024байтами на початку для таких речей, як завантажувальний сектор.


І якщо журнал бере лише 4096 к, у мене цього номера немає (95054 - 4096)! = 91456?
манія

Усі цифри тут наведені в k, тому 95054k всього - 4096k журналу! = 91456k доступно.
манія

1
dfна fs з журналом: 95054k - dfна fs без жодного коду 99150k - і не змішуйте "корисний" та "вільний" простір.
xx4h

Деякі файлові системи, наприклад xfs, при необхідності динамічно виділяють простір для inode. Ви можете спробувати xfs та btrfs, якщо вам цікаво. mkfs.xfs -l size=512 -d agcount=1створить файлову систему з абсолютним мінімальним розміром журналу (він же журнал), але продуктивність запису може постраждати. Я не думаю, що підтримка коду XFS працює без журналу. Можливо, лише для читання, щоб підтримувати випадки, коли пристрій зовнішнього журналу зламано. (також, agcount=1мабуть, ще одна жахлива ідея для виконання запису, особливо паралельна. І заголовки групи розподілу, мабуть, теж невеликі.)
Пітер Кордес,

З цікавістю випробував XFS. Якщо існує комбінація параметрів для Linux XFS, яка дозволить мінімальному розміру журналу знизитися до абсолютного мінімуму 512 блоків, IDK, що це таке. mkfs.xfs -d agcount=1на 100MiB розділі зроблено FS 95980kiB, при цьому використано 5196k, доступно 90784k. За замовчуванням - 4, а розмір журналу за замовчуванням - 1605 блоків (також мінімум). Таким чином, XFS використовує такий невеликий журнал, наскільки він готовий дозволити вам вказати, для невеликих FSes.
Пітер Кордес

19

Коротка відповідь:

Не весь простір на блоковому пристрої стає доступним простором для ваших даних: деякий необроблений простір необхідний для внутрішнього використання файлової системи, поза бухгалтерського обліку.

Ця бухгалтерія включає суперблок, дескриптори групи блоків, растрові блоки блоків та індексів та таблицю inode. Крім того, копії суперблоку для цілей резервного копіювання / відновлення створюються у ряді локацій. Довго читати про внутрішні файли файлової системи EXT4 можна знайти на ext4.wiki.kernel.org .

Оскільки EXT4 - файлова система, що займається коштами, яка також займає певний простір.

Крім того, деякий простір відведено для майбутніх розширень файлової системи.

Довга відповідь:

Я відтворив ваш сценарій в одній із моїх тестових систем:

lvcreate -L 100M -n test MyVG
mkfs.ext4 -b 1024 /dev/MyVG/test 

Потім перед тим, як навіть встановити файлову систему, dumpe2fsпоказано:

Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              25688
Block count:              102400
Reserved block count:     5120
Free blocks:              93504
Free inodes:              25677
First block:              1
Block size:               1024
Fragment size:            1024
Reserved GDT blocks:      256
Blocks per group:         8192
Fragments per group:      8192
Inodes per group:         1976
Inode blocks per group:   247
Flex block group size:    16
Filesystem created:       Fri Feb 20 13:20:54 2015
Last mount time:          n/a
Last write time:          Fri Feb 20 13:20:55 2015
...
Journal size:             4096k  
...

і після монтажу:

df /tmp/test/
Filesystem              1K-blocks  Used Available Use% Mounted on
/dev/mapper/MyVG-test       99150  5646     88384   7% /tmp/test

Отже, що робить df нам показує? З 102400 блоків ємності пристрою зберігання сировини 99150 1К блоків видно у файловій системі, що означає, що 3250 1-кілобайтних блоків необробленого місця для зберігання даних стали непридатними для фактичного зберігання даних.

Куди пішли ці блоки? Прокручування вниз у dumpe2fsвисновку показує, де саме:

Group 0: (Blocks 1-8192) [ITABLE_ZEROED]
  Checksum 0x0d67, unused inodes 1965
  Primary superblock at 1, Group descriptors at 2-2
  Reserved GDT blocks at 3-258
  Block bitmap at 259 (+258), Inode bitmap at 275 (+274)
  Inode table at 291-537 (+290)
  4683 free blocks, 1965 free inodes, 2 directories, 1965 unused inodes
  Free blocks: 3510-8192
  Free inodes: 12-1976

1 block (блок # 0) Перші 1024 байти пропускаються, щоб дозволити встановлення завантажувальних секторів x86 та інших диваків.
1 block займає Первинний супер блок.
1 block містить дескриптори групи.
256 blocksякі зарезервовані для таблиці дескрипторів групи , щоб в майбутньому зміни розміру файлової системи. 16 blocks призначені для блокової растрової карти.
16 blocksпризначені для растрової карти inode.
246 blocksпризначені для таблиці inode.

На це вже припадає 537 з 3250 відсутніх блоків. Файлова система ext4 розбита на ряд груп блоків, і прокручування вниз надалі демонструє аналогічний розподіл ємності для необмеженого зберігання для внутрішніх файлових систем в інших групах блоків:

Group 1: (Blocks 8193-16384) [INODE_UNINIT, ITABLE_ZEROED]
  Checksum 0x0618, unused inodes 1976
  Backup superblock at 8193, Group descriptors at 8194-8194
  Reserved GDT blocks at 8195-8450
  Block bitmap at 260 (+4294959363), Inode bitmap at 276 (+4294959379)
  Inode table at 538-784 (+4294959641)
  7934 free blocks, 1976 free inodes, 0 directories, 1976 unused inodes
  Free blocks: 8451-16384
  Free inodes: 1977-3952
Group 2: (Blocks 16385-24576) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Checksum 0xcfd3, unused inodes 1976
  Block bitmap at 261 (+4294951172), Inode bitmap at 277 (+4294951188)
  Inode table at 785-1031 (+4294951696)
  8192 free blocks, 1976 free inodes, 0 directories, 1976 unused inodes
  Free blocks: 16385-24576
  Free inodes: 3953-5928 
Group ....

Тепер повернемося до dfвисновку:

df /tmp/test/
Filesystem              1K-blocks  Used Available Use% Mounted on
/dev/mapper/MyVG-test       99150  5646     88384   7% /tmp/test

Причина того, що на тій свіжій файловій системі вже 7% ємності позначено як у використанні:

99150 (розмір файлової системи) MINUS 5120 (кількість зарезервованих блоків) MINUS 5646 (використані блоки, 4096 яких з журналу (знову частина виводу dumpe2fs))
= 88384

Кількість вільних блоків у dumpe2fs - це доступний розмір файлової системи за вирахуванням фактичного використання (і не враховує зарезервовані блоки), тому 99150 - 5646 = 93504.


0

Не відповідь на запитання, але мені стало цікаво, я думаю, що інші люди будуть. Оскільки у мене вже завантажився liveCD, і він мав жорсткий диск, з яким я міг би возитися, не переживаючи, щоб друкарські помилки щось пошкодили, я продовжив перевірку.

Я зробив розділи з усіма FSes, для яких Ubuntu 14.10 постачає mkfs, на розділи 100MiB. (за винятком minix, який підтримує лише 64MiB, і bfs, про що я не чув ніколи про SCO.)

Спершу я подивився на df -kдоступний простір (із налаштуваннями mkfs за замовчуванням), потім я ddперейшов /dev/zeroдо файлу на кожному FS, щоб переконатися, що вони можуть бути заповнені до кінця. (тобто перевірте, чи заявка available spaceсправді доступна.)
for i in /media/ubuntu/small-*;do sudo dd if=/dev/zero of="$i/fill" bs=16k;done

* FS: empty `df -k` : non-zero `df -k` when full (false bottom)
* jfs:  101020k
* fat32:100808k  : 4
* ntfs:  99896k
* btrfs: 98276k  : 4428
* ext2:  92480k
* xfs:   90652k  : 20
* ext4:  86336k
* ext3:  88367k
* reiserfs(v3): 69552k

Чому btrfs має стільки непридатного простору? Може, для метаданих? ну ніпе:

$ for i in /media/ubuntu/small-*;do sudo touch "$i/touched";done
touch: cannot touch ‘/media/ubuntu/small-btrfs/touched’: No space left on device
touch: cannot touch ‘/media/ubuntu/small-reiser/touched’: No space left on device

Обидві файлові системи на основі дерева не можуть спакувати порожній файл ніде, але всі інші можуть.

Або просто подивіться, наскільки великий файл ви можете створити:

$ ls -SdlG --block-size=1k /media/ubuntu/small-*/*
-rw-r--r-- 1 root   101020 Feb 21 11:55 /media/ubuntu/small-jfs/fill
-rw-r--r-- 1 ubuntu 100804 Feb 21 11:55 /media/ubuntu/small-fat/fill
-rw------- 1 ubuntu  99848 Feb 21 11:55 /media/ubuntu/small-ntfs/fill
-rw-r--r-- 1 root    97216 Feb 21 11:55 /media/ubuntu/small-ext2/fill
-rw-r--r-- 1 root    93705 Feb 21 11:27 /media/ubuntu/small-btrfs/foo
-rw-r--r-- 1 root    93120 Feb 21 11:55 /media/ubuntu/small-ext3/fill
-rw-r--r-- 1 root    91440 Feb 21 11:55 /media/ubuntu/small-ext/fill
-rw-r--r-- 1 root    90632 Feb 21 11:55 /media/ubuntu/small-xfs/fill
-rw-r--r-- 1 root    69480 Feb 21 11:55 /media/ubuntu/small-reiser/fill
drwx------ 2 root       12 Feb 21 11:33 /media/ubuntu/small-ext2/lost+found
drwx------ 2 root       12 Feb 21 11:43 /media/ubuntu/small-ext3/lost+found
drwx------ 2 root       12 Feb 21 11:29 /media/ubuntu/small-ext/lost+found

(Я назвав свій розділ ext4 "small-ext", тому що я не планував робити гайки і створювати кожну файлову систему. Так ext = ext4 тут. НЕ оригінальний pre-ext2 ext.)

І df -kвиведіть після їх повторного видалення:

/dev/sdd6          95980    5328     90652   6% /media/ubuntu/small-xfs
/dev/sdd7          95054    1550     86336   2% /media/ubuntu/small-ext
/dev/sdd5         102400   93880    101020  96% /media/ubuntu/small-btrfs
/dev/sdd8         101168  101168         0 100% /media/ubuntu/small-jfs
/dev/sdd9          99150    1550     92480   2% /media/ubuntu/small-ext2
/dev/sdd10        102392   32840     69552  33% /media/ubuntu/small-reiser
/dev/sdd11        100808       1    100808   1% /media/ubuntu/small-fat
/dev/sdd12        102396    2548     99848   3% /media/ubuntu/small-ntfs
/dev/sdd13         95054    1567     88367   2% /media/ubuntu/small-ext3

(jfs повернувся до 1%, що використовується після того, як я видалив "торкнувся". Або була затримка в часі, або знадобилося інша запис для отримання доступного розміру для оновлення.)

У будь-якому випадку, я думаю, що це про це з моєї цікавості.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.