Чому файлові системи ext не заповнюють весь пристрій?


8

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

Те ж саме для HDD 1 Tb: 932G рейзерфи, 917G ext4.

Отже, що це за 1,5% різниця? Чому це трапляється і чи є спосіб зробити ext заповнити весь об'єм?

UPD: Усі тести, виконані на одній машині, на одному і тому ж жорсткому диску тощо. Не має значення, чим 466G відрізняється від маркетингових 500G. Проблема полягає в тому, що вона відрізняється для різних FS '.

Про df - він показує загальний розмір FS, використаний розмір та вільний простір. У цьому випадку я маю:

для рейзерфів:

/ 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, якщо = / dev / zero of = / mnt / 1
dd: записувати в «/ mnt / 1»: На пристрої кончилось місце
975702649 + 0 записей рахуно
975702648 + 0 записей написано
 скопіровано 499559755776 байт (500 ГБ), 8705,61 c, 57,4 MB / c

ext2 з вимкненим бронюванням блоків (mke2fs -m 0):

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

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

Отже, виходить, що mke2fs дійсно створює меншу файлову систему, ніж інші mkfs.


2
Є певна кількість накладних витрат з кожним FS ... Я не знаю одного, який дозволить вам мати доступ до всього наявного фізичного простору на диску.
блудниць

Рекомендую змінити своє ім'я та розмістити те, що, як видається, є вашим блогом, у полі веб-сайту вашого профілю, щоб зробити його менш нахабною рекламою.
Привіт71

1
Привіт71, дякую за пораду. Веб-сайт насправді не має значення, це лише для openid.
Інеу

Для подальшої записки, якщо ви швидко хочете, щоб програма виходила англійською мовою, використовуйте LANG=C fooабоLC_ALL=C foo
Alan Pearce

Алан, правильно, дякую. Це може бути навіть LANG = або LANG = POSIX. Але, як я вже сказав, цей процес займає багато часу, тому повторний запуск його з різною локальною локальністю лише для декількох рядків нерозумний :) У будь-якому випадку це доводить проблему з розміром FS для ext2 :(
Ineu

Відповіді:


19

Є дві причини, що це правда.

По-перше, з тих чи інших причин письменники ОС все ще повідомляють про вільний простір для системи base 2, а виробники жорстких дисків повідомляють про вільний простір з точки зору системи базової 10. Наприклад, розробник ОС буде називати 1024 байти (2 ^ 10 байт) кілобайт, а виробництво жорсткого диска називатиме 1000 байт за кілобайт. Ця різниця є досить незначною для кілобайт, але як тільки ви піднімаєтесь до терабайт, це досить суттєво. Письменник ОС зателефонує 1099511627776 байт (2 ^ 40 байт) терабайт, а виробник жорсткого диска назве 1000000000000 байт терабайт.

Ці два різні способи розмови про розміри часто призводять до великої плутанини.

Існує чітко підтримуваний префікс ISO для бінарних розмірів . Користувацькі інтерфейси, розроблені з урахуванням нового префікса, показуватимуть TiB, GiB (або взагалі XiB), коли відображати розміри із системою префіксів базової 2.

По-друге, df -h повідомляє, скільки місця доступно для використання. Усі файлові системи повинні писати інформацію про ведення господарства, щоб відслідковувати речі. Ця інформація займає частину місця на вашому диску. Як правило, не дуже, але деякі. Це також спричиняє деяку уявну втрату, яку ви бачите.

Після того, як ви відредагували свою публікацію, щоб було зрозуміло, що жодна з моїх відповідей насправді не відповідає на ваше запитання, я прийму відповідь на ваше запитання ...

Різні файлові системи використовують різні обсяги місця для ведення господарської інформації та повідомляють про використання місця по-різному.

Наприклад, ext2 ділить диск на групи циліндрів. Потім він попередньо виділяє простір у кожній групі циліндрів для точок і карт вільного простору. ext3 робить те саме, оскільки це в основному це ext2 + журнал. І ext4 також робить саме те, що є досить простою (і майже сумісною) модифікацією ext3. Оскільки ці накладні метадані фіксуються на створенні файлової системи або зміні розміру, вони не повідомляються як "використаний" простір. Я підозрюю, що це також тому, що метадані групи циліндрів знаходяться у фіксованих місцях на диску, і тому вони просто маються на увазі як використовувані, а отже, не позначаються та не обліковуються у картах вільного простору.

Але reiserfs не виділяє жодних метаданих будь-якого типу. У нього немає обмеження inode, яке фіксується під час створення файлової системи, оскільки вона виділяє всі свої вставки на льоту, як це відбувається з блоками даних. Для цього, щонайменше, потрібні деякі структури, що описують кореневий каталог, і якась вільна карта простору. Таким чином, він використовує набагато менше місця, коли в ньому нічого немає.

Але це означає, що під час додавання файлів reiserfs займе більше місця, оскільки він буде виділяти метадані (наприклад, inode), а також фактичний простір даних для файлу.

Я не знаю точно, як jfs та btrfs відслідковують використання простору метаданих. Але я підозрюю, що вони відслідковують це більше, як це робить рейзерф. Зокрема, vfat взагалі не має поняття inode. Його вільний простір (розмір якого зафіксовано при створенні файлової системи (сумнозвісна таблиця FAT)) зберігає більшу частину даних, які використовує inode, а запис каталогу (який динамічно розподіляється) зберігає решту.


2
Для цього є стандарт ISO: en.wikipedia.org/wiki/Binary_prefix
Bobby

@Bobby - Так, і він почав показуватися на дисплеях. Я додам це до своєї відповіді. Дякую!
Всезнайко

8

Як і проблеми, про які згадує Omnifarious, з ext2 / 3/4 певний простір відведено для кореня - цей зарезервований простір не відображається у висновку 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

Параметр налаштування зарезервованих блоків (опція tune2fss -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.


Дякую за відповідь. Ні, мова не йде про зарезервовані блоки. Оновлене запитання.
Ineu

0

Про різницю між файловими системами різні файлові системи по-різному організовують блоки і потребують більш-менш даних для ідентифікації та відстеження блоків. Розмір блоку також має значення, як якщо б у вас було більше або менше блоків для одного і того ж простору, у вас є більш-менш "втрачений" простір. Також файлові системи групують блоки, щоб уникнути фрагментації файлів, і кожен блок кластерів має ідентифікатор певного розміру, тому більш-менш блокові кластери будуть використовувати різний фізичний простір на диску. Отже, різниця полягає в тому, як файлова система організовує фізичний простір.

Ось опис для ext2, і ви, ймовірно, можете знайти щось подібне для reiserfs, але я ніколи його не використовував, тому у мене його немає.


2
Reiserfs та btrfs незвичайні тим, що майже вся інформація про бухгалтерський облік розподіляється динамічно. При налаштуванні файлової системи виділяються лише копії суперблоку та растрові зображення вільного простору. Звичайно, це означає, що фактична кількість простору, доступного для даних, є менш детермінованою для цих файлових систем.
Всезнайко

@Omnifarious +1 - Отже, якщо я добре розумію реізерфіф та btrfs, наявний простір, який повідомляється, на початку більший, але звикнутиме як з даними, так і з бухгалтерської інформації замість лише даних, правда?
Лоран

@ laurent-rpnet - Так, це правильно. У випадку btrfs це ще цікавіше. btrfs може реалізовувати RAID на індивідуальній основі файлу, тому його звітування про вільний простір ще важче підключити, оскільки він не може просто припустити, що буде використовуватись додатковий простір, використаний для блоку, який використовується для даних. Крім того, це дозволяє дуже дешеві копії на основі COW, тому записування блоку в середині існуючого файлу може виділити простір.
всезнайко

А як щодо XFS, JFS та VFAT? Важко повірити, що такі примітивні файли, як FAT32, більш динамічні, ніж ext4.
Ineu

У FAT32 також є блоки, зарезервовані для організації. У чому сенс динаміки тут? Якщо динамічне розподілення, FAT32 не має динамічного розподілу, як ext, а також не показує всі блоки на диску, доступні для даних. У нього також є деякі обмеження, файлова система ext4 не має системи без дозволів, тоді як ext4 має дозволи POSIX та ACL, а максимальний розмір файлу - 4 ГБ на FAT32 та 2 ТБ на ext3 (не впевнений у ext4, але повинен бути принаймні однаковим).
Лоран
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.