Як я можу збільшити кількість входів у файловій системі ext4?


61

У мене була проблема (нова для мене) минулого тижня. У мене є файлова система ext4 (Fedora 15). Додаток, який працює на сервері, раптово зупинився. Я не міг знайти проблему з першого погляду.

dfпоказав 50% доступного місця. Шукаючи близько години, я побачив пост на форумі, де хлопець використовував df -i. Ця опція шукає використання inode. Система була невластива, це проста проблема, яку я не усвідомлював. У розділі було лише 3,2 М входів.

Тепер мої запитання: чи можу я зробити так, щоб у системі було більше входів? Чи / це може бути встановлено під час форматування диска? З 3.2M вводами, скільки файлів я міг мати?


1
Кожен файл або каталог використовує один inode. Жорстке посилання на файл не створює inode. en.wikipedia.org/wiki/Inode
Пол Томблін

Відповіді:


33

Здається, у вас набагато більше файлів, ніж нормальне очікування.

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

Щоб створити нову файлову систему з такою величезною таблицею inode, вам потрібно скористатися параметром '-N' mke2fs (8).

Я б рекомендував спочатку скористатися опцією '-n' (яка не створює fs, але відображає корисну інформацію), щоб ви могли отримати приблизну кількість входів. Тоді, якщо вам потрібно, використовуйте «-N» для створення вашої файлової системи з певними номерами inode.


11
Ви можете mke2fs -iвказати кількість вузлів. Його документація вказує на те, що "неможливо розширити кількість входів у файловій системі після її створення".
Жиль

2
@piovisqui: кожен файл споживає inode, який є вказівником у файловій системі. якщо файл є жорстким посиланням на інший файл, він має такий самий inode.
Ханан Н.

6
@Gilles -iПараметри вказують розмір inode, а не скільки їх. -NОпція задає номер дескриптори.
theillien

1
Співвідношення між входами та номерами файлів не обов'язково 1: 1. Перший inode містить список покажчиків на блоки, де зберігається файл. Якщо список блоків не може вміститися в одній точці, то inode містить список покажчиків на inode, які перераховують блоки, де зберігається файл. Якщо він не вміщується, то він містить 3 набори введення глибоко для цього списку блоків тощо
StuWhitby

2
@StuWhitby Це не зовсім правильно. Один вхід має кілька прямих вказівників, а також один, подвійний та потрійний непрямий покажчик. Якщо список блоків не може вміститися в прямих покажчиках, то один непрямий покажчик буде вказувати на блок даних (НЕ інший вклад), який містить більше покажчиків. Якщо потрібно більше покажчиків, ніж це потрібно, подвійний непрямий покажчик вказує на блок, що містить поодинокі непрямі вказівники, а потрійний непрямий - на блок із подвійними непрямими вказівниками. Отже, файл насправді просто використовує один inode, незалежно від розміру.
користувач125355

11

В якості іншого вирішення я можу запропонувати розглянути можливість упаковки величезних колекцій файлів у нестиснений (!) tarАрхів, а потім використовувати його archivemountдля монтажу як файлової системи. Архів дьогтю краще для спільного використання, ніж зображення файлової системи, та забезпечує схожу ефективність при резервному копіюванні до хмари чи іншого сховища.


Якщо колекція передбачається лише для читання, це squashfsможе бути варіант, але для неї потрібні певні параметри, включені в ядрі, і xzстиснення доступне для tar також з однаковою продуктивністю.


2
Приємна пропозиція.
piovisqui

11

Маючи 3,2 мільйона індексів, ви можете мати 3,2 мільйона файлів і каталогів (але для декількох жорстких посилань на файл використовується лише один вхід).

Так, це можна встановити під час створення файлової системи на розділі. Параметри -T usage-type, -N number-of-inodesабо -i bytes-per-inodeвсі можуть встановлювати кількість входів. Я, як правило, використовую -i, порівнюючи вихід du -sі find | wc -lдля подібної колекції файлів і допускаючи деяку слабкість.

Ні, його неможливо змінити на місці в існуючій файловій системі. Однак:

  • Якщо у вас запущений LVM або файлова система знаходиться в LUN SAN (або безпосередньо в LUN, або як останній розділ в LUN), або у вас є порожній простір на диску після розділу, ви можете виростити розділ, а потім використовувати resize2fsдля розширення файлової системи. Це додає більше входів пропорційно доданому простору, приблизно. Якщо ви хочете уникнути вичерпання inode перед пробілом, якщо припустити, що майбутні файли в середньому мають приблизно однаковий розмір, встановіть достатньо високий зарезервований відсотковий відсоток, використовуючи tune2fs -m.
  • Якщо у вас є достатньо місця і ви можете приймати файлову систему в автономному режимі, то відключіть її в автономному режимі, створіть нову файлову систему з більшою кількістю індексів та скопіюйте всі файли.
  • Якщо лише підмножина файлів використовує багато вкладень, і у вас є достатньо вільного місця, створіть файлову систему на циклічному пристрої, підкріпленому файлом у файловій системі, створіть файлову систему з більшою кількістю індексів (а може бути і менших блоків) на ньому, і переміщуйте в нього каталоги, що порушують право. Це, мабуть, хіт продуктивності та клопоту з технічного обслуговування, але це альтернатива.
  • І звичайно, якщо ви можете видалити багато непотрібних файлів, це теж повинно допомогти.

6

У мене є альтернативні рішення для цієї ситуації. Скажімо, у розділі 10G у вас 1000 входів. Але через обмеження inode ви не повинні використовувати весь простір розділів . Але в цих рішеннях ви зможете використовувати залишився простір розділу без його форматування .

$ df -i  # see list ( I need just one free inode here so move just one file into other PARTITION)
/dev/part1  1000 999 1 99.9%     /data

$ dd if=/dev/zero of=/data/new_data
$ mkfs.ext4 /data/new_data
$ mkdir /data1
$ mount /data/new_data /data1

для постійного монтажу

$ echo "/data/new_data /data1 ext4 defaults 0 1" >> /etc/fstab

2
Ласкаво просимо до U&L. Я взяв на себе сміття переформатувати вашу відповідь на більш звичне представлення коду тут, вставивши підказку ( $), щоб чітко розмежувати команди та вихідні дані (якщо вони були лише командою, запит зазвичай залишається поза). Я також змінив ЗОБРАЖЕННЯ на сміливий фазовий акцент, який я думаю, що ви мали намір. Ви можете скасувати зміни, якщо я неправильно представив речі
Антон,

Я думаю, що це рішення має логіку, але вам потрібно керувати розміром під час запуску dd.
piovisqui

3
Деталі невірні, вам потрібно буде використовувати циклічний пристрій, а можливо, навіть unionfs залежно від програми, але це єдине рішення, що дозволяє уникнути форматування та відновлення з резервної копії, що не цікаво, коли поспішаєте з мільйонами файлів. Є обставини, коли це може врятувати день!
medoc

6

Нещодавно зіткнулися з цією проблемою під час використання apt або відновлення можливостей.

df -h

Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      7.8G  5.1G  2.3G  70% /

df -i

Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 521497   2791  100% /

Видана команда:

du /|sort -k1 -n

Виявлено, що більшість файлів знаходились у підпапках для декількох версій ядра в межах:

/usr/src/linux-headers

Видалено ці підпапки, і проблема з inode була виправлена.

df -i

Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 104986 419302   21% /

чи відображає "du / | sort -k1 -n" inode?
Сиріт

Ні. Це було для сортування каталогів, показуючи, які з них мають найбільше файлів у них, папки, які споживають багато вводів, але менше фактичного використання місця: ситуація з 30% вільного місця на диску та 100% використання введення, показаного вище.
kph0x1

Я чесно не розумію, наскільки "du" показало, скільки файлів є з будь-яким прапором? Не могли б ви пояснити докладніше?
Сиріт

Немає прапорів для duкоманди. Використання для кореня файлової системи у наведеному вище прикладі, дивлячись лише на простір. Вихідні дані впорядковуються для сортування, щоб показати, які каталоги містять найбільше файлів. У наведеному вище прикладі не підраховано кількість підрахунків для файлів, частина "скільки файлів" вашого питання. Тільки джерела ядра були винуватцем показаних duрезультатів; наприклад, багато невеликих файлів, підпапок з минулих компіляцій, саме те, що ідеально підходить для видалення, щоб звільнити індекси. Все ще залишається посібник, людський огляд duрезультатів, /usr/src/linux-headersтоді був очевидним.
kph0x1

1
du показує ТОЛЬКІ байти - не файли. А ви виводите вихід лише з команди du в сортування. Отже, як сортувати -k1 -n сортувати вихід таким чином, який ви запропонували? Єдине, що я можу побачити, це те, що "du / | sort -k1 -n" сортує лише кожен рядок, виходячи з розміру в байтах. Нічого іншого
сироти

2

спробуйте du -s --inodes * 2>/dev/null |sort -gкомпакт-диск в останньому режимі на виході і повторіть.

Повне розкриття: не всі --inodesпрапорці ОС для команди du (моя ОС Mac не має), але багато операційних систем Linux.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.