Практика Руководство

Игровой сервер заполнил диск: поиск причин и безопасная очистка

Диагностика переполнения диска на игровом сервере Linux: проверка inodes, поиск удерживаемых удалённых файлов и ротация журналов.

Игровой сервер заполнил диск: поиск причин и безопасная очистка

Когда игровой сервер внезапно завершает работу с ошибкой No space left on device, администраторы часто в панике удаляют случайные файлы, рискуя повредить базу сохранений. Неконтролируемый рост дискового пространства обычно вызван разрастанием системных журналов, дампов памяти, неуправляемых консольных логов или старых архивов бэкапов.

Данное руководство разбирает системный алгоритм выявления причин переполнения диска на Linux VPS, безопасного освобождения пространства без повреждения игровых миров и настройки автоматической ротации.

Диагностика: блоки диска или исчерпание inodes#

Ошибка записи может возникнуть даже в том случае, если свободное дисковое пространство визуально отображается в проводнике. В файловых системах Linux пространство распределяется как по блокам данных, так и по индексным дескрипторам (inodes).

Сначала проверьте доступный объем физических блоков диска:

bash
df -h /

Если утилита показывает свободные гигабайты, но создание любого тестового файла через touch /tmp/test завершается ошибкой, проверьте таблицу inodes:

bash
df -i /

Исчерпание inodes происходит при накоплении миллионов крошечных файлов (например, кэш генерации карты, сессионные токены или логирование каждого сетевого пакета). Если процент использования inodes (IUse%) равен 100%, сервер не сможет записать даже однобайтовый файл сохранения.

Для поиска директорий с наибольшим весом используйте утилиту du с ограничением глубины:

bash
du -ahx / 2>/dev/null | sort -rh | head -n 20

Поиск удерживаемых дескрипторов удалённых файлов#

Распространённая проблема на игровых серверах: администратор удалил гигантский лог rm server_console.log, но утилита df продолжает показывать 0 байт свободного места.

В Linux удаление файла через rm лишь удаляет имя файла из каталога. Если запущенный процесс игрового сервера продолжает держать этот файл открытым, блоки на диске остаются занятыми до закрытия дескриптора или перезапуска процесса.

Найдите удерживаемые файлы с помощью команды lsof:

bash
lsof +L1 2>/dev/null | grep -E "(deleted|log)"

Вы увидите идентификатор процесса (PID) и номер файлового дескриптора (FD). Если перезапустить сервер прямо сейчас нельзя из-за активной игровой сессии, освободите дисковые блоки обнулением содержимого через псевдофайловую систему /proc:

bash
truncate -s 0 /proc/$(pgrep -f "dedicated")/fd/1 2>/dev/null || true

Безопасная очистка системных журналов и кэша#

Перед вмешательством в файлы игрового мира очистите временные буферы и системные журналы, которые не влияют на работу игрового процесса:

bash
journalctl --vacuum-size=500M --vacuum-time=7d

Далее проверьте и удалите временные пакеты установщика SteamCMD и дампы сбоев:

bash
rm -rf /tmp/*.dmp /tmp/dumps /var/tmp/*
rm -rf ~/.steam/appcache ~/.local/share/Steam/package/tmp

Проверьте директорию краш-дампов операционной системы. Если сервер аварийно падал несколько раз, ядро могло сохранить дампы памяти core размером в несколько гигабайт каждый:

bash
find / -maxdepth 3 -name "core.[0-9]*" -type f -exec rm -f {} + 2>/dev/null

Настройка ротации логов и защита от переполнения#

Чтобы предотвратить повторное заполнение накопителя консольным выводом, настройте штатный демон logrotate. Создайте файл конфигурации для игрового лога:

bash
cat << 'EOF' | sudo tee /etc/logrotate.d/gameserver
/opt/gameserver/*.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    copytruncate
}
EOF

Параметр copytruncate критически важен: он копирует текущий лог в архив и обрезает исходный файл без перезапуска процесса и без разрыва дескрипторов.

Для изоляции серверных служб и автоматического мониторинга дисковых квот удобно использовать возможности панели управления серверами, где разделы данных отделены от системного корня, а метрики заполнения диска отслеживаются превентивно.

Источники#