Место есть, а файлы не создаются: кончились inode
Если команда показывает свободное место, а запись всё равно не проходит с сообщением о нехватке места, почти наверняка исчерпаны inode. Каждый файл, даже пустой, занимает одну запись, и их число задано при создании файловой системы.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Массив мелких файлов
Кеши, сессии, очереди писем, временные файлы без очистки. Миллион пустых файлов занимает почти нулевое место и миллион записей.
-
Файловая система создана с малым числом записей
На разделах под большие файлы число записей иногда задают минимальным. Для каталога с мелкими файлами его не хватает.
-
Удалённые файлы всё ещё открыты
Записи освобождаются только после закрытия файла. Процесс, держащий тысячи удалённых файлов, не даёт вернуть записи.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Использование inode по разделам: показатель, который забывают проверять.
df -iКаталоги с наибольшим числом файлов.
sudo find /var -xdev -type f | cut -d/ -f1-4 | sort | uniq -c | sort -rn | headРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Кеши, сессии, очереди писем, временные файлы без очистки. Миллион пустых файлов занимает почти нулевое место и миллион записей.
- Как проверить
-
Посмотрите использование inode и найдите каталог-виновник.
df -i sudo find /var -xdev -type f 2>/dev/null | cut -d/ -f1-4 | sort | uniq -c | sort -rn | head
- Как исправить
- Удалите массив файлов и настройте регулярную очистку. Для каталогов службы это удобно делать таймером или средствами самой программы.
- Почему происходит
- На разделах под большие файлы число записей иногда задают минимальным. Для каталога с мелкими файлами его не хватает.
- Как проверить
-
Посмотрите общее число записей.
df -i /var sudo tune2fs -l /dev/sda2 2>/dev/null | grep -i "inode count"
- Как исправить
- Число записей менять нельзя: файловую систему придётся создать заново с другими параметрами. Как обход — перенесите массив файлов на отдельный раздел.
- Почему происходит
- Записи освобождаются только после закрытия файла. Процесс, держащий тысячи удалённых файлов, не даёт вернуть записи.
- Как проверить
-
Найдите удалённые открытые файлы.
sudo lsof +L1 2>/dev/null | head -20
- Как исправить
- Перезапустите службу, которая их держит.
Пример вывода
Место есть, записи кончились. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ df -h /var
Filesystem Size Used Avail Use% Mounted on
/dev/vda2 50G 22G 26G 46% /
$ df -i /var
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/vda2 3276800 3276800 0 100% /
myapp[1200]: error: open /var/lib/myapp/cache/ab12: no space left on device
Связанные ошибки
- No space left on device в журнале службы Нет места на устройстве: разбор по свободным блокам, по inode, по журналу systemd и по удалённым, но открытым файлам.
- status=239/CACHE_DIRECTORY в systemd Код 239/CACHE_DIRECTORY: не удалось подготовить каталог кеша службы в /var/cache из CacheDirectory=.
- Disk quota exceeded для службы Место на разделе есть, а запись отклоняется: исчерпана дисковая квота пользователя или группы.
- Cannot allocate memory в журнале службы Не удалось выделить память: предел службы, память машины, настройка overcommit, исчерпанные области отображения.
- Docker: no space left on device при запуске контейнеров Раздел с /var/lib/docker заполнен образами и слоями. Как посчитать занятое и что можно удалить безопасно.
- Elasticsearch: max virtual memory areas vm.max_map_count is too low Elasticsearch отказывается стартовать из-за заниженного vm.max_map_count. Как поднять значение и закрепить его.
- Elasticsearch: индексы переведены в режим только для чтения Elasticsearch блокирует запись при нехватке места: пороги watermark. Как снять блокировку правильно.
- Failed with result 'resources' Состояние resources: systemd не смог выделить ресурсы для запуска службы. Чем отличается от кодов 200-й группы и что проверять.
Источники
-
df(1)
Использование inode и ключ -i. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено созданием миллиона пустых файлов на тестовом разделе.