LinuxВысокая

Linux Диск Полный: Быстрое Освобождение Места Пошагово

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

Обновлено 14 февраля 2026 г.
10-15 мин
Низкая
FixPedia Team
Применимо к:Ubuntu/Debian 20.04+CentOS/RHEL 8+Arch LinuxЛюбой дистрибутив с systemd

Linux Диск Полный: Быстрое Освобождение Места Пошагово

Ситуация, когда на Linux-сервере или рабочей станции внезапно появляется ошибка «No space left on device», знакомая многим администраторам и пользователям. Система перестаёт работать корректно: не устанавливаются обновления, не пишутся логи, не работают базы данных. Эта проблема критична и требует немедленного решения.

В этом гайде вы получите конкретный, пошаговый план по диагностике и освобождению дискового пространства в Linux. Мы рассмотрим только рабочие команды, актуальные для большинства дистрибутивов (Ubuntu, Debian, CentOS, RHEL, Arch), и дадим рекомендации по профилактике.

🔍 Шаг 1: Диагностика — где именно закончилось место?

Первым делом нужно понять, какой именно раздел (filesystem) заполнен. Ошибка может быть не в корневом /, а в отдельном смонтированном разделе, например /var или /home.

df -h

Ключевые колонки:

  • Filesystem — устройство или раздел.
  • Size — общий размер.
  • Used — использованное место.
  • Use% — процент использования. Внимание на значения 90-100%.
  • Mounted on — точка монтирования.

Пример вывода:

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        50G   48G  1.5G  97% /
/dev/sdb1       200G   30G  160G  16% /home
tmpfs           7.8G  1.2G  6.6G  16% /tmp

Здесь проблема в корневом разделе (/).

⚠️ Важно: Если команда df не показывает проблему, проверьте inodes (индексы файлов) — они тоже могут закончиться: df -i.

📊 Шаг 2: Поиск «пожирателей» дискового пространства

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

Способ A: Стандартные утилиты du и sort

# Анализ 20 самых больших каталогов в корне (игнорируем ошибки доступа)
sudo du -x / 2>/dev/null | sort -n | tail -20
  • -x — оставаться в одной файловой системе (не заглядывать в другие смонтированные разделы).
  • sort -n — числовая сортировка по размеру (по возрастанию).
  • tail -20 — взять последние 20 строк (самые большие).

Результат будет выглядеть так:

5242880    /var/lib/docker
3145728    /usr/lib/jvm
2097152    /var/log
...

Это показывает, что /var/lib/docker — главный кандидат на очистку.

Способ B: Интерактивный анализ с ncdu (рекомендуется)

Установите ncdu — самый удобный инструмент для анализа дискового пространства.

# Для Ubuntu/Debian
sudo apt update && sudo apt install ncdu

# Для CentOS/RHEL (EPEL репозиторий)
sudo yum install epel-release && sudo yum install ncdu

# Для Arch
sudo pacman -S ncdu

Запустите анализ нужного раздела:

sudo ncdu /

Вы получите интерактивный интерфейс (в текстовом режиме), где можно перемещаться по папкам, видеть их размер и удалять файлы прямо из программы (клавиша d). Это значительно ускоряет процесс.

🗑️ Шаг 3: Очистка — что можно безопасно удалить?

После анализа вы увидите «виновников». Вот основные категории для очистки.

1. Кэш пакетного менеджера и старые версии ПО

Для Debian/Ubuntu:

# Удалить локальные кэшированные файлы пакетов (.deb)
sudo apt-get clean

# Удалить старые, ненужные зависимости
sudo apt-get autoremove --purge

# Показать старые ядра (не удаляйте текущее!))
dpkg -l 'linux-image*' | grep '^ii'
# Удаление конкретного старого ядра (пример)
sudo apt-get purge linux-image-5.4.0-42-generic

Для RHEL/CentOS/Fedora:

# Очистка кэша yum/dnf
sudo yum clean all   # или sudo dnf clean all

# Удаление старых ядер (осторожно!)
package-cleanup --oldkernels --count=2
# Или вручную: rpm -qa kernel | sort -V | head -n -2 | xargs sudo yum remove -y

Для Arch Linux:

sudo pacman -Sc      # Очистка кэша установленных пакетов (старые версии)
sudo pacman -Scc     # Очистить ВЕСЬ кэш (включая текущие) — не рекомендуется для производительности

2. Логи приложений и системы

Логи в /var/log могут бесконечно расти, особенно если есть ошибки в сервисах.

# Просмотр размера логов
sudo du -sh /var/log/*

# Безопасное удаление старых сжатых логов (например, .gz файлов старше 30 дней)
sudo find /var/log -name "*.gz" -type f -mtime +30 -delete
# Удаление старых неархивированных логов (осторожно!)
sudo find /var/log -type f -name "*.log" -mtime +7 -exec truncate -s 0 {} \;

💡 Совет: Лучше не удалять, а архивировать старые логи (gzip) или настроить logrotate (обычно уже настроен). Проверьте конфиг в /etc/logrotate.conf и /etc/logrotate.d/.

3. Временные файлы и кэш пользователей

# Очистка /tmp (часто безопасно, но могут быть временно используемые файлы)
sudo rm -rf /tmp/* /tmp/.* 2>/dev/null

# Кэш текущего пользователя (браузеры, приложения)
rm -rf ~/.cache/*

⚠️ Важно: Не удаляйте файлы в /tmp и ~/.cache, если не уверены, что они не используются текущими процессами. Лучше перезагрузить систему для очистки /tmp.

4. Большие файлы, найденные через ncdu или find

Найдите файлы больше 100 МБ:

sudo find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null | awk '{ print $5, $9 }' | sort -rh

Проверьте, можно ли их удалить или архивировать. Частые кандидаты:

  • Дампы баз данных (*.sql, *.sqlite).
  • Изображения Docker (/var/lib/docker/overlay2, /var/lib/docker/containers).
  • Файлы резервных копий (*.bak, *.backup).
  • Изолированные диски виртуальных машин (*.qcow2, *.vmdk).

🛠️ Шаг 4: Специфичные случаи

Docker / Podman

Контейнеры и образы могут занимать гигантские объемы.

# Просмотр占用-го места
docker system df
# Очистка неиспользуемых данных (образы, контейнеры, сети, тома)
docker system prune -a --volumes
# Более безопасно: только остановленные контейнеры и dangling образы
docker container prune
docker image prune

Базы данных (MySQL/PostgreSQL)

Удаление старых логов бинарных журналов (binlogs) или дампов.

  • MySQL: PURGE BINARY LOGS BEFORE '2026-01-01 00:00:00'; (выполнить в клиенте mysql).
  • PostgreSQL: Настройка archive_cleanup_command или удаление старых файлов в pg_wal/pg_xlog.

Старые ядра Linux

Оставьте только текущее загруженное ядро и, возможно, одно предыдущее для резерва.

# Для Ubuntu/Debian (узнайте текущее ядро)
uname -r
# Удалите ВСЕ остальные через apt (смотрите список из п.3.1)

🚨 Шаг 5: Что делать, если место не освобождается?

Иногда df показывает свободное место, а система всё равно пишет «No space left». Это может быть из-за:

  1. Заполнения inodes: df -i. Решение — удалить миллионы мелких файлов (например, старые сессии в /var/lib/php/sessions).
  2. Резервирование места root: В ext4 по умолчанию 5% резервируется для root-пользователя. Для диска 1 ТБ это 50 ГБ, которые обычный пользователь не может занять, но df покажет их как использованные. Проверьте tune2fs -l /dev/sda1 | grep 'Reserved block count'. Уменьшить можно: sudo tune2fs -m 1 /dev/sda1 (оставить 1%).
  3. Занятые удалённые (deleted) файлы: Файл удалён, но процесс ещё держит его дескриптор. Найти: lsof | grep '(deleted)'. Решение — перезапустить процесс или завершить его.

📈 Шаг 6: Профилактика и мониторинг

Чтобы проблема не повторялась:

  1. Настройте мониторинг: Добавьте в cron (например, /etc/cron.weekly/disk-check) скрипт:
    #!/bin/bash
    THRESHOLD=90
    df -H | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{ print $5 " " $6 }' | while read output;
    do
      usep=$(echo $output | awk '{ print $1 }' | cut -d'%' -f1)
      partition=$(echo $output | awk '{ print $2 }')
      if [ $usep -ge $THRESHOLD ]; then
        echo "Внимание: раздел $partition заполнен на $usep% на $(hostname)!" | mail -s "Диск почти полный" admin@example.com
      fi
    done
    
  2. Настройте logrotate: Убедитесь, что он активен и сжимает логи (compress), удаляет старые (rotate 4).
  3. Ограничьте размер логов приложений: Для nginx, apache, mysql настройте ротацию в их конфигах.
  4. Регулярно чистите кэш: Добавьте apt-get clean или yum clean all в еженедельный cron.
  5. Используйте ncdu для периодической ручной проверки «горячих» точек: /var, /home, /usr.

❓ Часто задаваемые вопросы

Q: Можно ли просто удалить всё в /tmp?

A: В большинстве случаев да, особенно после перезагрузки. Но если система работает давно без перезагрузки, некоторые приложения могут хранить там временные файлы. Лучше удалять только старые (find /tmp -type f -mtime +7 -delete) или перезагрузиться.

Q: После очистки df показывает свободное место, но приложения всё равно падают с ошибкой «no space».

A: Проверьте inodes (df -i). Также проверьте, не занято ли место под резерв root (см. Шаг 5). Или есть ли занятые удалённые файлы (lsof | grep deleted).

Q: Безопасно ли удалять файлы в /var/lib/docker?

A: Нет, напрямую — никогда! Используйте только команды Docker: docker system prune -a. Прямое удаление файлов в /var/lib/docker приведёт к неработоспособности контейнеров и повреждению данных.

Q: Как автоматически удалять старые файлы в какой-то папке?

A: Используйте find с cron. Пример: удалить файлы в /backup старше 30 дней: find /backup -type f -mtime +30 -delete. Добавьте в crontab (crontab -e): 0 2 * * * /usr/bin/find /backup -type f -mtime +30 -delete.

Q: Почему du показывает меньше места, чем df?

A: Потому что du не учитывает:

  • Файлы, удалённые, но ещё открытые процессами.
  • Резервирование места для root (в ext4).
  • Скрытые системные файлы (если не запущен с sudo и есть доступные только root каталоги).

Выполнив этот гайд, вы не только оперативно решите проблему «диск полный», но и получите инструменты для её предотвращения в будущем. Ключевой принцип: регулярный мониторинг и понимание, что занимает место на вашем сервере.

Часто задаваемые вопросы

Почему в Linux диск может внезапно заполниться?
Какая команда показывает, какие папки занимают больше всего места?
Безопасно ли удалять файлы в /var/cache/apt/archives?
Как предотвратить повторное заполнение диска?

Полезное

Определите, какой раздел заполнен
Найдите крупнейшие каталоги и файлы
Очистите кэш пакетного менеджера и старые данные
Удалите или архивируйте большие файлы
Настройте мониторинг и профилактику