Диск сервера заполнен
Признаки заполненного диска, быстрые шаги для освобождения места и как предотвратить проблему.
На этой странице
Когда диск сервера заполняется, базы данных останавливаются, сайты выдают ошибки, а файлы перестают сохраняться. Команды выполняются на сервере по SSH от имени root (Подключение к серверу по SSH (Windows, macOS, Linux)). Если у сервера подключена услуга «Мониторинг 24/7», динамику заполнения диска можно посмотреть и в панели app.blackbox.md на странице «Мониторинг» (app.blackbox.md/monitoring, боковое меню → «Инфраструктура» → «Мониторинг»).
Доступно: всем, у кого есть root-доступ по SSH к серверу BLACKBOX. Графики на странице «Мониторинг» — для серверов с активной услугой «Мониторинг 24/7». Апгрейд из панели — владельцу сервера.
Признаки заполненного диска
| Признак | Где его видно |
|---|---|
Ошибка No space left on device |
в терминале, при сохранении файла, в apt или dnf, scp или rsync, в логах приложений |
cannot create temp file for here-document при нажатии Tab |
в терминале SSH |
| База данных останавливается, не отвечает или не запускается | systemctl --failed показывает службу базы данных (например, mariadb, mysql или postgresql); в её логе — No space left on device или Disk full |
| Сайт отвечает ошибкой 500 или 502, вход на сайте не сохраняется | в браузере, в логах веб-сервера и PHP |
| В таблице «Ваши серверы» полоса в столбце «Диск» красная (от 90%), а график «Использование диска (%)» приближается к 100% | страница «Мониторинг», только для серверов с услугой «Мониторинг 24/7» (Страница «Мониторинг»). Учитывается только раздел / |
| Оповещение о диске в карточке «Оповещения» или по email | только если для сервера настроены правила мониторинга (Оповещения и уведомления по email) |
Шаг 1. Проверьте место и иноды
df -h
df -idf -h: если в столбцеUse%для/или другого раздела 100% (или почти), диск заполнен. Переходите к шагам 2–5.df -i: если в столбцеIUse%100%, новые файлы создать нельзя, даже когда место ещё есть. Перейдите к разделу «Закончились иноды» ниже.
Шаг 2. Быстро освободите место без риска
Системный журнал: первая команда показывает, сколько он занимает, вторая удаляет его архивы, пока не останется не больше 200 МБ.
journalctl --disk-usage
journalctl --vacuum-size=200MКеш скачанных пакетов:
Ubuntu и Debian
apt clean
apt autoremove --purgeВторая команда удаляет старые ядра и пакеты, которые больше ничему не нужны. Прочитайте список, прежде чем подтверждать.
AlmaLinux и CentOS Stream
dnf clean allШаг 3. Найдите, что занимает место
Выведите папки раздела / по размеру (самые большие — в конце, последняя строка — итог по разделу), затем повторите команду для самой большой папки, например /var:
du -xh --max-depth=1 / 2>/dev/null | sort -h
du -xh --max-depth=1 /var 2>/dev/null | sort -hФайлы больше 500 МБ:
find / -xdev -type f -size +500M -exec ls -lh {} + 2>/dev/nullУдобнее программа ncdu (перемещение стрелками, выход — q). Установите её после шага 2, когда на диске снова появится немного места. В Ubuntu и Debian:
apt update
apt install -y ncduВ AlmaLinux и CentOS Stream пакет берётся из репозитория EPEL:
dnf install -y epel-release
dnf install -y ncduЗатем запустите её:
ncdu -x /| Папка | Что там обычно | Что делать |
|---|---|---|
/var/log |
логи системы и приложений | «Большие логи» ниже |
/var/lib/docker |
образы, контейнеры, логи контейнеров, тома | «Docker» ниже |
/root, /home, /var/www, /var/backups, /tmp |
выгрузки баз данных (.sql, .sql.gz), архивы (.zip, .tar.gz), забытые копии |
«Забытые копии и архивы» ниже |
/var/lib/mysql, /var/lib/postgresql, /var/lib/pgsql |
файлы баз данных | ничего не удаляйте вручную; см. частые вопросы |
/swapfile |
файл подкачки | Добавление файла подкачки (swap) |
Внимание Не удаляйте вручную файлы баз данных (
/var/lib/mysql,/var/lib/postgresql,/var/lib/pgsql) и системные папки (/boot,/etc,/usr,/var/lib/dpkg,/var/lib/rpm). Данные в/var/lib/dockerчистите только командамиdocker; единственное исключение — очистка логов контейнеров, описанная ниже. Удалённое без резервной копии восстановить нельзя.
Шаг 4. Освободите место
Большие логи
Не удаляйте через rm лог, в который программа ещё пишет: место не освободится, пока программа не перезапустится. Очистите его (вместо ПУТЬ_К_ФАЙЛУ укажите путь, найденный на шаге 3):
truncate -s 0 ПУТЬ_К_ФАЙЛУСжатые архивы ротированных логов старше 7 дней:
find /var/log -type f -name "*.gz" -mtime +7 -deleteDocker
Посмотрите, сколько занимают образы, контейнеры и тома, затем удалите образы, которые не использует ни один контейнер, и кеш сборки. Последние две команды перед удалением просят подтверждения.
docker system df
docker image prune -a
docker builder pruneЛоги контейнеров не ограничены по размеру, если вы не задали лимит. Выведите 5 самых больших логов и очистите нужный (вместо ПУТЬ_К_ФАЙЛУ укажите его путь из списка):
du -h /var/lib/docker/containers/*/*-json.log | sort -h | tail -n 5
truncate -s 0 ПУТЬ_К_ФАЙЛУЗатем ограничьте их: Установка Docker и Docker Compose, раздел «Ограничьте логи контейнеров».
Опасно Не запускайте
docker volume pruneи не добавляйте--volumesкdocker system prune. Тома проекта, остановленного командойdocker compose down, считаются неиспользуемыми, и их данные (например, база данных) будут потеряны безвозвратно.
Забытые копии и архивы
Выгрузки баз данных, архивы сайтов и копии, сделанные «на всякий случай», часто так и остаются на сервере. Скопируйте их на свой компьютер или на другой сервер (Передача файлов на сервер (scp, rsync, SFTP)), проверьте копию и удалите файлы с сервера:
rm ПУТЬ_К_ФАЙЛУУдалённые, но ещё открытые файлы
Если после удаления df -h показывает ту же заполненность, какая-то программа всё ещё держит файлы открытыми. Их покажет lsof +L1: в столбце COMMAND — программа, в SIZE/OFF — размер. Перезапустите службу, к которой относится программа (вместо ИМЯ_СЛУЖБЫ укажите её имя, например nginx):
lsof +L1
systemctl restart ИМЯ_СЛУЖБЫЕсли lsof не установлен, установите его. В Ubuntu и Debian:
apt install -y lsofВ AlmaLinux и CentOS Stream:
dnf install -y lsofШаг 5. Перезапустите службы и проверьте результат
df -h /
systemctl --failedКоманда df -h / должна показать свободное место. systemctl --failed покажет упавшие службы, например mariadb, mysql, postgresql, nginx или php8.3-fpm. Перезапустите каждую службу из списка (вместо ИМЯ_СЛУЖБЫ укажите её имя) и откройте сайт:
systemctl restart ИМЯ_СЛУЖБЫОставляйте запас места: на странице «Мониторинг» полоса в столбце «Диск» становится жёлтой с 80%.
Закончились иноды
df -i показывает IUse% 100%, хотя по df -h место есть: на диске слишком много мелких файлов. Обычные причины — сессии PHP, кеш приложения, почтовая очередь и временные файлы. Найдите папки, где больше всего файлов (число слева):
du --inodes -x --max-depth=3 / 2>/dev/null | sort -n | tail -n 20Если в найденной папке лежат сессии или временные файлы, удалите старые, например старше 7 дней (вместо ПУТЬ_К_ПАПКЕ укажите путь к папке). Не применяйте эту команду к папкам с данными сайта (например, с файлами, загруженными пользователями) или базы данных.
find ПУТЬ_К_ПАПКЕ -type f -mtime +7 -deleteСессии PHP хранятся в
/var/lib/php/sessions(Ubuntu, Debian) или/var/lib/php/session(AlmaLinux, CentOS Stream).Кеш приложения очищайте его собственной командой, если она есть.
Почтовая очередь: если вы используете Postfix, команда ниже покажет в последней строке, сколько писем ждёт отправки. Тысячи писем, которые вы не отправляли, — признак взломанного сайта: Сервер взломан или атакован: что делать.
postqueue -p | tail -n 1
Как предотвратить проблему
Ротация логов.
logrotateуже ротирует логи системы и пакетов из репозитория в/var/log. Для логов вашего приложения в другой папке создайте файл/etc/logrotate.d/ПРИЛОЖЕНИЕс таким содержимым:/var/www/ПРИЛОЖЕНИЕ/logs/*.log { weekly rotate 4 compress missingok notifempty copytruncate }Затем проверьте его (команда только имитирует ротацию и ничего не меняет):
logrotate -d /etc/logrotate.d/ПРИЛОЖЕНИЕЛимит системного журнала. Ограничьте размер журнала 200 МБ:
mkdir -p /etc/systemd/journald.conf.d printf '[Journal]\nSystemMaxUse=200M\n' > /etc/systemd/journald.conf.d/size.conf systemctl restart systemd-journaldDocker. Задайте лимит логов контейнеров в
/etc/docker/daemon.jsonи время от времени проверяйтеdocker system df: Установка Docker и Docker Compose.Резервные копии — вне сервера. BLACKBOX не делает автоматических резервных копий сервера, а кнопка «Резервные копии» на карточке сервера не работает. Отправляйте копии на другой сервер и не храните старые выгрузки на том же диске: Стратегия резервного копирования для вашего сервера.
Контроль диска. С услугой «Мониторинг 24/7» вы видите столбец «Диск» и график «Использование диска (%)» (Дополнительные услуги для сервера). Без неё регулярно проверяйте
df -h.
Диск побольше
Кнопка «Апгрейд» на карточке сервера переводит сервер на больший тариф того же семейства. Оплата списывается с баланса, сервер один раз перезагружается: Апгрейд сервера: переход на больший тариф.
| Семейство | Диск при апгрейде |
|---|---|
| Basic | растёт: 20 → 50 → 100 → 200 → 400 GB |
| Стандарт | растёт: 20 → 40 → 80 → 160 GB |
| High-Frequency | растёт: 100 → 200 → 400 GB |
| CPU | остаётся 30 GB |
| High-Frequency Compute | остаётся 50 GB |
- На CPU и High-Frequency Compute апгрейд места не добавляет. Закажите новый сервер из семейства с бо́льшим диском (Тарифы VPS: как выбрать), перенесите данные и удалите старый сервер.
- Перед апгрейдом освободите хотя бы немного места, чтобы службы нормально запустились после перезагрузки, а файловая система смогла расшириться. После апгрейда проверьте
df -h /; если размер прежний, напишите нам. - По тарифам «VPS hosting» и выделенным серверам напишите нам: Как связаться с поддержкой BLACKBOX.
Частые вопросы
Я удалил большие файлы, но df -h показывает то же самое. Почему?
Какая-то программа всё ещё держит эти файлы открытыми. Найдите её командой lsof +L1 и перезапустите соответствующую службу (шаг 4).
df -h показывает свободное место, но ошибка No space left on device не уходит. Почему?
Проверьте df -i: могли закончиться иноды. Посмотрите и на остальные строки df -h: может быть заполнен другой раздел, например /boot или /tmp.
/var/lib/mysql занимает много места, там много файлов binlog.000…. Их можно удалить?
Не через rm. Это бинарные логи MySQL: MySQL 8 включает их по умолчанию и хранит 30 дней. Если вы не используете репликацию, удалите старые средствами самого MySQL:
mysql -e "PURGE BINARY LOGS BEFORE NOW() - INTERVAL 3 DAY;"Поможет ли перезагрузка сервера? Она освободит только место, занятое удалёнными, но ещё открытыми файлами. Остальное останется занятым, а при заполненном диске база данных может не запуститься. Сначала освободите место, затем при необходимости перезагрузите сервер: Перезагрузка, остановка и запуск сервера.
Не удаётся подключиться по SSH. Что делать? Веб-консоли в панели нет. Следуйте статье Не удаётся подключиться по SSH; если не получится, напишите нам и укажите IP-адрес сервера.
Можно попросить AI-ассистента найти, что занимает диск? Да, если у API-токена ассистента есть разрешение «Выполнять любые команды от root на моих серверах». Читайте каждую команду, прежде чем одобрить её, особенно команды удаления: Выполнение команд на сервере через AI.
Может ли команда BLACKBOX почистить диск за меня? Сервер администрируете вы, а поддержка подскажет, что делать. Если хотите, чтобы работу выполнила сама команда, запросите отдельное предложение на администрирование сервера: Профессиональные услуги по запросу: администрирование, DevOps, миграция.