Центр помощи

Пошаговые руководства по серверам, сетям и аккаунту.

Linux-сервер

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

Диск заполнен в 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 поможет.

Помог ли вам данный ответ?
Центр помощи
Linux-сервер Вход по SSH-ключу в Linux: настройка ключей ed25519 и отключение входа по паролю Любой сервер с публичным IPv4 через несколько минут после запуска начинают атаковать боты, перебирающие SSH-пароли. В этой инструкции… Linux-сервер Как безопасно сменить порт SSH и пароль root на Linux VPS Перенос SSH с порта 22 не остановит целенаправленную атаку, но уберёт из логов большую часть автоматического сканирования, а смена пароля… Linux-сервер Настройка файрвола в Linux: UFW и firewalld на VPS (IPv4 и IPv6) Только что установленный Linux-сервер отвечает на любом порту, который открыла какая-либо служба, поэтому файрвол — одна из первых вещей,… Linux-сервер Как добавить swap на Linux VPS (тарифы с 512 МБ и 1 ГБ ОЗУ) На облачном сервере с 512 МБ или 1 ГБ ОЗУ база данных, пул PHP-FPM и обновление пакетов легко исчерпывают память одновременно. Тогда OOM… Linux-сервер Установка aaPanel на VPS: пошаговая инструкция по aaPanel (международная версия BaoTa) и защите панели aaPanel — международная версия панели BaoTa — дает веб-интерфейс для управления сайтами, базами данных, версиями PHP, SSL-сертификатами и…
AlipayUnionPayVISAMastercardPayPalUSDTstripe