← Linux: администрирование
10 мин · просто · Урок 8 из 10

Файловые системы и inode

Что такое inode, почему «место есть, а файл не создаётся» и чем хардлинк отличается от симлинка.

Имя файла и сам файл — разные вещи

В Linux имя файла и его содержимое хранятся отдельно. Имя живёт в каталоге, а всё остальное — в структуре под названием inode: размер, права, владелец, временные метки и указатели на блоки данных на диске. Имени в inode нет.

Номер inode виден через ls -i:

$ ls -i
1310721 app.log   1310733 config.yml

Каталог — это просто таблица «имя → номер inode». Когда ты открываешь файл по имени, система находит по таблице его inode, а уже из inode — данные.

«Место есть, а файл не создаётся»

На ext2, ext3 и ext4 число inode фиксируется в момент создания файловой системы и потом не растёт. Каждый файл занимает один inode. Если файлов очень много и мелких (кеши, сессии, очереди писем), inode-ы кончаются раньше, чем место.

Так устроены не все файловые системы. XFS (по умолчанию в RHEL 9) и Btrfs выделяют inode динамически, по мере надобности, и упереться в их число почти нереально. Но ext4 всё ещё дефолт в Debian и Ubuntu, так что авария ниже вполне живая.

Тогда возникает странная авария: df -h показывает свободное место, но файл не создаётся с ошибкой «No space left on device». Заполнение inode надо проверять отдельно:

$ df -i
Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/vda1     2560000 2560000     0  100% /

IUse% 100% значит, что inode кончились. Лечится удалением мусорных мелких файлов (старые сессии, временные файлы), а не добавлением диска.

Хардлинк и симлинк

Раз имя и inode разделены, на один inode можно повесить несколько имён. Это хардлинк:

ln file.txt hardlink.txt      # ещё одно имя для того же inode

Оба имени указывают на один и тот же inode и одни и те же данные. Удаление одного имени данные не трогает: они исчезнут, только когда удалят последнее имя (счётчик ссылок в inode дойдёт до нуля). Хардлинки работают в пределах одной файловой системы и не делаются на каталоги.

Симлинк (символическая ссылка) устроен иначе: это отдельный маленький файл, внутри которого записан путь к цели.

ln -s /opt/app/current link    # симлинк на путь

Симлинк указывает на имя, а не на inode. Если цель удалить или переименовать, симлинк станет «битым» (показывает в никуда). Зато симлинк может вести на другую файловую систему и на каталог.

Что важно запомнить

Имя файла лежит в каталоге, всё остальное (права, размер, данные) — в inode. Каталог — это таблица «имя → inode».

На ext2/3/4 число inode фиксировано при создании ФС; когда они кончаются, файл не создаётся, хотя df -h показывает место. Проверяй df -i. На XFS и Btrfs inode выделяются динамически, и такой проблемы нет.

Хардлинк — ещё одно имя для того же inode (в пределах одной ФС, не на каталоги). Симлинк — отдельный файл с путём к цели; может быть битым и вести куда угодно.

В следующем уроке разберём файловые дескрипторы: как процессы держат открытые файлы и почему они тоже кончаются.

Подробнее про то, как хардлинки и симлинки живут на уровне inode, читай в уроке «Жёсткие и символические ссылки» трека «Linux: файловая система вглубь».

Прошли материал до конца? Отметьте урок пройденным.