Что такое inode
Когда ты создаёшь файл в Linux, файловая система выделяет под него inode - фиксированную структуру в служебной области диска, которая хранит:
- тип объекта (файл, директория, symlink, устройство…)
- права доступа (file-permissions) -
rwxбытность для u/g/o - UID и GID владельца
- размер файла
- времена
atime/mtime/ctime - количество имён, ссылающихся на этот inode (link count)
- указатели на блоки данных (где физически лежит содержимое)
Имя файла - это просто строка в записи директории, которая сопоставлена
inode-номеру. Поэтому одно содержимое может иметь несколько имён (hard-link),
а директория - это специальный тип inode со списком пар имя → inode.
Почему это важно
Из этого следует несколько неочевидных вещей:
-
Файл не уничтожается пока есть хотя бы одно имя.
rmснимает имя из директории и уменьшает link count. Когда счётчик доходит до 0 и ни один процесс не держит файл открытым - освобождаются блоки данных. -
Inode - отдельный пул от блоков. На ext4 их количество фиксируется при создании FS. Можно упереться в лимит inode при свободном дисковом месте - классический инцидент с миллионами мелких файлов сессий/кешей.
-
mv внутри одной FS - это переименование (меняется только запись в директории, inode тот же). А между разными FS - это копирование+удаление.
-
Директория тоже занимает inode. На сильно вложенных проектах директории могут быть третьим источником inode-расхода после кешей и логов.