Диск заполнен в Linux: как найти и освободить место на VPS
Ошибка «No space left on device» ломает на сервере почти всё: базы данных перестают писать, сайты отдают ошибки, обновления пакетов не ставятся, а иногда невозможно даже нормально войти. В этой инструкции пошагово разобрано, что делать, если диск в Linux заполнен: проверить, закончились блоки или иноды, найти, что занимает место, с помощью du и ncdu, а затем освободить место на диске за счёт журнала systemd, кэша apt/dnf, Docker, огромных логов и удалённых, но всё ещё открытых файлов. Команды приведены для Debian, Ubuntu, CentOS 7 и Rocky Linux / AlmaLinux 8 и 9.
Шаг 1: Проверьте занятость диска командами df -hT и df -i
Сначала определите, какая файловая система заполнена. Диск может быть «полным» и при свободных гигабайтах, если закончились иноды — так бывает, когда приложение создаёт миллионы мелких файлов.
df -hT # space per file system, with type
df -i # inodes: IUse% at 100% also means "No space left on device"
Если Use% равен 100%, переходите к шагу 2. Если высок только IUse%, сразу к шагу 9.
Шаг 2: Найдите большие каталоги и файлы с помощью du
du подсчитывает размер каждого каталога. Ключ -x не выходит за пределы одной файловой системы, поэтому подключённые диски и виртуальные ФС не искажают результат. Спускайтесь вниз уровень за уровнем.
# Largest top-level directories on the root file system
du -xh --max-depth=1 / 2>/dev/null | sort -h | tail -n 15
# Drill down into the biggest one, for example /var
du -xh --max-depth=1 /var 2>/dev/null | sort -h | tail -n 15
# Single files larger than 200 MB
find / -xdev -type f -size +200M -exec ls -lh {} + 2>/dev/null | sort -k5 -h
Шаг 3: Интерактивный анализ диска в ncdu
ncdu сканирует один раз и позволяет перемещаться по дереву стрелками — это гораздо быстрее, чем раз за разом запускать du. Если диск заполнен полностью и установка не проходит, сначала освободите немного места шагом 4 или 5.
# Debian / Ubuntu
apt install -y ncdu
# Rocky Linux / AlmaLinux / CentOS (from EPEL)
dnf install -y epel-release && dnf install -y ncdu
ncdu -x / # arrows to browse, d = delete, q = quit
Шаг 4: Уменьшите журнал systemd (journalctl --vacuum)
При постоянном хранении журнала каталог /var/log/journal может вырасти до нескольких гигабайт. vacuum безопасно удаляет самые старые архивы, а лимит размера не даст проблеме вернуться.
journalctl --disk-usage
journalctl --vacuum-size=200M # or: journalctl --vacuum-time=14d
# Cap the journal permanently
mkdir -p /etc/systemd/journald.conf.d
cat > /etc/systemd/journald.conf.d/size.conf <<'EOF'
[Journal]
SystemMaxUse=200M
EOF
systemctl restart systemd-journald
Шаг 5: Очистите кэш apt / dnf и старые ядра
Скачанные пакеты и старые ядра — быстрый способ вернуть место, особенно на небольших облачных дисках.
# Debian / Ubuntu
apt clean
apt autoremove --purge
# Rocky Linux / AlmaLinux 8, 9
dnf clean all
dnf remove $(dnf repoquery --installonly --latest-limit=-2 -q) # keep 2 newest kernels
# CentOS 7
yum clean all
yum install -y yum-utils && package-cleanup --oldkernels --count=2
Шаг 6: Безопасно разберитесь с большими логами
Логи приложений в /var/log или в каталоге сайта — частая причина переполнения диска. Не удаляйте через rm лог, в который служба ещё пишет: место не освободится (см. шаг 8). Очистите его через truncate и настройте ротацию.
# Log files larger than 100 MB
find /var/log -type f -size +100M -exec ls -lh {} +
# Empty a live log WITHOUT deleting it (the service keeps writing)
truncate -s 0 /var/log/nginx/access.log
# Remove compressed rotated logs older than 14 days
find /var/log -type f -name '*.gz' -mtime +14 -delete
# Dry-run logrotate to see why a log is not rotating
logrotate -d /etc/logrotate.conf
Шаг 7: Освободите место, занятое Docker (docker system prune)
Старые образы, остановленные контейнеры и кэш сборки быстро накапливаются в /var/lib/docker. Сначала проверьте, затем очищайте.
docker system df # what Docker is using
docker system prune # stopped containers, unused networks,
# dangling images and build cache
docker system prune -a # also ALL images not used by a container
# Container logs live here and can grow without limit
du -sh /var/lib/docker/containers/*/*-json.log | sort -h | tail
--volumes, если не уверены: этот ключ безвозвратно удаляет неиспользуемые тома Docker, в которых часто лежат данные баз.Чтобы логи контейнеров снова не заполнили диск, задайте ограничение размера:
# /etc/docker/daemon.json - limit future container logs
{
"log-driver": "json-file",
"log-opts": { "max-size": "50m", "max-file": "3" }
}
# then: systemctl restart docker (applies to newly created containers)
Шаг 8: Найдите удалённые, но открытые файлы командой lsof +L1
Если df показывает, что диск полон, а du не находит, куда делось место, обычно какой-то процесс держит открытым уже удалённый файл. Место вернётся только после того, как процесс закроет файл.
# Debian / Ubuntu: apt install -y lsof | Rocky / AlmaLinux: dnf install -y lsof
lsof +L1
# COMMAND PID ... SIZE/OFF NLINK NAME
# php-fpm 1234 ... 4.2G 0 /var/log/app/debug.log (deleted)
# Fix 1: restart the service holding the file
systemctl restart php-fpm
# Fix 2: truncate it through /proc (PID 1234, file descriptor 7 from "ls -l /proc/1234/fd")
: > /proc/1234/fd/7
Шаг 9: Устраните «No space left» из-за нехватки инодов
Если df -i показывает 100%, ищите каталоги с огромным количеством мелких файлов: сессии PHP, почтовые очереди, кэш, временные загрузки.
# Directories that contain the most files
find / -xdev -type f 2>/dev/null | cut -d/ -f2-4 | sort | uniq -c | sort -n | tail -n 10
Очистите проблемный каталог и настройте приложение на автоматическое удаление старых файлов.
Частые вопросы
Почему df и du показывают разные значения?
Чаще всего из-за удалённых, но открытых файлов (шаг 8). Разницу дают также файлы, скрытые под точкой монтирования, и место, которое ext4 резервирует для root (обычно 5%).
Можно ли удалить всё содержимое /var/log?
Нет. Удаляйте старые ротированные файлы .gz и очищайте большие активные логи, но сохраняйте структуру каталогов: некоторые службы не запускаются без своего каталога логов.
Диск постоянно заполняется. Можно ли увеличить объём?
Сначала найдите причину по шагам выше. Если данным действительно нужно больше места, облачные серверы JUSTG можно расширить дополнительным SSD — проверьте варианты апгрейда в личном кабинете или создайте тикет.
Если место на диске Linux-сервера так и не удалось освободить, создайте тикет по адресу https://www.justg.com/submitticket.php — техническая поддержка JUSTG поможет.