Закончилось место на диске Linux: как найти и освободить
Практика3 минРедакция Innovialabs
Коротко
Проверьте df -h и df -i, найдите крупные папки через du или ncdu, очистите старые логи, Docker и кэши пакетов, а затем настройте logrotate, чтобы проблема не вернулась.
Коротко: порядок действий
Ошибка No space left on device означает одно из двух: закончились байты или закончились inode (записи о файлах). Действуйте по шагам:
- Понять, какой раздел заполнен:
df -h. - Проверить inode:
df -i. - Найти, что занимает место:
duилиncdu. - Безопасно очистить: логи, Docker, кэши.
- Настроить ротацию, чтобы ситуация не повторилась.
Не удаляйте файлы наугад в /var или /usr — сначала выясните, что это.
Шаг 1. Какой раздел заполнен
df -h
Смотрите на колонку Use% и Mounted on. Часто заполнен не весь диск, а отдельный раздел: /, /var или /boot.
Шаг 2. Найти виновника
Самые тяжелые папки на корневом разделе:
sudo du -xh --max-depth=1 / | sort -rh | head -20
Флаг -x не дает уходить на другие разделы. Дальше спускайтесь глубже: /var, /var/log, /home, /opt.
Удобнее интерактивно — ncdu:
sudo apt install ncdu # или dnf install ncdu
sudo ncdu -x /
Можно ходить по папкам стрелками и видеть размеры сразу.
Крупные отдельные файлы:
sudo find / -xdev -type f -size +500M -exec ls -lh {} \;
Шаг 3. Типичные виновники и как их чистить
Логи. Системный журнал systemd может разрастись:
journalctl --disk-usage
sudo journalctl --vacuum-size=500M
Логи приложений в /var/log или в папке проекта: если файл пишется прямо сейчас, не удаляйте его через rm, а обнулите — sudo truncate -s 0 /var/log/app.log.
Docker. Старые образы, остановленные контейнеры, неиспользуемые тома и кэш сборки:
docker system df
docker system prune
docker image prune -a
Флаг --volumes удаляет и неиспользуемые тома — в них могут быть данные баз. Используйте его только если точно знаете, что там. Логи контейнеров тоже растут: ограничьте их в настройках logging driver (max-size, max-file).
Кэши пакетов:
sudo apt clean # Debian/Ubuntu
sudo dnf clean all # RHEL/Fedora
Также проверьте кэши npm, pip и сборок CI в домашних папках, старые бэкапы и дампы баз.
Удаленный файл, а место не освободилось
Если удалить файл, который держит открытым процесс, место освободится только после закрытия файла. Найти такие файлы:
sudo lsof +L1
Перезапустите процесс, который их держит, — и место вернется.
Закончились inode
df -h показывает свободное место, но файлы не создаются — проверьте df -i. Если IUse% около 100%, виновато огромное количество мелких файлов: сессии, кэш, временные файлы, письма в очереди.
Найти папку с большим числом файлов:
sudo du --inodes -x / 2>/dev/null | sort -rn | head -20
Удалите ненужное и исправьте причину: например, настройте очистку старых сессий.
Шаг 4. Настроить ротацию логов
logrotate архивирует и удаляет старые логи по расписанию. Пример для приложения — файл /etc/logrotate.d/myapp:
/var/www/myapp/logs/*.log {
daily
rotate 14
compress
missingok
notifempty
copytruncate
}
Проверить без применения: sudo logrotate -d /etc/logrotate.d/myapp. Для journald задайте лимит SystemMaxUse в /etc/systemd/journald.conf.
И главное — настройте мониторинг заполнения диска с оповещением заранее, а не когда сервис уже упал.