Почему мой раздел размером 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 КБ, а не обычный 4 КБ.

Теперь мы его смонтируем.

sudo mount /dev/purgatory/test1 /mnt/test1

И давайте назовем dfбез параметров (хотелось бы увидеть 1 КиБ-блок)

/dev/mapper/purgatory-test1     95054    1550     91456   2% /mnt/test1

Подожди, оу ~

Всего у нас 95054 блоков. Но само устройство имеет 102400 блоков по 1 КиБ. У нас всего 92,8% нашего хранилища. Где мои блоки, чувак?

Давайте посмотрим на это на реальном блочном устройстве. А имеют виртуальный диск 16 ГиБ, 16777216 блоков по 1 КБ, но только 15396784 блоков находятся в выводе df. 91,7%, что это?

Теперь следует расследование (спойлер: безрезультатно)

  1. Файловая система может начинаться не с начала устройства. Это странно, но возможно. К счастью, в ext4 есть магические байты, давайте проверим их наличие.

    sudo hexdump -C / dev / purgatory / test1 | grep "53 ef"

Это показывает суперблок:

00000430  a9 10 e7 54 01 00 ff ff  53 ef 01 00 01 00 00 00  |...T....S.......|

Шестнадцатеричный 430 = декабрь 1072, поэтому где-то после первого килобайта. Выглядит разумно, ext4 пропускает первые 1024 байта для таких странностей, как VBR и т. Д.

  1. Это журнал!

Нет. Журнал занимает место из Доступно, если вывод df.

  1. О, у нас есть dump2fs, и мы можем проверить размеры там!

... много greps ...

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 говорит)
maniaque
источник
Вот почему я до сих пор использую 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 1K-блоков / 2%, которые вы видите в вашем df- 12K используются для папки «lost + found»)
  • has_journal«стоит» полезного пространства (в вашем случае 4096 1K-блоков)

Мы выходим 102348из строя 102400, еще 52 блока непригодны для использования (если мы удалили папку «lost + found»). Поэтому мы погрузимся в 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байтами в начале для таких вещей, как загрузочный сектор.

xx4h
источник
И если журнал занимает только 4096 КБ, у меня нет этого числа (95054 - 4096)! = 91456?
маньяк
Все числа здесь в k, итого 95054 тыс. Всего - 4096 тыс. Журнала! = 91456 тыс. Доступных.
маньяк
1
dfна fs с журналом: 95054k - dfна fs без jorunal 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на 100-мегабайтном разделе сделал FS 95980 кБ, с использованием 5196 КБ, доступно 90784 КБ. Счетчик по умолчанию равен 4, а размер журнала по умолчанию составляет 1605 блоков (также минимальный). Таким образом, XFS использует настолько маленький журнал, насколько он желает вам указать, для небольших FS.
Питер Кордес
19

Краткий ответ:

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

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

Поскольку EXT4 является журнальной файловой системой, которая также занимает некоторое пространство.

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

Длинный ответ:

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

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

Затем, даже до монтирования файловой системы, a 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назначены для таблицы индексов.

Это уже составляет 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.

HBruijn
источник
0

Не ответ на вопрос, но мне стало любопытно, так что я думаю, что другие люди будут. Поскольку у меня уже был загруженный liveCD, и у меня был жесткий диск, с которым я мог связываться, не беспокоясь о том, что опечатки повредят что-либо, я продолжил тестирование.

Я сделал разделы со всеми FS, для которых Ubuntu 14.10 поставляет mkfs, на разделах 100MiB. (кроме minix, который поддерживает только 64MiB, и bfs, о которых я никогда не слышал.)

Сначала я посмотрел на 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%, использовавшемуся после того, как я также удалил «touch». Либо произошла задержка, либо потребовалась другая запись, чтобы получить доступный размер для обновления.)

Во всяком случае, я думаю, что это из-за моего любопытства.

Питер Кордес
источник