У меня виртуальная среда очень высокой плотности с контейнерами, поэтому я стараюсь сделать каждый контейнер действительно маленьким. «Действительно маленький» означает 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%, что это?
Теперь следует расследование (спойлер: безрезультатно)
Файловая система может начинаться не с начала устройства. Это странно, но возможно. К счастью, в 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 и т. Д.
- Это журнал!
Нет. Журнал занимает место из Доступно, если вывод df.
- О, у нас есть 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 говорит)
ext2
для небольших перегородок.ext2
выглядит разумно здесь, конечноОтветы:
Попробуй это:
mkfs.ext4 -N 104 -m0 -O ^has_journal,^resize_inode /dev/purgatory/test1
Я думаю, что это позволит вам понять «что происходит».
-N 104
(установите количество iNodes, которое должна иметь ваша файловая система)-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
:и подсчитать используемые блоки (для суперблока резервного копирования, дескрипторов группы, растрового изображения блока, растрового изображения Inode и таблицы Inode) или мы
grep
и подсчитать:что дает нам количество строк, которые имеют один блок (в нашем примере) и
что дает нам количество строк, которые имеют два блока (в нашем примере).
Таким образом, у нас есть (в нашем примере)
13
строки с одним блоком каждая и19
строки с двумя блоками каждая.что дает нам
51
блоки, которые используются самой ext4. Наконец, остался только один блок. Блок 0, который является пропущенными1024
байтами в начале для таких вещей, как загрузочный сектор.источник
df
на fs с журналом: 95054k -df
на fs без jorunal 99150k - и не смешивайте «полезное» и «свободное» пространство.mkfs.xfs -l size=512 -d agcount=1
создаст файловую систему с абсолютным минимальным размером журнала (или журнала), но производительность записи может снизиться. Я не думаю, что код XFS поддерживает работу без журнала. Возможно, только для чтения, для поддержки случаев, когда внешнее устройство журнала сломано. (также,agcount=1
возможно, это еще одна ужасная идея для производительности записи, особенно параллельной. И заголовки групп размещения, вероятно, тоже малы.)mkfs.xfs -d agcount=1
на 100-мегабайтном разделе сделал FS 95980 кБ, с использованием 5196 КБ, доступно 90784 КБ. Счетчик по умолчанию равен 4, а размер журнала по умолчанию составляет 1605 блоков (также минимальный). Таким образом, XFS использует настолько маленький журнал, насколько он желает вам указать, для небольших FS.Краткий ответ:
Не все пространство на блочном устройстве становится доступным пространством для ваших данных: часть необработанного пространства необходима для внутренних компонентов файловой системы, для скрытой бухгалтерии.
Эта бухгалтерия включает суперблок, дескрипторы групп блоков, битовые карты блоков и inode и таблицу inode. Кроме того, копии суперблока в целях резервного копирования / восстановления создаются в нескольких местах. Подробное описание внутренних возможностей файловой системы EXT4 можно найти на ext4.wiki.kernel.org .
Поскольку EXT4 является журнальной файловой системой, которая также занимает некоторое пространство.
Кроме того, некоторое место зарезервировано для будущих расширений файловой системы.
Длинный ответ:
Я воссоздал ваш сценарий на одной из моих тестовых систем:
Затем, даже до монтирования файловой системы, a
dumpe2fs
показывает:и после монтажа:
Так что же
df
нам показывает? Из 102400 блоков необработанного запоминающего устройства емкостью 99150 блоков по 1 КБ видны файловой системе, а это означает, что 3250 блоков по 1 килобайту свободного пространства хранения стали непригодными для фактического хранения данных.Куда делись эти блоки? Прокрутка вниз в
dumpe2fs
выводе показывает, где именно:1 block
(блок № 0) Первые 1024 байта пропускаются, чтобы разрешить установку загрузочных секторов x86 и другие странности.1 block
занят Первичным суперблоком.1 block
содержит дескрипторы группы.256 blocks
которые зарезервированы для таблицы дескрипторов группы , чтобы в будущем изменения размера файловой системы.16 blocks
назначены для растрового изображения блока.16 blocks
назначены для растрового изображения inode.246 blocks
назначены для таблицы индексов.Это уже составляет 537 из 3250 недостающих блоков. Файловая система ext4 разделена на серию групп блоков, и прокрутка вниз дополнительно показывает аналогичное распределение сырой емкости хранения для внутренних компонентов файловой системы в других группах блоков:
Теперь вернемся к
df
выводу:Причина того, что в этой новой файловой системе уже 7% емкости помечено как используемая:
99150 (размер файловой системы) MINUS 5120 (зарезервированное количество блоков) MINUS 5646 (использованные блоки, 4096 из которых из журнала (снова часть вывода dumpe2fs`))
= 88384
Число свободных блоков в dumpe2fs - это доступный размер файловой системы минус фактическое использование (и не учитывает зарезервированные блоки), поэтому 99150 - 5646 = 93504.
источник
Не ответ на вопрос, но мне стало любопытно, так что я думаю, что другие люди будут. Поскольку у меня уже был загруженный 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
Почему у btrfs столько свободного пространства? Может быть, для метаданных? ну нет
Обе древовидные файловые системы не могут упаковать пустой файл в любом месте, но все остальные могут.
Или просто посмотрите, какой большой файл вы можете создать:
(Я назвал мой раздел ext4 "small-ext", потому что я не собирался сходить с ума и создавать каждую файловую систему. Поэтому здесь ext = ext4. НЕ оригинальный pre-ext2 ext.)
И
df -k
вывод после удаления их снова:(jfs вернулся к 1%, использовавшемуся после того, как я также удалил «touch». Либо произошла задержка, либо потребовалась другая запись, чтобы получить доступный размер для обновления.)
Во всяком случае, я думаю, что это из-за моего любопытства.
источник