Перейти к содержанию
Innovialabs

Закончилось место на диске Linux: как найти и освободить

Практика3 мин

Коротко

Проверьте df -h и df -i, найдите крупные папки через du или ncdu, очистите старые логи, Docker и кэши пакетов, а затем настройте logrotate, чтобы проблема не вернулась.

Коротко: порядок действий

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

  1. Понять, какой раздел заполнен: df -h.
  2. Проверить inode: df -i.
  3. Найти, что занимает место: du или ncdu.
  4. Безопасно очистить: логи, Docker, кэши.
  5. Настроить ротацию, чтобы ситуация не повторилась.

Не удаляйте файлы наугад в /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.

И главное — настройте мониторинг заполнения диска с оповещением заранее, а не когда сервис уже упал.

Частые вопросы

Нет. Часть файлов нужна службам, а удаление открытых логов не освободит место. Используйте journalctl --vacuum-*, truncate и logrotate.

Поможем с этим

Если хотите не разбираться самим, а получить результат — этим мы занимаемся каждый день.

Обсудить проект

Читайте также

Есть идея или задача? Расскажите нам

Ответим в течение рабочего дня и предложим решение. Консультация бесплатная.