8

Я только что заметил, что ни одна из файловых систем ext {2,3,4}, которые я пытаюсь создать на жестком диске 500G, не использует все доступное пространство (466G). Я также пробовал reiser3, xfs, jfs, btrfs и даже vfat. Все они создают fs размером 466G (как показано df -h). Однако ext * создает fs 459G. Отключение зарезервированных блоков увеличивает пространство, доступное пользователю, но размер fs по-прежнему составляет 459G.

То же самое для жесткого диска емкостью 1 Тбайт: 932G reiserfs, 917G ext4.

Итак, что же это за разница в 1,5%? Почему это происходит и есть ли способ сделать ext заполнить весь объем?

UPD: все тесты проводятся на одной машине, на одном и том же жестком диске и т.д. Неважно, чем 466G отличается от маркетинговой 500G. Проблема в том, что она отличается для разных ФС.

О df - показывает общий размер FS, использованный размер и свободное место. В этом случае у меня есть:

для reiserfs:

/dev/sda1 466G 33M 466G 1% / мин

для ext4:

/dev/sda1 459G 198M 435G 1% / мин

Если я отключу резервирование корневого блока, 435G изменится на 459G - полный размер fs (минус 198M). Но само fs по-прежнему 459G для ext4 и 466G для рейзера!

UPD2: заполнение томов реальными данными через dd:

ReiserFS:

fs:~# dd if=/dev/zero of=/mnt/1
dd: запись в «/mnt/1»: На устройстве кончилось место
975702649+0 записей считано
975702648+0 записей написано
 скопировано 499559755776 байт (500 GB), 8705,61 c, 57,4 MB/c

ext2 с отключенным резервированием блоков (mke2fs -m 0):

fs:~# dd if=/dev/zero of=/mnt/1
dd: запись в «/mnt/1»: На устройстве кончилось место
960356153+0 записей считано
960356152+0 записей написано
 скопировано 491702349824 байта (492 GB), 8870,01 c, 55,4 MB/c

Извините за русский, но я запустил его в локали по умолчанию и повторял слишком долго. Неважно, вывод dd очевиден.

Таким образом, оказывается, что mke2fs действительно создает меньшую файловую систему, чем другие mkfs.

3 ответа3

19

Есть две причины, по которым это правда.

Во-первых, по тем или иным причинам разработчики ОС по-прежнему сообщают о свободном пространстве с точки зрения системы Base 2, а производители жестких дисков сообщают о свободном пространстве с точки зрения системы Base 10. Например, средство записи операционной системы будет называть 1024 байта (2 ^ 10 байтов) килобайтом, а изготовитель жесткого диска будет называть 1000 байтов килобайтом. Эта разница довольно незначительна для килобайтов, но как только вы получите терабайты, она будет довольно значительной. Оператор записи будет называть 1099511627776 байт (2 ^ 40 байт) терабайтом, а производитель жесткого диска - 1000000000000 байт терабайтом.

Эти два разных способа говорить о размерах часто приводят к путанице.

Существует точный поддерживаемый префикс ISO для двоичных размеров. Пользовательские интерфейсы, разработанные с учетом нового префикса, будут показывать TiB, GiB (или, в более общем случае, XiB) при отображении размеров с системой префиксов base 2.

Во-вторых, df -h сообщает, сколько места доступно для вашего использования. Все файловые системы должны записывать служебную информацию, чтобы следить за вещами для вас. Эта информация занимает некоторое место на вашем диске. Как правило, не очень, но некоторые. Это также объясняет некоторые видимые потери, которые вы видите.

После того, как вы отредактировали свое сообщение, чтобы понять, что ни один из моих ответов на самом деле не отвечает на ваш вопрос, я постараюсь ответить на ваш вопрос ...

Различные файловые системы используют разные объемы пространства для служебной информации и сообщают об использовании пространства по-разному.

Например, ext2 делит диск на группы цилиндров. Затем он предварительно выделяет пространство в каждой группе цилиндров для инодов и карт свободного пространства. ext3 делает то же самое, так как в основном это ext2 + ведение журнала. И ext4 также делает то же самое, так как это довольно простая (и почти обратно совместимая) модификация ext3. И поскольку эти издержки метаданных фиксируются при создании файловой системы или при изменении размера, она не отображается как «использованное» пространство. Я подозреваю, что это также потому, что метаданные группы цилиндров находятся в фиксированных местах на диске и поэтому просто подразумеваются как используемые и, следовательно, не отмеченные или не учитываемые в картах свободного пространства.

Но reiserfs не выделяет заранее какие-либо метаданные. У него нет предела inode, который фиксируется при создании файловой системы, потому что он распределяет все свои inode на лету, как это происходит с блоками данных. В большинстве случаев ему нужны структуры, описывающие корневой каталог, и какая-то карта свободного пространства. Так что он использует гораздо меньше места, когда в нем ничего нет.

Но это означает, что reiserfs будет занимать больше места при добавлении файлов, поскольку он будет выделять метаданные (например, inode), а также фактическое пространство данных для файла.

Я не знаю точно, как jfs и btrfs отслеживают использование пространства метаданных. Но я подозреваю, что они отслеживают это больше, чем reiserfs. В частности, vfat не имеет никакой концепции inode. Его карта свободного пространства (размер которой фиксирован при создании файловой системы (печально известная таблица FAT)) хранит большую часть данных, которые будет иметь индекс, и запись каталога (которая динамически распределяется) хранит остальные.

8

Помимо проблем, о которых упоминает Omnifarious, в ext2/3/4 определенное количество места зарезервировано для root - это зарезервированное пространство не отображается в выходных данных df.

Например, создание небольшой файловой системы (~ 100 МБ) с параметрами по умолчанию, используя ext2 вместо 3 или 4, чтобы игнорировать пространство, которое в противном случае заняло бы журнал:

swann:/tmp# dd if=/dev/zero of=./loop.fs bs=10240 count=10240
swann:/tmp# mkfs.ext2 loop.fs
swann:/tmp# mkdir loop
swann:/tmp# mount -text2 -oloop loop.fs loop
swann:/tmp# df loop
Filesystem           1K-blocks      Used Available Use% Mounted on
/tmp/loop.fs             99150      1550     92480   2% /tmp/loop

Настройка опции зарезервированных блоков (опция tune2fs -m устанавливает зарезервированные блоки в процентах, а опция -r устанавливает зарезервированные блоки как прямое число блоков):

swann:/tmp# umount loop
swann:/tmp# tune2fs -m 25 loop.fs
swann:/tmp# mount -text2 -oloop loop.fs loop
swann:/tmp# df loop
Filesystem           1K-blocks      Used Available Use% Mounted on
/tmp/loop.fs             99150      1550     72000   3% /tmp/loop

swann:/tmp# umount loop
swann:/tmp# tune2fs -m 0 loop.fs
swann:/tmp# mount -text2 -oloop loop.fs loop
swann:/tmp# df loop
Filesystem           1K-blocks      Used Available Use% Mounted on
/tmp/loop.fs             99150      1550     97600   2% /tmp/loop

Как вы можете видеть в приведенном выше примере, даже когда вы вошли в систему как root, df не показывает зарезервированное пространство в счетчике "Доступно". Зарезервированное пространство не отображается в подсчете "Используется", независимо от того, вошел ли пользователь в систему как пользователь root или как пользователь с меньшими правами. Иногда это может вызвать путаницу, когда файловая система близка к полной, если вы не ожидаете этих двух фактов.

Также обратите внимание, что tune2fs , несмотря на свое название, относится к файловым системам ext3 и ext4, а также к ext2.

0

Что касается различий между файловыми системами, разные файловые системы организуют блоки по-разному и нуждаются в большем или меньшем количестве данных для идентификации и отслеживания блоков. Размер блока также имеет значение, так как если у вас больше или меньше блоков для одного и того же пространства, у вас больше или меньше "потерянного" пространства. Кроме того, файловые системы группируют блоки, чтобы избежать фрагментации файлов, и каждый кластер блоков имеет идентификатор определенного размера, поэтому более или менее кластеры блоков будут использовать различное физическое пространство на диске. Таким образом, разница в том, как файловая система организует физическое пространство.

Вот описание для ext2, и вы, вероятно, можете найти что-то подобное для reiserfs, но я никогда не использовал его, поэтому у меня его нет.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .