Перейти к содержимому

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

Облачные серверы3 мин чтения

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

Содержание

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

Сколько места

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        40G   39G  120M 100% /

Смотрите строку с / — это системный диск, — и строки своих дополнительных дисков. Use% 100 — места нет.

Если место вроде бы есть, а файлы не создаются с ошибкой No space left on device, проверьте df -i. Это число файлов, которое помещается на диск. Кончается оно от миллионов мелких файлов — обычно это кэш сайта или сессии PHP.

Что занимает место

sudo du -xh -d 1 / | sort -h

Команда покажет размер каждой папки в корне, самые большие — внизу. Дальше спускайтесь в самую большую: sudo du -xh -d 1 /var | sort -h, и так далее. Ключ -x не даёт уйти на другие диски.

Удобнее программа ncdu: она считает один раз, а по папкам вы ходите стрелками.

sudo apt install ncdu     # AlmaLinux: sudo dnf install ncdu, из EPEL
sudo ncdu -x /

Самые большие файлы целиком:

sudo find / -xdev -type f -size +500M -exec ls -lh {} +

Что обычно можно удалить

Журнал systemd

journalctl --disk-usage
sudo journalctl --vacuum-size=200M

Оставит последние 200 МБ журнала. Чтобы он больше не разрастался, задайте предел:

sudo mkdir -p /etc/systemd/journald.conf.d
printf '[Journal]\nSystemMaxUse=200M\n' | sudo tee /etc/systemd/journald.conf.d/size.conf
sudo systemctl restart systemd-journald

Старые журналы программ

В /var/log файлы с цифрой или .gz в конце — syslog.2.gz, access.log.3.gz — это уже прошедшие ротацию старые журналы, их можно удалить. Если быстро растёт сам текущий журнал, посмотрите, что в нём: часто это одна и та же ошибка тысячи раз в минуту — её и нужно исправить.

Внимание Журнал, в который программа пишет прямо сейчас, не удаляйте через rm: место не освободится, пока программу не перезапустят. Очистите файл, не удаляя его: sudo truncate -s 0 /var/log/имя.log.

Кэш пакетов и старые ядра

sudo apt clean && sudo apt autoremove --purge    # Ubuntu, Debian
sudo dnf clean all                                # AlmaLinux
sudo pkg clean -a && sudo pkg autoremove          # FreeBSD

autoremove удаляет старые ядра и пакеты, которые больше ничему не нужны. AlmaLinux сам хранит не больше трёх ядер.

Docker

docker system df
docker system prune

prune удалит остановленные контейнеры, ненужные сети, образы без имени и кэш сборки. С ключом -a — ещё и все образы, которые не использует ни один контейнер. Тома с данными без --volumes не трогаются. Ещё одна частая причина — журналы контейнеров, которые по умолчанию растут без ограничений: как их ограничить.

Забытые копии

Частая находка — старые архивы сайта и выгрузки базы, сделанные руками «на всякий случай»: посмотрите /root, /home, /var/backups и папку сайта.

Удалили, а место не освободилось

Значит, файл ещё открыт программой: она продолжает в него писать, и место занято, пока она работает. Найти такие файлы:

sudo lsof +L1

Если команды нет — поставьте пакет lsof. Перезапустите программу из списка, например sudo systemctl restart nginx, — место освободится.

Увеличить диск

Если места не хватает постоянно, увеличьте системный диск на вкладке «Ресурсы» в личном кабинете или добавьте отдельный диск для данных — Дополнительный диск. Раздел системного диска растянется сам после перезагрузки сервера. Пока у сервера есть снимки, диск не увеличится — сначала удалите их.

Не нашли ответ? Напишите в поддержку — подскажем.