Решение проблем с ограничением по количеству файлов (inodes)
Около месяца мы боролись с тем, что на сервере постоянно кончаются inodes (по-русски: иноды или айноды). Это индексные дескрипторы файлов. Одна айнода соответствует одному файлу на сервере. В ней хранится некоторая метаинформация, кроме названия и пути к файлу. Подробнее о нашей проблеме — ниже.
Поиск проблемы осложняется тем, что линукс постоянно заявляет, что no space left on device . Но по факту место на самом деле есть (в нашем случае около 5 гигов), но места все равно нет. Значит надо смотреть айноды.
df -h — посмотреть информацию о занятом пространстве на жестком диске
df -i — посмотреть информацию об айнодах
Первоначально я пытался просто удалять некоторые папки, которые содержат очень много файлов. Я считал, что здесь нет никакой проблемы, просто файлов с логами стало слишком много, и их надо немного почистить. Однако освобожденные 55000 айнод забились через 3 дня.
Вечер понедельника
Утро четверга
Это было очень странно. В результате было принято логичное решение найти в системе такую папку, где очень много непонятных файлов.
Чтобы построить дерево всех каталогов и файлов, выполняем команду:
Команду нужно выполнить с root-правами для того, чтобы в выдачу попали все каталоги системы. Если утилита tree не установлена, устаналиваем ее из репозиторией, например так: apt-get install tree .
В нашем случае сгенерировался файл на 73МБ. После его анализа была найдена папка, в которой скопилось очень много файлов. Для упрощения поиска полного пути до папки, выполняем команду
Она покажет нам вес каждой папки и полный путь до нее. Опять же, команда должна выполняться с root-правами.
После того, как был найден полный путь до папки, выяснилось, что в ней содержатся 1098902 файлов на 231 МБ. В получении этих данных помогли команды:
du -h . — подсчет размера текущей папки
ls -f . | wc -l — подсчет количества файлов в текущей папке
Теперь начинаем удалять файлы с помощью
где /path/to/dir — путь до проблемной папки.
После этих операций количество свободных айнод перевалило за миллион. Победа!
Running out of inodes on Ubuntu
So you’re seeing errors on Ubuntu indicating you’re low on disc space. First step of course is to see if the disc is actually full with df you should see something like this:
Check out the Use% column, if you see 100% anywhere in that column then that disc is simply full and you need to delete some files.
If you don’t see 100% then there must be another reason for the out of disc space errors. Let’s check the inodes with df -i the output will be similar to the previous example but this time we’re seeing inode usage. 100% inode usage can cause disc space errors even if the file system is far from full.
Here is a command to find the probblem:
If you see 100% inode usage then that’s likely the problem. A really common thing on Ubuntu is old kernel header files eating up inodes to the point where the system reaches it’s limit.
Let’s see how many kernel versions we have headers for:
It’s fine if there are two or three versions listed but if you’re seeing 10 or more versions this is quite likely the problem. Here’s how we can remove old kernel headers:
If either command fails with a disc space error you may need to manually delete a couple of the oldest header file directories that were listed initially.
Now run the previous command again to list header files, this time you should only see one or two versions.
Sorry, you have been blocked
This website is using a security service to protect itself from online attacks. The action you just performed triggered the security solution. There are several actions that could trigger this block including submitting a certain word or phrase, a SQL command or malformed data.
What can I do to resolve this?
You can email the site owner to let them know you were blocked. Please include what you were doing when this page came up and the Cloudflare Ray ID found at the bottom of this page.
Cloudflare Ray ID: 7a27c3b58d742313 • Your IP: Click to reveal 88.135.219.175 • Performance & security by Cloudflare
Что такое Inode
Inode — это структура данных в которой хранится информация о файле или директории в файловой системе. В файловой системе Linux, например Ext4, у файла есть не только само его содержимое, например, тот текст, но и метаданные, такие как дата создания, доступа, модификации и права. Вот эти метаданные и хранятся в Inode. У каждого файла есть своя уникальная Inode и именно здесь указано в каких блоках находятся данные файла.
Это довольно низкоуровневое понятие, но обычным пользователям приходится взаимодействовать с ним когда эти самые Inode заканчиваются. Возможно вы уже встречались с ошибкой когда место на диске ещё есть, но программа не может создать файл, потому что Inode закончились. В этой статье мы подробно разберемся что такое Inode, а также попытаемся выяснить как избежать связанных с ними проблем.
Что такое Inode в Linux?
Как я уже сказал выше, Inode или I-node или индексный дескриптор — это структура данных, в которой хранятся метаданные файла и перечислены блоки с данными файла. Но начать надо с файловой системы. Файловые системы Ext используют блоки для хранения данных. По умолчанию размер одного блока равен 4092 байта. В начале раздела расположен суперблок, в котором находятся метаданные всей файловой системы, а ним идут несколько зарезервированных блоков, а затем размещена таблица Inode и только после неё блоки с данными. Таким образом, все Inode размещены в начале раздела диска.
Директории — это тоже Inode типа директория, в которых вместо содержимого файла содержится список имён файлов и номера их Inode. Корневая папка в Ext4 имеет номер Inode — 2. Вы можете посмотреть информацию о ней с помощью утилиты debugfs. Утилите в параметрах надо передать диск, на котором расположена файловая система:
sudo debugfs /dev/nvme0n1p5
Затем выполните такую команду:

Здесь указано, что эта Inode имеет тип Directory, права 755. Её владелец и группа root, потому что идентификатор пользователя 0. Чуть ниже расположена информация про время создания, модификации и доступа. А в самом низу находятся блоки с данными этой Inode. Именно там хранится список файлов и папок директории. Вы можете посмотреть содержимое блока командой dump_block:
debugfs: block_dump 9238

Утилита выведет данные в HEX и ASCII формате, и в них будет видно имена папок. Но увидеть номера Inode здесь не получится без дополнительных программ. Проще всего их можно посмотреть с помощью команды ls:

Здесь в первом же столбике находится номер Inode для файла или папки. Для примера можно посмотреть ещё информацию про testfile с номером Inode 1128:
debugfs: stat <1128>

В разделе EXTENTS есть номер блока, в котором находятся данные файла. В данном случае это 6596316. В нём можно посмотреть содержимое файла:
debugfs: block_dump 6596316

Вот так это всё работает на уровне файловой системы. Посмотреть Inode идентификаторы файлов можно также с помощью команды ls. Для этого надо передать ей опцию -i:

Здесь они будут тоже в первой колонке. Обратите внимание, что у каждого файла, папки или символической ссылки уникальный номер Inode. Исключение составляют только жесткие ссылки. Количество Inode в файловой системе ограничено, оно определяется при инициализации файловой системы. Посмотреть текущее количество Inode можно командой tune2fs:
sudo tune2fs -l /dev/nvme0n1p5

Нужная информация находится в поле Inode count. Посмотреть Inode можно с помощью утилиты df передав ей опцию -i:

Как видите, на моём корневом разделе использовано 29% Inode, а блоков у меня уже использовано 95%. Но если бы у меня было очень много мелких файлов, то место бы ещё осталось, а доступные Inode закончились. Тогда бы возникла ошибка создания файла, даже несмотря на то, что место ещё есть. Чтобы избежать такой ситуации надо тщательно планировать как вы будете использовать файловую систему.
Вы не можете изменить количество Inode для существующей файловой системы, зато можете указать для новой с помощью опции -N. Например:
mkfs -t ext4 -N 3000000 /dev/nvme0n1p5
В данном случае будет создана файловая система с тремя миллионами индексов Inode. Ещё можно не указывать точное количество Inode, а указать количество байт в одной Inode, это может быть удобно, если вы знаете средний размер ваших файлов, которые будут хранится в файловой системе. Например:
mkfs -t ext4 -i 2K /dev/nvme0n1p5
В качестве альтернативы, можно использовать файловую систему Btrfs, в которой Inode не могут закончиться потому что они генерируются динамически по мере необходимости.
Выводы
В этой статье мы рассмотрели что такое Inode в Linux, а также что произойдёт если доступное количество Inodes закончатся. Будьте осторожны при создании файловой системы и думайте какие файлы в ней будут размещены и сколько их там будет чтобы избежать проблем с Inode.