Ако работите с Linux сървъри, рано или късно ще се сблъскате с грешки в inode. Често дискът изглежда има достатъчно място, но въпреки това системата изхвърля грешки като... No space left on deviceЗад подобни страхове обикновено стои един и същ виновник: Свършили са ви inode-ите, въпреки че на диска все още има свободни гигабайти..
За да си спестите часове главоболие, си струва да разберете какво представляват, как работят и най-вече, Какво да правите, когато inodes в Linux скочат и започнат проблемиНека го разгледаме стъпка по стъпка, навлизайки в технически детайли, но с възможно най-ясното обяснение и примери за практични команди за ежедневна употреба.
Какво е inode в Linux и каква роля играе във файловата система?
Иноду е, по същество, структура от данни, която съхранява всички метаданни на файл или директория в Unix-подобна файлова системаВсеки файл или папка има точно един inode, свързан с него, идентифициран с уникално цяло число в рамките на тази файлова система, известно като „номер на inode“.
Думата inode произлиза от индексен възелИ това е логично, защото Той действа като индекс, който казва на системата къде се намират действителните данни във файла и как трябва да се третират.Съдържанието (байтовете на файла) се съхранява в блокове данни на диска; inode съхранява само информация за това съдържание и как да се осъществи достъп до него.
Важно е да се разбере това В рамките на една и съща файлова система не може да има два inode-а с един и същ номер.Този номер обаче може да се повтаря в различни файлови системи. Следователно, за да се идентифицира уникално даден файл, идентификаторът на файловата система се комбинира с неговия inode номер.
Каква информация съхраняват inodes-ите?
Inodes не съхраняват името на файла или неговите данни, но съдържат всички метаданни, които описват какъв е този файл или директория и как се използваСред най-често срещаната информация, съхранявана от inode в Linux системите, ще намерите:
- Тип на файла (обикновен, директория, символна връзка, устройство и др.).
- Размер на файла в байтове и броя на дисковите блокове, които заема.
- UID (потребителски идентификатор) на собственика от файла.
- GID (Идентификатор на групата) на групата свързан с файла или директорията.
- Разрешения за достъп (четене, запис и изпълнение за собственик, група и други).
- Брой твърди връзки които сочат към този индексен нос.
- времеви отпечатъцидата на последен достъп (
atime), последна промяна на данните (mtime) и последна промяна на метаданните (ctime). Някои системи запазват и датата на създаване. - Идентификатор на устройството където се намира файлът.
- Адреси на блоковете с данни на диска, където се съхранява действителното съдържание.
- Индиректни блокови адреси (единични, двойни и тройни) за големи файлове.
- В някои системи, номер на версията или други вътрешни полета които ядрото използва за управление на кешовете и консистентността.
За да видите цялата тази информация в Linux система, можете да използвате командата stat, показва метаданните, които inode е записал за конкретен файл или директорияТипичен пример би бил:
stat /var/log/lastlog
В изхода на командата ще видите полета като Inode, размер, блокове, UID, Gid, разрешения и дати на достъп, модификация и промянасред други технически данни.
Как inodes се свързват с имената на файловете
Един от ключовете за разбирането на начина, по който Linux мисли, е да се изясни, че Системата идентифицира файловете по техния inode номер, а не по името им.Името е просто запис в директория, който сочи към специфичен inode.
Това означава, че Един единствен inode може да има няколко имена, свързани с него чрез твърди връзки.В тези случаи всяко име е запис в таблицата с директории, но всички те сочат към един и същ номер на inode и следователно към едно и също съдържание. Файлът всъщност не се изтрива, докато не се премахне последното име, препращащо към този inode.
Когато копирате файл, за копието се създава нов inode; когато го преименувате или премествате в рамките на същата файлова система, Номерът на inode обикновено остава същият, защото се променят само записите в директориите.Индексният дескриптор се променя само ако преместите файла в различна файлова система (например от / към друг дял, монтиран в /mnt).
Как и къде се съхраняват inodes на диска?
На дискове с класически файлови системи като ext2/ext3/ext4, Индексните дескриптори (INODE) са групирани в таблици или списъци с индексни дескриптори, които се създават при форматиране на файловата система.Тези таблици заемат фиксирано дисково пространство и не могат да бъдат преоразмерени без пресъздаване на файловата система от нулата.
В конкретния случай на ext4, дялът е разделен на групи блокове и В началото на всяка група се съхранява таблица с inode, която препраща към близките блокове данни.Това минимизира движението на главата в механичните дискове и подобрява производителността при произволен достъп.
Ако искате да видите характеристиките на inodes на ext4 дял, можете да използвате tune2fs:
tune2fs -l /dev/sda1 | grep Inode
Изходът ще покаже данни като общият брой индексни възли (in-odes), индексните възли в група, индексните блокове в група и размерът на всеки индексен възел (in-ode). (например, 256 байта, което е стойността по подразбиране в много съвременни ext4 системи).
Други по-усъвършенствани файлови системи, като например xfs или btrfs управляват inodes по-динамичноВместо да резервират фиксирана таблица при създаването на файловата система, те генерират inode-и, когато е необходимо, което им дава по-голяма гъвкавост в сценарии с много променливи промени в натоварването.
Ограничения: колко inode-а има и защо не могат да се разширяват в движение
Един от чувствителните моменти относно inodes е, че Общият му брой се определя при създаването на файловата система и като цяло не може да бъде променен без преформатиране.В ext2/ext3/ext4 се използва типична евристика за разпределянето им, например, един inode за всеки 16 KB дисков капацитет.
В теоретичен план, Една Linux система може да обработва до около 2^32 inode-а, тоест около 4,3 милиарда.На практика, количеството, налично във всяка файлова система, зависи от параметъра. bytes-per-inode което е посочено при изпълнението mkfs когато дискът е форматиран.
Този параметър маркира баланса между броя на inodes и пространството за данни: По-малко байтове на inode означава повече налични inode, но също така повече място, запазено за метаданни и по-малко за действителни данни.Промяната му след това включва възстановяване на файловата система, с риск от пълна загуба на данни, ако нещо се обърка.
Следователно, когато системата изчерпи inodes, Не е достатъчно просто да „създаваме повече“Единственият реален начин да ги увеличите в традиционните външни системи е чрез преформатиране или преразделяне, което принуждава... направи резервно копие, пресъздайте файловата система с различни параметри и възстановете данните.
Как да проверя броя на inodes и тяхното използване?

Преди да възникнат производствени грешки, е препоръчително редовно да се следи използването на inode. За да направите това, командата df с опция -i Това е основната отправна точка.
df -i
Типичният изход показва колони като Файлова система, Inodes, IUsed, IFree, IUse% и Монтирано наДобавяне IUsed e IFree Ще получите общия брой налични inode-и на всяка файлова система, докато IUse% показва процента на вече заетите inode-и.
Плюс dfИма и други ключови команди за управление на inodes в Linux:
ls -iза показване на номера на inode на един или повече файлове.ls -idl <directorio>да се направи заявка за inode на конкретна директория, включително нейните разрешения и собственици.find <ruta> | wc -lда преброи колко файла и поддиректории (и следователно колко inode-а) се намират под даден път.du --inodes <ruta>(в дистрибуции, които го поддържат), за да видите колко inode-а използва всяка директория.
С тези команди можете да получите ясна представа за състоянието на inode във всеки дял и откриване, ако сте опасно близо до 100% употребадори ако дисковото пространство все още изглежда изобилно.
Как да проверя броя на inode файловете и директориите
В ежедневието е много полезно да можеш да виждаш бързо кой номер на inode съответства на конкретен файл или директорияИма няколко прости инструмента, с които да го направите.
Използвайте командата stat
Както вече коментирахме, stat Показва всички метаданни на inode-а, свързан с файл:
stat archivo.txt
На изхода ще видите полето i-възел или индексен възелТова включва номера на inode, както и размера, блоковете, разрешенията, UID, GID и времевите отметки. Това е много изчерпателен начин да видите с един поглед всичко, което inode знае за този файл.
Използвайте командата ls с опцията -i
Ако искате да видите само номера на inode, можете да използвате ls -i да изброява файлове и директории заедно с техния вътрешен идентификатор:
ls -i /var/log/lastlog
Изходът ще покаже номера на inode, последван от пътя до файла. Ако го използвате в директория:
ls -i /var/log
Ще видите за всеки запис номерът на индексния възел, с който системата го идентифицира по-долукоето е особено полезно, когато работите с твърди връзки или искате да отстраните грешки при проблеми с референциите.
Преглед на inode-а на конкретна директория
За да получите подробна информация за конкретна директория, можете да използвате:
ls -idl /var/log
Опцията -d прави Метаданните на самата директория се показват, вместо да се изброява нейното съдържание.По този начин ще знаете неговия inode, неговите разрешения, собственик, група, брой връзки и т.н.
Инодове и размер на файла: директно и индиректно адресиране
Друг важен аспект е как inode се свързва с блоковете данни, които съхраняват съдържанието на файла. Типичният индексен възел (in-ode) има няколко входа за директно адресиране и други за единично, двойно и тройно индиректно адресиране..
В много външни системи, inode-ът съдържа 15 записа за адресиране: 12 от тях сочат директно към блокове с данниСтига файлът да се побира в тези 12 блока, достъпът е лесен и директен.
Когато размерът на файла надвишава тези директни блокове, Запис 13 в индексния възел сочи към специален блок, който не съдържа файлови данни, а таблица с повече адреси на блокове.Това е известно като единично индиректно адресиране. Ако файлът продължи да расте, се използват записи 14 (двойно индиректно) и 15 (тройно индиректно), които свързват допълнителни нива на адресните таблици.
Този механизъм позволява това Един единствен inode може да препраща към много големи файлове, дори стотици мегабайти или гигабайти по размер., с цената на изразходване на повече блокове за адресиране на структури и причиняване на повече скокове при достъп при четене на файла.
Влияние на използването на inode върху системата: често срещани проблеми
Може би си мислите, че с милиони налични inode никога няма да ви свършат, но Не е необичайно да се изчерпят inodes-ите преди дисковото пространство, особено на сървъри с много приложения, контейнери или имейл услуги..
Типичният проблем възниква, когато системата се опитва да създаде нов файл (лог, входящ имейл, временен файл и др.) и възниква грешка No space left on device, въпреки факта, че командата df показва, че все още има налични гигабайтиЗапълнено не е блоковото пространство, а inode квотата.
Сред най-честите причини за изчерпване на inode в Linux са:
- Масово създаване на много малки файлове (дори 0 байта), например лошо управлявани ротирани лог файлове, временни сесии, кеш файлове или нарастващи опашки за поща.
- Интензивно използване на контейнерикъдето всеки контейнер добавя свой собствен слой от файлове и директории.
- Директории с милиони файлове генерирани от приложения, които не почистват правилно временните си файлове.
- Файлови системи, създадени с малки размери на блоковете и прекалено консервативно съотношение байтове/инодове.
Когато сървърът изчерпи inode-ите, последствията могат да бъдат сериозни: Приложения, които се сриват, услуги, които не успяват да стартират, планирани процеси, които не успяват да се изпълнят, непрекъснати грешки при запис и в екстремни случаи загуба на данни ако критичните процеси не могат да записват информация.
Как да откриете, че ви свършват inodes
В допълнение към класическото съобщение No space left on deviceИма няколко предупредителни знака. Например, Ако видите, че има достатъчно дисково пространство, но записите, лог файловете или cron задачите започват да се провалятВреме е да разгледаме индексните възли (in-odes).
Първата стъпка винаги е една и съща:
df -i
Тази команда ще ви каже коя файлова система е със 100% използване на inode. След като я намерите, трябва да проучите по-нататък. В кои директории са концентрирани милионите файлове, които консумират ресурси?.
Много полезна техника е да се премине през броенето на записи във файловата система с find и поръчването им:
cd /ruta/de/la/particion
find . -xdev -printf "%h\n" | sort | uniq -c | sort -n
С този тип команда можете да намерите Кои директории съдържат най-много файлове и следователно най-много inode-и?В много случаи ще видите маршрути като /var/log, /var/spoolдиректории на опашки за поща, като например /var/qmail/queue или папки на приложения, които генерират много временни файлове.
Примери от реалния свят за проблеми с inode
На пощенските сървъри е много често срещано да се случват неправилни конфигурации или спам атаки, Опашката за поща расте неконтролируемо и запълва дяла с малки файлове. С инструменти като queue-repair или специфични скриптове е възможно да се почисти и възстанови опашката, освобождавайки голям брой inode-и.
Друг типичен случай е този на лог директории, където се натрупват файлове с размер 0 байта или много малко байта поради неправилно конфигурирани ротации на директории. Просто изброяване на директории с ls Може да отнеме много време за отговор, защото има стотици хиляди записи.
Във виртуализационни или контейнерни системи, като например XenServer или Docker среди, е често срещано да се вижда директории с купища стари лог файлове и временни файлове, които са на дни или седмициПочистете стари файлове с команди като:
find /var/log -type f -mtime +2 -print0 | xargs -0 rm
Това може драстично да намали потреблението на inode и да върне системата в стабилно състояние, стига първо да проверите какво изтривате, за да избегнете премахването на диагностични файлове, които може да са ви необходими.
Най-добри практики за избягване на проблеми с тоалетната
Освен гасенето на изолирани пожари, препоръчително е да се възприемат определени рутини за Поддържайте използването на inode на разумни нива и не претоварвайте системата до нейните граници.. Някои полезни препоръки са:
- Периодично следете използването на тоалетната
df -iточно както се следи дисковото пространство или натоварването на процесора. - Редовно почиствайте временните файлове, кешовете и сесиитеизползване на скриптове и
cronза изтриване на файлове, които са на определена възраст (например, по-стари от 7, 14 или 30 дни). - Прегледайте конфигурацията на лога За да се избегне генерирането на множество малки файлове, е по-добре да се редуват лог файловете в по-малко на брой, по-големи файлове, отколкото в хиляди малки файлове.
- Централизирайте данни, които генерират много файлове (като имейли или сесии) на дискове или дялове с достатъчен запас от inode и подходящи параметри за форматиране.
- Преди да създадете нова файлова система, коригирайте параметъра „байтове на inode“ Ако знаете, че ще обработвате много малки файлове, създайте пропорционално повече inode-и.
Може да бъде полезен и в хостинг или сървърни среди с много потребители. Дефинирайте правила за автоматично почистване на директории като изтегляния, временни файлове или стари пощенски папки и се облегнете на Инструменти за системна администрация, задвижвани от изкуствен интелектза да не се натрупват милиони безполезни файлове.
Полезни команди, свързани с inodes в Linux
В допълнение към вече споменатите, е полезно да имате малък арсенал от команди, специално разработени за работа с inodes и тяхното използване.
Преглед на използването на inode за всяка файлова система с df
За да получите обща представа, основната команда е:
df -i
С него можете да разпознаете Кои дялове използват най-много inode и кои все още имат marginТова е първата диагностична стъпка, когато се появят грешки, свързани с пространството, сривове на приложенията или необясними рестартирания.
Броене на inodes в дърво на директории с find и wc
Ако искате да знаете колко inode-а има в дадена директория и нейните поддиректории, можете да използвате:
find /var/log | wc -l
Тази команда обхожда цялото долно дърво /var/log и пребройте колко билета има. Всеки билет съответства на файл или директория и следователно inodeТой е идеален за откриване на сайтове, където броят на файловете е скочил драстично.
Показване на всички файлове, свързани с конкретен inode
В сценарии с твърди връзки може да ви е интересно да знаете кои имена на файлове сочат към един и същ inodeТипичен начин да направите това е с find филтриране по inode:
find /ruta -inum <numero_inodo> -print
По този начин ще видите всички пътища, които препращат към този inode, включително оригиналния файл, копия и резервни копия, които действително споделят едни и същи данни.
Inodes в различни файлови системи и в облака
Въпреки че тези видове проблеми често са свързани с локални сървъри, Inodes също са много добре представени в хостинг решения и облачни услуги, базирани на Unix-подобни системи., като много Linux платформи или дори macOS в настолни среди.
В ext2/ext3/ext4 системи, както вече видяхме, Индексните възли (INodes) се създават при инициализация на файловата система и не могат да бъдат разширявани след това без преформатиране.За разлика от това, в системи като xfs или btrfs, управлението е по-динамично и inode-ите се генерират при необходимост, което намалява риска от изчерпването им, въпреки че не го елиминира напълно.
Във всеки случай, принципът е един и същ: Всеки файл и всяка директория консумират точно един inode, а общият брой е ограничен.Това означава, че независимо дали е на лична машина или в среда на управляван сървър, е важно да не се игнорират предупрежденията за високо използване на inode и да се предприемат действия, преди процентът да достигне 100%.
Всичко, което видяхме, обяснява защо, дори ако дискът показва достатъчно свободно място, Linux сървърът може да откаже да създава повече файлове и да показва грешки, свързани с пространството; inodes са скритата част, която управлява връзката между имена, метаданни и блокове данни, и Да се научим да ги наблюдаваме, интерпретираме и държим под контрол е ключово за гарантиране, че всяка Unix-базирана система функционира стабилно и без изненади..