Что такое inodes и почему они могут кончиться (ликбез)
Иногда пользователь Линукса получает от ОС неожиданное сообщение о том, что файл не может быть сохранён, хотя в разделе всё ещё есть свободное место. Естественно, пользователь недоумевает. Особенно, если он не айтишник. Однако, что же это за препятствие такое возникло? Откуда оно берётся и как с ними бороться? И нужно ли? Давайте разберёмся. Предупреждён – значит, вооружён.
Часто подобное происходит по причине исчерпания inodes. Inode (далее – инода) – это сокращение от «index node» – по-русски – индексный узел. Математически он представляет собой описатель (дескриптор) файла и является базовым понятием, на котором основаны многие юниксные и линуксные файловые системы. Иноды подобны каталогу фундаментальной академической библиотеки, в котором находится информация, связывающая название-автор книг с их физическим местонахождением – комната хранилища, стеллаж, полка. Другими словами, иноды – это данные о данных или метаданные, как любят выражаться айтишники. Линуксная инода содержит достаточно много метаданных:
- размер файла
- идентификатор (ID) устройства, содержащего файл
- ID пользователя-владельца файла
- ID группы пользователей, к которой принадлежит владелец
- права доступа, присвоенные владельцу, группе и т.н. «другим»
- права чтения, модификации и исполнения для владельца, группы и других
- таймштампы моментов последнего доступа и изменения файла
- счётчик количества жёстких ссылок на файл (если он не нулевой, то файл невозможно удалить)
- указатели на блоки (кластеры) диска, в которых размещён файл
- имя папки или блочного устройства, где расположен файл
- размер блока файловой системы (ФС) раздела, в котором находится файл
- количество блоков, занимаемых файлом
Инода не содержит ни таймштампа создания файла, ни его имени. Это атрибуты таблицы директориев (directory table). Когда пользователь пытается получить к файлу доступ, происходит следующее:
- по имени файла в таблице директориев определяется соответствующий ему номер иноды,
- по номеру иноды происходит обращение к Inode table и считываются метаданные,
- начинается работа с файлом, если это возможно.
В некоторых файловых системах, таких как ext3 или ext4, иноды создаются сразу вместе с ФС. При создании ФC количество инодов определяется параметром -i команды mkfs. Чем больше это число, тем меньше инод создаётся вместе с ФС. Если создавать ФС с параметром -O largefile, то это будет равносильно заданию -i 1048576, т.е. 1 шт./Мб. А уменьшать -i можно вплоть до размера блока, который обычно составляет 4 кб.
Увидеть метаданные директория или файла можно командой stat. Например:
stat /home
Увидеть номера инод файлов текущего директория можно командой
ls -i
Посмотреть, как распределились иноды в вашей системе (сколько использовано и сколько свободно) можно командой
df -hTi
Иноды – ловкое изобретение. Именно они позволяет наиболее просто реализовать работу LVM (Logical Volume Manager), с помощью которого, набив компьютер приводами жёстких дисков, можно «сделать» один большой винчестер. Механизм инод ускоряет работу ФС, позволяет значительно уменьшить нарастание фрагментации, но за всё надо платить: метаданным нужно какое-то ограниченное место. Поэтому, если раздел содержит очень много мелких файлов, то может случиться так, что запаса инод на всех не хватит. Некоторые опасливые, но грамотные пользователи даже выводят информацию о свободных инодах в conky, и она постоянно красуется на рабочем столе.
Что же делать, если ВНЕЗАПНО кончились иноды? Можно, конечно, спасти данные на другой носитель и пересоздать ФС раздела. Ужасно, но это Линукс, друзья. А можно поступить разумнее: всю мелочь выгрузить в облако. Если нет Интернета (бывает же такое), можно просто удалить ненужные файлы (они есть у всех), а досадную «мелочь» заархировать. А если нет ни интернета, ни ненужных файлов, ни флэшки под руками? Тогда остаётся одно: закрыть все приложения, убедиться, что ОС не «свопит», перебить с помощью утилиты gparted раздел swap в какой-нибудь пригодный для хранения данных, например, FAT, слить туда часть данных, «мелочь» заархивировать и затем добавить в архив слитые данные. Потом восстановить swap-раздел.
Роль Inode в файловых системах Linux
Оригинал: Inodes and the Linux filesystem
Автор: Tyler Carrigan (Red Hat)
Дата публикации: 9 июня 2020 г.
Перевод: В.Костромин
Дата перевода: 15 июня 2020 г.
Понять строение файловых систем Linux довольно сложно, особенно когда вы погружаетесь в хитросплетение данных и метаданных. Каждый раз, когда вы запускаете команду ls и видите вывод — перечисление файлов, разрешения, владельцев и т.д. — вы должны понимать, что данные о просматриваемых файлах хранятся где-то отдельно от самих файлов и должны вызываться при обращении к файлу. Иноды усердно работают «за кадром», выполняя работу, которую вы не видите. Давайте же посмотрим, что же такое inode и для чего он нужен.
Что такое inode?
Inode – это сокращение от «index node», по-русски – индексный узел. По сути он представляет собой уникальную порцию метаданных в заданной файловой системе. Эта порция метаданных описывает то, что мы называем файлом. Иноды относятся только к определенной файловой системе, не касаясь других. Как ни странно это может показаться, но все иноды хранятся в общей таблице и это иногда вызывает недоумение. Однако каждая файловая система, смонтированная на вашем компьютере, имеет свои собственные inode. Номер inode может использоваться более одного раза, но никогда не может дважды использоваться одной и той же файловой системой. Идентификатор файловой системы в сочетании с номером инода создает уникальную идентификационную метку.
Сколько существует инодов?
Если вы не хотите связываться с математикой, вы можете пропустить этот раздел. В каждой системе имеется множество inode и есть несколько относящихся к ним числовых значений, которые нужно знать. Прежде всего, хотя это и менее важно, теоретическое максимальное число inode равно 2 ^ 32 (приблизительно 4,3 миллиарда inode). Во-вторых, что гораздо важнее, это число inode в вашей системе. Как правило, количество inode составляет 1:16 от объема файловой системы в КБ. Очевидно, что каждая система отличается, поэтому вам нужно рассчитать это значение самостоятельно.
Команды для работы с inode
Есть хорошая новость для тех, кто не любит математику: для этого есть специальная команда. Чтобы узнать количество inode в вашей системе, вы можете использовать команду df с опцией -i , как показано здесь:
Вы можете видеть, что в этом примере мы запустили команду df -i на файловой системе /dev/sda1 . В этой системе всего имеется 524 288 инодов, но только 312 из них используется (примерно 1%).
Номер inode файла
Мы также можем узнать номер inode конкретного файла. Для этого можно использовать команду ls -i с указанием нужного файла. Например:
Номер inode этого файла — 1459027.
Номер inode каталога
Подобно тому, как мы узнали номер inode файла, мы можем посмотреть и номер inode каталога. Для этого снова используем команду ls -i с некоторыми дополнительными опциями. Например:
Как вы можете видеть, мы использовали опцию -i (inodes), а также -l (long format) и -d (directory). Применение этих флажков позволяет нам получить множество информации о каталоге my_articles, включая номер inode, разрешения, владельцы и т.д.
Подведем итог
Если вы хотите узнать больше о файловых системах и их структурах, то inode — это отличная тема для начала. Очень важно знать как помечаются и индексируются самые маленькие единицы данных. Некоторые из более продвинутых операций могут быть выполнены с помощью inode. Например, вы можете открыть индекс и прочитать содержимое файла. Это позволит вам более глубоко понять, какие данные хранятся в inode.
Надеммся, что этот поверхностный обзор послужит для вас отправной точкой для более глубокого изучения inode.
Tyler Carrigan
Tyler работает менеджером в Enable Sysadmin, является ветераном подводного флота и энтузиастом новых технологий! Он впервые познакомился с Red Hat в 2012 году при использовании основанной на Red Hat Enterprise Linux боевой системы в Центре управления ракетами на подводной лодке USS Georgia.
Кое-что об inode
Периодически, с целью переезда в ЦРС собеседуюсь в разных крупных компаниях, в основном Питера и Москвы на должность DevOps. Обратил внимание, что во многих компаниях (во многих хороших компаниях, например в яндексе) задают два сходных вопроса:
- что такое inode;
- по каким причинам можно получить ошибку записи на диск (или например: почему может закончиться место на диске, суть одна).
Как часто бывает, я был уверен, что эту тему знаю хорошо, но как только начал объяснять — обозначились провалы в знаниях. Чтобы систематизировать свои знания, заполнить пробелы и больше не позориться, пишу эту статью, может еще кому пригодится.
Начну «снизу», т.е. с жесткого диска (флешки, SSD и прочие современные штуки отбросим, для примера рассмотрим любой 20 или 80 гиговый старый диск, т.к. там размер блока 512 байт).
Жесткий диск не умеет адресовать свое пространство побайтно, условно оно разбито на блоки. Нумерация блоков начинается с 0. (называется это LBA, подробности тут: ru.wikipedia.org/wiki/LBA)
Как видно из рисунка, блоки LBA я обозначил как уровень HDD. К слову, посмотреть, какой размер блока у вашего диска можно так:
Уровнем выше размечен раздел, один на весь диск (опять же для простоты). Чаще всего используют разметку разделов двух типов: msdos и gpt. Соответственно msdos — старый формат, поддерживающий диски до 2Tb, gpt — новый формат, способный адресовать до 1 зеттабайта 512 байтных блоков. В нашем случае имеем раздел типа msdos, как видно из рисунка, раздел при этом начинается с блока №1, нулевой же используется для MBR.
В первом разделе я создал файловую систему ext2, по умолчанию размер блока у нее 4096 байт, что также отражено на рисунке. Посмотреть размер блока файловой системы можно так:
Нужный нам параметр — «Block size».
Теперь самое интересное, как прочитать файл /home/serp/testfile? Файл состоит из одного или нескольких блоков файловой системы, в которых хранятся его данные. Зная имя файла, как его найти? Какие блоки читать?
Вот тут нам и пригождаются inode. В файловой системе ext2fs есть «таблица», в которой содержится информация по всем inode. Количество inode в случае с ext2fs задается при создании файловой системы. Нужные цифры смотрим в параметре «Inode count» вывода tune2fs, т.е. имеем 65536 штук. В inode содержится нужная нам информация: список блоков файловой системы для искомого файла. Как найти номер inode для указанного файла?
Соответствие имени и номера inode содержится в директории, а директория в ext2fs — это файл особого типа, т.е. тоже имеет свой номер inode. Чтоб разорвать этот порочный круг, для корневой директории назначили «фиксированный» номер inode «2». Смотрим содержимое inode за номером 2:
Как видно, нужная нам директория содержится в блоке с номером 579. В ней мы найдем номер нода для папки home, и так далее по цепочке, пока в директории serp не увидим номер нода для запрошенного файла. Если вдруг кому то захочется проверить, верный ли номер, и есть ли там нужная инфа, это не сложно. Делаем:
В выводе можно прочитать имена файлов в директории.
Вот я и подошел к главному вопросу: «по каким причинам может возникнуть ошибка записи»?
Естественно так случится, если не останется свободных блоков файловой системы. Что можно в этом случае сделать? Кроме очевидного «удалить что-нибудь ненужное», следует помнить, что в файловых системах ext2,3 и 4 есть такая штука, как «Reserved block count». Если посмотреть в листинге выше, то у нас таких блоков «13094». Это блоки доступные для записи только пользователю root. но если нужно оперативно решить вопрос, как временное решение можно сделать их доступными для всех, в результате чего появится немного свободного места:
Т.е. по умолчанию, у вас не доступно для записи 5% дискового пространства, и учитывая объемы современных дисков, это могут быть сотни гигабайт.
Что еще может быть? Еще возможна ситуация, когда свободные блоки есть, а ноды кончились. Такое обычно случается, если у вас в файловой системе куча файлов размером меньше размера блока файловой системы. Учитывая, что на 1 файл или директорию тратится 1 inode, а всего их имеем (для данной файловой системы) 65536 — ситуация более чем реальная. Наглядно это можно увидеть из вывода команды df:
Как хорошо заметно на разделе /var/www, количество свободных блоков файловой системы, и количество свободных нодов сильно различается.
На случай если кончились inode, заклинаний не подскажу, т.к. их нет (если не прав, дайте знать). Так что для разделов в которых плодятся мелкие файлы следует грамотно выбирать файловую систему. Так например в btrfs inode не могут закончиться, т.к. динамически создаются новые при необходимости.