Чому ядро ​​Linux повідомляє «про місце на диску», коли насправді воно знаходиться поза i-вузлами


10

Мій друг, який любить програмування в середовищі Linux, але не знає багато про адміністрування Linux, нещодавно зіткнувся з проблемою, коли його ОС (Ubuntu) звітувала "з дискового простору на томі XXX". Але коли він пішов перевірити гучність, залишилося ще 700 ГБ. Після багато витраченого часу він, врешті-решт, зміг зрозуміти, що він не має місце. (На цьому томі він зберігав багато невеликих поступових оновлень із системи резервного копіювання та записував через усі свої вставки.)

Він запитав мене, чому ядро ​​Linux повідомило про повідомлення про помилку ("не вистачає місця на диску"), а не належним чином звітувати ("поза введеннями"). Я не знав, тому зрозумів, що попрошу StackExchange.

Хтось знає, чому це відбувається? і чому це не було виправлено після всіх цих років? (Я пам'ятаю, як інший друг розповідав мені про цю проблему в 1995 році.)

Відповіді:


18

Один номер помилки, ENOSPCвикористовується для повідомлення про обидві ситуації, звідси одне і те ж повідомлення про помилку.

Щоб зберегти відповідність стандартам ISO Cта POSIXстандартам, розробникам ядра не залишається нічого іншого, як використовувати єдиний номер помилки для обох подій. Додавання нового номера помилки призведе до порушення існуючих програм.

Однак, оскільки дотримання традиційних повідомлень про помилки не є обов'язковим для AFAIK, ніщо не повинно забороняти розробнику зробити одне повідомлення зрозумілішим, як, наприклад, out of disk/inode space

Технічно те, що виходите з простору inode або з простору даних однаково, тобто це означає, що для успішного виклику системи недостатньо вільного місця на диску.

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

Зверніть увагу , що файлові системи , такі як JFS, XFS, ZFSі btrfsвиділити дескриптори динамічно , так робити не володіють тільки цим питанням більше.


Останні файлові системи включають ext4?
Каміло Мартін

@CamiloMartin Я не думаю, що це робить.
jlliagre

@CamiloMartin На жаль, ні, ext4виділяє inode під час створення fs, як ext2 / 3, і не може бути змінено пізніше.
Метт

@mindthemonkey Darn! Це, мабуть, якась сумісність із зворотною сумісністю. Яка інша файлова система має приємні функції, але досить стабільна (чи є btrfs стабільною)? Здається, ext4 - це якийсь "вибір за замовчуванням" (принаймні, з моєї точки зору початківця).
Каміло Мартін

1
Так, ext завжди були розширеннями попередньої версії та назад сумісними, тому не було великих змін, але це означає, що вона залишається досить міцною та стабільною. Я особисто роблю все своє велике об'ємне зберігання на Freebsd коробках із ZFS. BTRFS все ще вважається "нестабільним", хоча більшість дистрибутивів, принаймні, дозволять вам використовувати його.
Мет

2

Я припускаю, що ваш друг використовує ext fs, тому що це один з небагатьох розважливих fs, у якого може не вистачити невластивих.

Здавалося б, ваш друг або посварився зі своєю файловою системою і зламав її, або має смішно великий обсяг у кілька туберкульозу. Вузоли - це не корисна річ. Якщо йому справді не вистачало індексів, це означає, що у нього смішно багато файлів і каталогів ... що може траплятися на томі> 4 ТБ (здобутий здогад), де "лише" 700 Гб безкоштовно. Для сімейства ext fs кількість inode визначається при створенні fs. На mkfs.ext4чоловіковій сторінці:

-i bytes-per-inode
          Specify  the  bytes/inode ratio.  mke2fs creates an inode for every bytes-per-inode
          bytes of space on the disk.  The larger the bytes-per-inode ratio, the fewer inodes
          will  be  created.  This value generally shouldn't be smaller than the blocksize of
          the filesystem, since in that case more inodes would be made than can ever be used.
          Be  warned  that  it is not possible to expand the number of inodes on a filesystem
          after it is created, so be careful deciding the correct value for this parameter.

Щоб скоротити залишок цієї відповіді: Це засіб mkfsабо надається з таким співвідношенням, або воно вважатиметься одним. Якщо ваш друг використовує fs інакше, ніж припускав, вибране співвідношення може бути неправильним для його випадку використання, і він отримує цю помилку ... заповнення одного тома багато TB тоннами невеликих файлів може вважатися таким.

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

Я пам’ятаю цю проблему з ext2 приблизно з того часу, коли ядро ​​2.4 було досить новим. Як правило, я завжди використовую XFS для обсягів, які є дуже великими порівняно з тими, що є загальними. В даний час я закликаю все, що становить від 250 Гб до 1 ТБ, звичайне для одного обсягу, і ми можемо придбати 4 ТБ жорстких дисків. Тож для всього> 3 ТБ я б скоріше використовував XFS, ніж ext. Просто правило, але давно не закінчилося введення даних ...


1
Боюся, ви не відповідаєте на поставлене запитання.
jlliagre

Правда. Я начебто намагався відповісти на перше вбудоване запитання, на яке я потрапив "Хто-небудь знає, чому це відбувається?", Але не той, який вказаний у назві.
Bananguin

Правильно. Мій друг знає, що сталося. Він робив якусь систему резервного копіювання, де він зберігав поступові зміни, не стиснуті (ні TAR'd), щоб усі ці крихітні файли займали місця. Я не думаю, що раніше він не мав такого великого ФС, тож вичерпання індексу було для нього новою справою. Ерго, він розчарувався, коли набрав "df -h" і подумав: "ага, у мене ще залишається тонна місця" - Чесно кажучи, я згоден з ним. Для ядра сказати "поза космосом", коли насправді у нього повинно бути окреме повідомлення "поза індексами" дуже заплутано.
Кренцель

@Bananguin - Чи знаєте ви, яке співвідношення байтів / inode за замовчуванням?
Кренцель

@Pretzel: Я думаю, я пам’ятаю, що за замовчуванням є один inode на кожен 4k. Я щойно перевірив свій комп’ютер ( tune2fs -l /dev/sda1), і у мене трапляється співвідношення 1 inode на кожні чотири блоки, і кожен блок має розмір 1k. Наскільки це можна вважати "замовчуванням", проте, я не знаю.
Bananguin
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.