Диск заполнен в Linux: как найти и освободить место на VPS

15 мин чтения 3 просмотров 0
Содержание

Ошибка «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 поможет.

Помог ли вам данный ответ?

Похожие руководства

root@vps: ~ $ ssh-keygen -t ed25519 -C "laptop-2026"$ ssh-copy-id -i ~/.ssh/id_ed25519.pub root@203…$ ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 2222 … Linux-сервер Вход по SSH-ключу в Linux: настройка ключей ed25519 и отключение входа по паролю Как настроить вход по SSH-ключу ed25519 на Linux VPS, права authorized_keys и безопасно отключить вход по паролю. 14 мин чтения 7 Читать root@vps: ~ $ openssl rand -base64 18$ passwd root$ ss -tlnp | grep ':2222' || echo "port 2222 is… Linux-сервер Как безопасно сменить порт SSH и пароль root на Linux VPS Смена порта SSH и пароля root в Linux: sshd_config, SELinux semanage, UFW/firewalld, ssh.socket в Ubuntu и откат через VNC. 15 мин чтения 6 Читать root@vps: ~ $ ss -tulpn$ sshd -T | grep -i '^port'$ nohup sh -c 'sleep 600; ufw disable' >/dev/nu… Linux-сервер Настройка файрвола в Linux: UFW и firewalld на VPS (IPv4 и IPv6) Настройка файрвола Linux через UFW или firewalld: сначала SSH, веб-порты, доступ по IP, IPv6 и восстановление доступа. 16 мин чтения 4 Читать root@vps: ~ $ free -h$ swapon --show$ df -h / Linux-сервер Как добавить swap на Linux VPS (тарифы с 512 МБ и 1 ГБ ОЗУ) Добавление swap на Linux VPS с малым объёмом ОЗУ: файл подкачки через fallocate или dd, fstab и настройка swappiness. 12 мин чтения 2 Читать