Як Linux бачить файли: розбір роботи Inode

Як Linux бачить файли: розбір роботи Inode – ITEDU Blog

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

У світi Unix-подібних операційних систем роль такої картки виконує Inode (скорочення від Index Node або індексний дескриптор).

Розберемося, як влаштована ця структура та як правильно працювати з інодами на практиці.

Як Linux бачить ваші файли: будова Inode

Для користувача файл — це ім’я (наприклад, document.pdf) і його вміст. Але для операційної системи файл ділиться на дві принципово різні частини:

  1. Самі дані (текст, зображення, код), які зберігаються в блоках диска.
  2. Метадані (інформація про файл), які зберігаються в Inode.

Inode не містить імені файлу та самих даних. Він зберігає лише інформацію про дані та вказівки на те, де ці дані шукати.

Що зберігається всередині Inode

Коли ви створюєте файл, система виділяє для нього один Inode, куди записуються такі метадані:

  • Розмір файлу у байтах.
  • Права доступу.
  • Числові ідентифікатори користувача (UID) та групи (GID).
  • Тип об’єкта (звичайний файл, каталог, символьне посилання, пристрій тощо).
  • Часові мітки:
    • atime — час останнього читання/відкриття;
    • mtime — час останньої зміни вмісту;
    • ctime — час останньої зміни самого Inode.
  • Лічильник, який показує, скільки імен або жорстких посилань вказують на цей Inode.

Де ж зберігається ім’я файлу

Ім’я файлу зберігається в директорії. У Linux каталог — це теж файл особливого типу. Всередині нього міститься проста таблиця з двох колонок: Ім’я файлу → Номер Inode.

Коли ви відкриваєте файл /home/user/photo.jpg, система робить наступне:

  1. шукає в каталозі запис photo.jpg.
  2. знаходить відповідний номер Inode (наприклад, #142583).
  3. звертається до таблиці Inode за цим номером.
  4. зчитує права доступу (чи дозволено вам відкрити файл) і адреси блоків на диску.
  5. зчитує самі блоки даних з диска й відображає вам картинку.

Як Inode знаходить дані

Розмір одного Inode фіксований — зазвичай 256 байт у файловій системі ext4. Як у таку маленьку картку вмістити адреси блоків для файлу розміром у десятки гігабайт?

Для цього використовується каскадна система вказівників:

  • Прямі вказівники (Direct Pointers)
    Зазвичай їх 12. Вони вказують безпосередньо на блоки з даними. Якщо файл маленький (до кількох десятків кілобайт), система зчитує його миттєво без додаткових переходів.
  • Одинарний непрямий вказівник (Single Indirect Pointer)
    Вказує на блок, який сам повністю складається з адрес інших блоків даних.
  • Подвійний непрямий вказівник (Double Indirect Pointer)
    Вказує на блок, який містить адреси блоків з адресами і тільки ті вказують на дані.
  • Потрійний непрямий вказівник (Triple Indirect Pointer)
    Додає ще один рівень вкладеності для файлів критично великих розмірів.

Допоміжні технології

Inline Data: якщо файл зовсім крихітний, деякі файлові системи можуть зберегти його вміст прямо всередині самого Inode, не виділяючи окремий блок на диску. 

Extents: у сучасних версіях ext4 замість довгого списку окремих блоків часто використовуються екстенти — записи вигляду «починаючи з блоку №100, наступні 500 блоків належать цьому файлу».

Як працюють посилання через Inode: різниця між жорсткими та символічними 

Механізм інодів робить дуже простою для розуміння тему посилань у Linux, де початківці часто плутаються. 

Жорсткі посилання (Hard Links)

Жорстке посилання — це просто ще одне ім’я для того самого Inode.

  • Оригінальний файл і всі створені жорсткі посилання вказують на єдину картку метаданих.
  • Якщо ви видалите початковий файл, дані не зникнуть. Вони залишаться на диску доти, доки ви не видалите всі жорсткі посилання, пов’язані з цим Inode.
  • Створити жорстке посилання можна лише в межах одного розділу диска, адже номери Inode унікальні тільки для конкретної файлової системи.

Символічні посилання (Symbolic Links)

Символічне посилання — це аналог звичайного «ярлика» у Windows.

  • Для такого посилання створюється новий файл зі своїм власним номером Inode.
  • У блоці даних цього файла зберігається лише текстовий шлях до оригінального об’єкта.
  • Якщо видалити або перейменувати оригінальний файл, символічне посилання збережеться, але перестане працювати (буде вказувати «внікуди»).
  • На відміну від жорстких посилань, символічні можна вільно створювати між різними розділами диска та файловими системами.

Основні команди для роботи з Inode

Розглянемо корисні інструменти Linux для діагностики та налаштування.

1. Перевірка номерів Inode для файлів

Команда ls з прапорцем -i (або -li для детального списку) виводить номер Inode у першій колонці:

ls -li /

Результат:

131073 drwxr-xr-x   2 root root  4096 Aug 10 12:00 bin
 6160385 drwxr-xr-x 150 root root 12288 Aug 12 10:30 usr

2. Перевірка залишку Inode на дисках

Використовуйте команду df з прапорцем -h (зручний формат) та -i (інформація про Inode):

df -hi

Приклад виводу:

Filesystem     Inodes IUsed IFree IUse% Mounted on
/dev/sda5        1.9M  200K  1.7M   11% /

Якщо колонка IUse% досягає 100% — настав час очищати дрібні файли або розширювати таблицю.

Детальніше про прапорці та параметри виводу можна прочитати в офіційній документації man-сторінок Linux.

3. Пошук каталогів, які забирають найбільше Inode

Якщо номери Inode вичерпуються, знайти винуватця можна за допомогою такої комбінації команд (рахує кількість файлів у кожній папці поточного каталогу):

find . -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n\

4. Глибокий аналіз через debugfs (для експертів)

Утиліта debugfs дозволяє зазирнути під капот файлової системи ext4:

sudo debugfs /dev/sda5

Всередині режиму налагодження ви можете переглянути детальний стан конкретного Inode: 

debugfs: stat <6160385>

Ви побачите точні права доступу, розмір, часові мітки та конкретні номери блоків диска, закріплені за об’єктом.

Як запобігти проблемі з обмеженням Inode?

  • Задати кількість Inode при форматуванні диска
    Якщо ви знаєте, що на сервері зберігатиметься величезна кількість маленьких файлів, збільште кількість Inode на етапі створення файлової системи за допомогою утиліти mkfs:
# Створити 10 мільйонів Inode:
sudo mkfs.ext4 -N 10000000 /dev/sda5

# Або вказати створювати 1 Inode на кожні 4 КБ простору (частіше 16 КБ):
sudo mkfs.ext4 -i 4096 /dev/sda5
  • Використовувати сучасно спроектовані файлові системи
    Такі файлові системи, як Btrfs, XFS або ZFS, використовують динамічне виділення Inode. Вони створюють нові індексні дескриптори в міру потреби, поки на диску є фізичне вільне місце, тому проблема жорсткого ліміту Inode у них відсутня.
  • Безперервне оновлення систем без перезавантаження
    Завдяки тому, що процеси в Linux звертаються до файлів через відкриті дескриптори Inode, ви можете оновлювати системні бібліотеки «на льоту». Якщо один процес читає стару версію файлу, а оновлення записує нову, система просто створить новий Inode для нової версії. Старий процес спокійно допрацює зі своїм Inode, а всі нові виклики використовуватимуть новий.

Підсумок

Головні тези, які варто запам’ятати ↓

  1. Один файл = один Inode (окрім випадків використання жорстких посилань).
  2. Inode не містить імені файлу — ім’я зберігається в каталозі.
  3. Стандартні файлові системи (ext4) мають фіксований ліміт Inode, який контролюється командою df -i.
  4. Жорсткі посилання ділять один Inode між декількома іменами, а символічні — створюють новий Inode-ярлик.

Якщо тема Inode стала для вас першим зануренням у Linux і ви хочете системно розібратися в цій темі — запрошуємо на курси з Linux від ITEDU

У нас є навчальні програми для будь-якого рівня підготовки. Обирайте свій напрямок та розвивайте професійні навички разом із практиками! 

Залишити відповідь

Дякуємо, що поділились