Что означает ошибка ENOSPC
Ошибка No space left on device (код ENOSPC) в Linux обычно указывает на нехватку дискового пространства. Однако в контексте inode она означает, что исчерпано количество inode на файловой системе, а не физическое место на диске.
Inode (индексный дескриптор) — это структура, хранящая метаданные файла (размер, права доступа, временные метки, указатели на данные). Каждый файл или каталог занимает один inode. При создании файловой системы задаётся фиксированное количество inode, которое нельзя изменить без пересоздания раздела.
Симптомы:
- Невозможно создать новый файл или каталог, даже если
df -hпоказывает свободное место. - Ошибка при установке пакетов, компиляции программ, работе веб-серверов или баз данных.
- Команды
touch,mkdir,apt installзавершаются сNo space left on device.
Причины возникновения
- Множество мелких файлов — логи приложений, кэш, временные файлы, резервные копии, электронная почта.
- Некорректная работа приложения — бесконечное создание файлов (например, из-за ошибки в скрипте или атаки).
- Файловая система с малым количеством inode — при форматировании с параметром
-i(например,mkfs.ext4 -i 2048) создаётся мало inode на мегабайт. - Скрытые системные файлы — файлы ядра, core-дампы, временные файлы системных служб.
- Файлы с длинными именами или символами —在某些 файловых системах могут занимать дополнительный inode? Нет, каждый файл — один inode, но длинные имена могут занимать больше места в данных, но not inode.
- Повреждение файловой системы — редкий случай, когда inode помечены как использованные, но не привязаны к файлам.
Способы решения
Способ 1: Диагностика и анализ использования inode
Первым делом определите, на каком разделе исчерпаны inode, и найдите "виновников".
- Проверьте использование inode по разделам:
df -i
Пример вывода:Файл.система Inodes IИсп. IДост. Исп% точка монтирования /dev/sda1 6553600 6553599 1 100% /
ЕслиIИсп.близко к общему количеству inode (Inodes) — проблема на этом разделе. - Для ext4/xfs определите общее количество inode:
sudo tune2fs -l /dev/sda1 | grep -i "inode count"
Или для xfs:sudo xfs_info / | grep imaxpct - Найдите каталоги с наибольшим числом файлов:
sudo find / -xdev -printf '%h\n' | sort | uniq -c | sort -rn | head -20
Эта команда покажет 20 каталогов с самым большим количеством файлов (без перехода на другие разделы с-xdev). - Углубитесь в проблемный каталог:
sudo find /var/log -type f | wc -l # пример для /var/log
⚠️ Важно: Удаляйте файлы только после уверенности, что они не нужны. Рекомендуется сделать резервную копию важных данных.
Способ 2: Очистка временных файлов и кэшей
Чаще всего inode исчерпаются из-за накопления временных данных.
- Очистите временные каталоги:
sudo rm -rf /tmp/* sudo rm -rf /var/tmp/*
Убедитесь, что нет открытых файлов в этих каталогах (используйтеlsof | grep /tmp). - Очистите кэш пакетного менеджера:
- Для Debian/Ubuntu:
sudo apt clean - Для RHEL/CentOS/Fedora:
sudo yum clean all - Для Arch Linux:
sudo pacman -Scc
- Для Debian/Ubuntu:
- Удалите старые логи: Проверьте размер
/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). - Очистите кэш браузеров и приложений (если они находятся в домашних каталогах):
rm -rf ~/.cache/*
Способ 3: Удаление ненужных мелких файлов
Если проблема в конкретном каталоге (например, /var/spool/mail или /srv), удалите устаревшие данные.
- Найдите и удалите файлы по шаблону:
# Удаление резервных копий 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 - Архивируйте и удалите старые данные: Если нужно сохранить файлы, но освободить inode, сожмите их в архив (архив занимает один inode):
tar -czf /backup/old-logs.tar.gz /var/log/old-logs/ sudo rm -rf /var/log/old-logs/ - Проверьте каталог почты (если есть почтовый сервер):
sudo find /var/mail -type f | wc -l
Удалите или архивируйте старые письма.
Способ 4: Перенос данных на другой раздел
Если раздел с проблемой (/) маленький и содержит много мелких файлов, перенесите часть данных.
- Создайте точку монтирования и смонтируйте новый раздел:
sudo mkdir /mnt/newdisk sudo mount /dev/sdb1 /mnt/newdisk - Перенесите каталог с большим числом файлов:
sudo rsync -avx /var/log/ /mnt/newdisk/logs/
Убедитесь, что данные скопировались, затем удалите исходные:sudo rm -rf /var/log/*
И создайте symlink:sudo ln -s /mnt/newdisk/logs /var/log - Сделайте запись в
/etc/fstabдля автоматического монтирования после перезагрузки.
Способ 5: Пересоздание файловой системы с большим количеством inode (крайняя мера)
Если раздел можно отформатировать (например, это отдельный диск для данных), пересоздайте его с увеличенным количеством inode.
- Сделайте полную резервную копию данных на другой носитель.
- Размонтируйте раздел:
sudo umount /dev/sdb1 - Отформатируйте с параметром
-i(больше inode на мегабайт):
Для xfs inode выделяются динамически, поэтому эта проблема встречается реже.sudo mkfs.ext4 -i 4096 /dev/sdb1 # 4096 inode на 1MB (по умолчанию ~16384 for 1KB-block) - Восстановите данные и обновите
/etc/fstab.
💡 Совет: При форматировании ext4 используйте
-T largefile4для каталогов с большими файлами (уменьшает количество inode) или-T smallдля множества мелких файлов (увеличивает).
Профилактика
- Регулярный мониторинг:
# Добавьте в crontab (каждый день) 0 2 * * * df -i | grep -E '/( |$)' | awk '$5+0 >= 80 {print "WARNING: " $0}' - Логирование: Настройте ротацию логов (
logrotate) с ограничением количества файлов и сжатием старых. - Ограничьте кэширование приложений: Для веб-серверов (nginx, Apache) настройте очистку кэша. Для почтовых серверов — ограничьте хранение писем.
- Правильное форматирование: При создании разделов для систем с множеством мелких файлов (например, почта, виртуализация) используйте:
sudo mkfs.ext4 -T largefile4 /dev/sdX # для больших файлов sudo mkfs.ext4 -T small /dev/sdX # для мелких файлов
Или укажите явно-i(bytes-per-inode). Меньшее значение-i→ больше inode. - Используйте xfs или btrfs для новых систем, где inode выделяются динамически (xfs) или гибко (btrfs). Но учтите, что btrfs имеет свои особенности.
- Настройте мониторинг через Zabbix/Prometheus: Собирайте метрику
df -iи ставьте алерты при использовании inode >85%. - Регулярная очистка: Добавьте в cron очистку
/tmpи кэша пакетов:0 3 * * * find /tmp -type f -mtime +7 -delete 0 4 * * * apt clean -y - Избегайте создания множества файлов в одном каталоге: Для высоконагруженных систем (например, веб-ло.gz) используйте структуру каталогов по датам или хэшам.