Linux ENOSPCВысокая

Ошибка 'No space left on device': исчерпание inode в Linux

Статья объясняет, что такое исчерпание inode в Linux, почему возникает ошибка 'No space left on device' и как её исправировать. Вы узнаете, как проверить использование inode и освободить место.

Обновлено 16 февраля 2026 г.
15-30 мин
Средняя
FixPedia Team
Применимо к:Ubuntu 20.04+CentOS 8+Debian 11+Все дистрибутивы с ext4/xfs

Что означает ошибка ENOSPC

Ошибка No space left on device (код ENOSPC) в Linux обычно указывает на нехватку дискового пространства. Однако в контексте inode она означает, что исчерпано количество inode на файловой системе, а не физическое место на диске.

Inode (индексный дескриптор) — это структура, хранящая метаданные файла (размер, права доступа, временные метки, указатели на данные). Каждый файл или каталог занимает один inode. При создании файловой системы задаётся фиксированное количество inode, которое нельзя изменить без пересоздания раздела.

Симптомы:

  • Невозможно создать новый файл или каталог, даже если df -h показывает свободное место.
  • Ошибка при установке пакетов, компиляции программ, работе веб-серверов или баз данных.
  • Команды touch, mkdir, apt install завершаются с No space left on device.

Причины возникновения

  1. Множество мелких файлов — логи приложений, кэш, временные файлы, резервные копии, электронная почта.
  2. Некорректная работа приложения — бесконечное создание файлов (например, из-за ошибки в скрипте или атаки).
  3. Файловая система с малым количеством inode — при форматировании с параметром -i (например, mkfs.ext4 -i 2048) создаётся мало inode на мегабайт.
  4. Скрытые системные файлы — файлы ядра, core-дампы, временные файлы системных служб.
  5. Файлы с длинными именами или символами —在某些 файловых системах могут занимать дополнительный inode? Нет, каждый файл — один inode, но длинные имена могут занимать больше места в данных, но not inode.
  6. Повреждение файловой системы — редкий случай, когда inode помечены как использованные, но не привязаны к файлам.

Способы решения

Способ 1: Диагностика и анализ использования inode

Первым делом определите, на каком разделе исчерпаны inode, и найдите "виновников".

  1. Проверьте использование inode по разделам:
    df -i
    

    Пример вывода:
    Файл.система     Inodes IИсп. IДост. Исп% точка монтирования
    /dev/sda1        6553600 6553599     1 100% /
    

    Если IИсп. близко к общему количеству inode (Inodes) — проблема на этом разделе.
  2. Для ext4/xfs определите общее количество inode:
    sudo tune2fs -l /dev/sda1 | grep -i "inode count"
    

    Или для xfs:
    sudo xfs_info / | grep imaxpct
    
  3. Найдите каталоги с наибольшим числом файлов:
    sudo find / -xdev -printf '%h\n' | sort | uniq -c | sort -rn | head -20
    

    Эта команда покажет 20 каталогов с самым большим количеством файлов (без перехода на другие разделы с -xdev).
  4. Углубитесь в проблемный каталог:
    sudo find /var/log -type f | wc -l   # пример для /var/log
    

⚠️ Важно: Удаляйте файлы только после уверенности, что они не нужны. Рекомендуется сделать резервную копию важных данных.

Способ 2: Очистка временных файлов и кэшей

Чаще всего inode исчерпаются из-за накопления временных данных.

  1. Очистите временные каталоги:
    sudo rm -rf /tmp/*
    sudo rm -rf /var/tmp/*
    

    Убедитесь, что нет открытых файлов в этих каталогах (используйте lsof | grep /tmp).
  2. Очистите кэш пакетного менеджера:
    • Для Debian/Ubuntu:
      sudo apt clean
      
    • Для RHEL/CentOS/Fedora:
      sudo yum clean all
      
    • Для Arch Linux:
      sudo pacman -Scc
      
  3. Удалите старые логи: Проверьте размер /var/log и удалите архивированные логи (например, *.gz, *.old), которые не нужны:
    sudo find /var/log -name "*.gz" -type f -delete
    sudo find /var/log -name "*.old" -type f -delete
    

    Не удаляйте активные логи без остановки соответствующих служб (например, journalctl --rotate для systemd).
  4. Очистите кэш браузеров и приложений (если они находятся в домашних каталогах):
    rm -rf ~/.cache/*
    

Способ 3: Удаление ненужных мелких файлов

Если проблема в конкретном каталоге (например, /var/spool/mail или /srv), удалите устаревшие данные.

  1. Найдите и удалите файлы по шаблону:
    # Удаление резервных копий
    sudo find / -name "*.bak" -type f -delete
    # Удаление core-дампов
    sudo find / -name "core.*" -type f -delete
    # Удаление временных файлов приложений (пример для PHP)
    sudo find /var/www -name "*.tmp" -type f -delete
    
  2. Архивируйте и удалите старые данные: Если нужно сохранить файлы, но освободить inode, сожмите их в архив (архив занимает один inode):
    tar -czf /backup/old-logs.tar.gz /var/log/old-logs/
    sudo rm -rf /var/log/old-logs/
    
  3. Проверьте каталог почты (если есть почтовый сервер):
    sudo find /var/mail -type f | wc -l
    

    Удалите или архивируйте старые письма.

Способ 4: Перенос данных на другой раздел

Если раздел с проблемой (/) маленький и содержит много мелких файлов, перенесите часть данных.

  1. Создайте точку монтирования и смонтируйте новый раздел:
    sudo mkdir /mnt/newdisk
    sudo mount /dev/sdb1 /mnt/newdisk
    
  2. Перенесите каталог с большим числом файлов:
    sudo rsync -avx /var/log/ /mnt/newdisk/logs/
    

    Убедитесь, что данные скопировались, затем удалите исходные:
    sudo rm -rf /var/log/*
    

    И создайте symlink:
    sudo ln -s /mnt/newdisk/logs /var/log
    
  3. Сделайте запись в /etc/fstab для автоматического монтирования после перезагрузки.

Способ 5: Пересоздание файловой системы с большим количеством inode (крайняя мера)

Если раздел можно отформатировать (например, это отдельный диск для данных), пересоздайте его с увеличенным количеством inode.

  1. Сделайте полную резервную копию данных на другой носитель.
  2. Размонтируйте раздел:
    sudo umount /dev/sdb1
    
  3. Отформатируйте с параметром -i (больше inode на мегабайт):
    sudo mkfs.ext4 -i 4096 /dev/sdb1   # 4096 inode на 1MB (по умолчанию ~16384 for 1KB-block)
    
    Для xfs inode выделяются динамически, поэтому эта проблема встречается реже.
  4. Восстановите данные и обновите /etc/fstab.

💡 Совет: При форматировании ext4 используйте -T largefile4 для каталогов с большими файлами (уменьшает количество inode) или -T small для множества мелких файлов (увеличивает).

Профилактика

  1. Регулярный мониторинг:
    # Добавьте в crontab (каждый день)
    0 2 * * * df -i | grep -E '/( |$)' | awk '$5+0 >= 80 {print "WARNING: " $0}'
    
  2. Логирование: Настройте ротацию логов (logrotate) с ограничением количества файлов и сжатием старых.
  3. Ограничьте кэширование приложений: Для веб-серверов (nginx, Apache) настройте очистку кэша. Для почтовых серверов — ограничьте хранение писем.
  4. Правильное форматирование: При создании разделов для систем с множеством мелких файлов (например, почта, виртуализация) используйте:
    sudo mkfs.ext4 -T largefile4 /dev/sdX   # для больших файлов
    sudo mkfs.ext4 -T small /dev/sdX        # для мелких файлов
    

    Или укажите явно -i (bytes-per-inode). Меньшее значение -i → больше inode.
  5. Используйте xfs или btrfs для новых систем, где inode выделяются динамически (xfs) или гибко (btrfs). Но учтите, что btrfs имеет свои особенности.
  6. Настройте мониторинг через Zabbix/Prometheus: Собирайте метрику df -i и ставьте алерты при использовании inode >85%.
  7. Регулярная очистка: Добавьте в cron очистку /tmp и кэша пакетов:
    0 3 * * * find /tmp -type f -mtime +7 -delete
    0 4 * * * apt clean -y
    
  8. Избегайте создания множества файлов в одном каталоге: Для высоконагруженных систем (например, веб-ло.gz) используйте структуру каталогов по датам или хэшам.

Часто задаваемые вопросы

Что такое inode и чем он отличается от дискового пространства?
Как быстро проверить, исчерпаны ли inode на разделе?
Можно ли увеличить количество inode после форматирования раздела?

Полезное

Проверьте использование inode
Найдите каталоги с наибольшим числом файлов
Очистите временные файлы и кэши
Удалите ненужные мелкие файлы
Перенесите или архивируйте данные