VDS · Резервные копии и диск

Место на диске: куда оно уходит

Как найти, что съело диск, чем опасен удалённый, но открытый файл, что чистить безопасно и почему кольцо занятости в панели может показывать не то.

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

Кончившееся место — авария, которая выглядит как что угодно: база не пишет, сайт отдаёт ошибку, контейнеры перезапускаются. Диск на VDS от 40 ГБ на младшей ступени до 250 ГБ на старшей, и заполняется он почти всегда одними и теми же вещами.

Первые команды

df -h
df -i
sudo du -x -h -d1 / | sort -h | tail -15

df -i не пропускайте: место может быть, а иноды кончиться — тогда «диск полон» при свободных гигабайтах. Виноваты обычно миллионы мелких файлов кеша.

Дальше углубляйтесь в самый крупный каталог:

sudo du -x -h -d1 /var | sort -h | tail
sudo du -x -h -d1 /var/lib | sort -h | tail

Ключ -x держит подсчёт в пределах одной файловой системы и не уводит в примонтированные каталоги.

Обычные виновники

ЧтоКак проверитьЧто делать
Журналы контейнеровdu -sh /var/lib/docker/containers/*/*-json.logОграничить размер, см. журналы
Образы и кеш сборкиdocker system dfdocker image prune, docker builder prune
Системный журналjournalctl --disk-usagejournalctl --vacuum-size=200M
Старые ядра в /bootdf -h /bootapt autoremove --purge
Кеш пакетовdu -sh /var/cache/aptapt clean
Копии, оставленные на местеdu -sh /backupУвезти, см. другую площадку
Загрузки пользователейdu -sh /var/www/uploadsХранилище снаружи или диск больше

Удалённый файл, который занимает место

Классическая загадка: du показывает 5 ГБ, df — 30 ГБ занято. Значит, файл удалили, но процесс держит его открытым, и место не освободится до перезапуска.

sudo lsof +L1 | head -20

В выводе будут процессы и размеры. Лечится перезапуском виновника:

sudo systemctl restart <служба>
docker compose restart <служба>

Никогда не освобождайте место командой rm по работающему файлу журнала. Правильный способ — обнулить: sudo truncate -s 0 /var/log/big.log. Удаление оставит место занятым и вдобавок лишит вас журнала.

Кольцо занятости в панели

На вкладке «Обзор» есть кольцо занятости диска. Оно считается через гостевой агент qemu-guest-agent. Если агент снесён или не запущен, данные не обновляются — панель покажет команду установки. Проверить внутри машины:

systemctl status qemu-guest-agent

Показания агента и df -h должны совпадать. Расхождение чаще всего означает, что часть места занята в примонтированном отдельно разделе, — см. разделы и файловые системы.

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

Заведите задание по расписанию с чисткой и предупреждением:

#!/bin/bash
USED=$(df --output=pcent / | tail -1 | tr -dc '0-9')
if [ "$USED" -gt 85 ]; then
  journalctl --vacuum-size=200M
  apt clean
  docker image prune -f
  echo "Диск занят на ${USED}%" | mail -s "VDS: мало места" you@example.com
fi

Порог 85 % даёт запас на реакцию. Ждать 100 % нельзя: при полном диске часть служб не сможет даже записать журнал о том, что случилось.

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

  1. Освободите пару гигабайт быстрыми средствами: journalctl --vacuum-size=100M, apt clean, docker builder prune -f.
  2. Найдите настоящую причину командами выше — иначе через неделю всё повторится.
  3. Если данные действительно выросли, диск нужно увеличить переходом на ступень выше. Понижение не предусмотрено: диск не сжимается.