Файловые системы и 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: файловая система вглубь».
Прошли материал до конца? Отметьте урок пройденным.
Прогресс сохранён в этом браузере
Почистишь историю или откроешь с телефона, и отметки пропадут. Оставь почту, они переедут в аккаунт. Пароль придумывать не нужно.
Готово. теперь в аккаунте: прогресс виден с любого устройства. Мой прогресс