Skip to content
VDS · Вирішення проблем

Закінчилося місце на диску

Як швидко знайти, що з'їдає диск, безпечно звільнити гігабайти та зрозуміти підводні камені: видалені відкриті файли й вичерпані inode.

Оновлено 23 серпня 2026 р.

Повний диск ламає все одразу: база даних перестає приймати записи, сайт повертає помилки, journalctl відмовляється працювати, а іноді навіть SSH не пускає вас усередину, бо вже нікуди писати журнал сесії. Діяти потрібно швидко й послідовно.

Перевірка

df -h
df -i

Перша команда показує місце, друга — іноди. Заповнені іноди дають ту саму помилку "No space left on device" навіть за вільних гігабайтів: так буває, коли в каталозі накопичилися мільйони дрібних файлів (сесії PHP, кеш, черги).

Ви також можете побачити використане місце в панелі за адресою /hosting/vds/m/<id> — кільце на вкладці "Overview". Воно заповнюється з даних, які передає 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, interactive
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           # careful: will remove unused 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

Пастка: закінчилися іноди

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% і система ледве ворушиться, увійдіть через вкладку "Console" в панелі, звільніть хоча б сотню мегабайтів (journalctl --vacuum-size=50M спрацьовує майже завжди) і продовжуйте діагностику як звичайно. У зовсім кепському випадку допоможе рятувальний диск: машина завантажується в SystemRescue, ваш диск з'являється як /dev/sda, ви монтуєте його й прибираєте ззовні.

Щоб це не повторилося

  • Сповіщення на порозі 85% — дивіться Сповіщення про простої сайту.
  • Ротуйте всі логи застосунків, а не лише системні.
  • Надсилайте дампи баз даних та архіви за межі сервера одразу, а не тримайте їх у /root.
  • Якщо прибирати вже нічого, а дані постійно зростають, переходьте на тариф із більшим диском: 40, 80, 120, 160, 200 і 250 ГБ. Лише апгрейди: диски не можна зменшувати, а даунгрейди недоступні.

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