VDS · Решение проблем

Кончилось место на диске

Как быстро найти, что съело диск, освободить гигабайты без риска и разобраться с ловушками: удалённые открытые файлы и закончившиеся inode.

Обновлено 23 августа 2026 г.

Заполненный диск ломает всё сразу: база перестаёт принимать записи, сайт отдаёт ошибки, journalctl отказывается работать, а иногда не пускает даже SSH, потому что нечего записать в журнал сессии. Действовать нужно быстро и по порядку.

Проверить

df -h
df -i

Первая команда — место, вторая — inode. Заполненные inode дают ту же ошибку «No space left on device» при свободных гигабайтах: так бывает, когда в каталоге накопились миллионы мелких файлов (сессии PHP, кэш, очереди).

Занятое место видно и в панели /hosting/vds/<id> — кольцо на вкладке «Обзор». Оно заполняется по данным гостевого агента qemu-guest-agent; если агент удалён, кольцо пустое, а панель покажет команду установки.

Найти виновника

du -xh --max-depth=1 / 2>/dev/null | sort -h | tail -15
du -xh --max-depth=1 /var 2>/dev/null | sort -h | tail -15
ncdu -x /                     # apt install ncdu, интерактивно
find / -xdev -type f -size +500M -exec ls -lh {} \; 2>/dev/null

Флаг -x держит поиск в пределах одной файловой системы и не уводит в /proc и смонтированные каталоги.

Типичные пожиратели: журналы в /var/log, кэш пакетов в /var/cache, образы и тома Docker в /var/lib/docker, дампы баз, забытые архивы в /root и /tmp, файлы старых релизов приложения.

Освободить

journalctl --vacuum-size=200M
apt clean                                   # Debian, Ubuntu
dnf clean all                               # AlmaLinux, CentOS Stream
docker system prune -af --volumes           # осторожно: удалит неиспользуемые тома
find /tmp -type f -mtime +7 -delete

Постоянное ограничение журнала — в /etc/systemd/journald.conf (SystemMaxUse=300M), подробнее в статье Журналы systemd. Для файлов приложения настройте logrotate: без ротации один app.log спокойно вырастает до десятков гигабайт.

Ловушка: удалённый, но открытый файл

Вы удалили гигантский лог, а df показывает то же самое. Пока процесс держит файл открытым, место не возвращается.

lsof +L1 | head -20

Правильное решение — перезапустить службу, держащую файл (systemctl restart nginx), или обнулить файл, не удаляя его:

: > /var/log/nginx/access.log

Ловушка: кончились inode

df -i
find /var/www -xdev -type d -printf '%h\n' | sort | uniq -c | sort -rn | head

Ищите каталог с сотнями тысяч файлов и чистите его по частям, чтобы не положить машину:

find /var/lib/php/sessions -type f -mtime +2 -delete

Если места нет совсем

Когда диск заполнен на 100 % и система еле шевелится, зайдите через вкладку «Консоль» в панели, освободите хотя бы сотню мегабайт (journalctl --vacuum-size=50M почти всегда срабатывает), и продолжайте разбор в нормальном режиме. В совсем тяжёлом случае поможет диск восстановления: машина грузится в SystemRescue, ваш диск виден как /dev/sda, монтируете и чистите со стороны.

Чтобы не повторилось

  • Оповещение по порогу 85 % — см. Оповещения о падении сайта.
  • Ротация всех журналов приложения, а не только системных.
  • Дампы баз и архивы — сразу наружу, а не в /root.
  • Если чистить нечего, а данные растут — переход на ступень с большим диском: 40, 80, 120, 160, 200 и 250 ГБ. Только вверх: диск не сжимается, понижение не предусмотрено.

Не удаляйте наугад файлы из /var/lib и /usr: там лежат данные баз и системные пакеты. Сначала выясните, чей это каталог, и только потом чистите.