Иногда пользователь Линукса получает от ОС неожиданное сообщение о том, что файл не может быть сохранён, хотя в разделе всё ещё есть свободное место. Естественно, пользователь недоумевает. Особенно, если он не айтишник. Однако, что же это за препятствие такое возникло? Откуда оно берётся и как с ними бороться? И нужно ли? Давайте разберёмся. Предупреждён – значит, вооружён.
Часто подобное происходит по причине исчерпания 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-раздел.
А можно ли вообще без инод? Да, можно. Надо либо использовать LVM ( http://habrahabr.ru/post/67283/ ) - тогда вы без проблем добавите ресурс и под метаданные, и под данные, «откусив» его от другого тома, либо изначально воспользоваться ФС, не оперирующей инодами, например, reiserfs. Правда, последняя неслабо грузит процессор. Но эти меры, думается, больше подходят для любителей экзотики. Обычным пользователям достаточно время от времени следить за процентом свободных инод вышеприведенными командами.
Успехов!
Комментарии
Хотелось бы знать, КТО это в редакции увлекается вставками неавторских ссылок? Не нужно пояснять такое общеизвестное, как "айтишник", "винчестер", "Линукс", "флешка", "процессор"!
mike, это делаю я, это нужно для поискового продвижения сайта.
Ну раз нужно, то нет возражений.