Когда диск заполняется, перестают писаться журналы, падают базы данных, не обновляются пакеты, а иногда не удаётся даже войти в систему. Порядок действий всегда одинаковый: понять, какой раздел заполнен, найти, что занимает место, и убрать лишнее - не задев нужного.
Какой раздел заполнен
df -h
Столбец Use% показывает заполненность каждого раздела, Mounted on - куда он подключён. Обращайте внимание на /, /var и /home, если они отдельные.
Бывает, что место есть, а файлы не создаются с ошибкой «No space left on device». Тогда закончились не байты, а индексные дескрипторы (inode) - так бывает, когда в папке миллионы мелких файлов:
df -i
Что занимает место

du
Размер папок первого уровня в корне, по убыванию:
sudo du -xh --max-depth=1 / | sort -rh | head -20
Ключ -x не даёт du заходить на другие разделы (например, смонтированные диски и /proc). Дальше спускайтесь в самую большую папку и повторяйте:
sudo du -xh --max-depth=1 /var | sort -rh | head -20
ncdu
ncdu делает то же интерактивно: показывает папки по размеру, позволяет переходить по ним стрелками и удалять клавишей d.
sudo apt install ncdu # или sudo dnf install ncdu
sudo ncdu -x /
Самые большие файлы
sudo find / -xdev -type f -size +500M -exec ls -lh {} \; 2>/dev/null
Файлы больше 500 МБ на корневом разделе. Порог меняйте под ситуацию. Другие полезные запросы:
sudo find /var/log -type f -name "*.gz" -mtime +30 # сжатые журналы старше 30 дней
sudo find /home -type f -size +1G # большие файлы пользователей
sudo find /tmp -type f -atime +10 # временные файлы, которые давно не читались
Если много мелких файлов съели inode, найти такую папку поможет подсчёт файлов:
sudo find / -xdev -type f | cut -d/ -f2-3 | sort | uniq -c | sort -rn | head
Где обычно копится мусор
Журналы systemd
journalctl --disk-usage
sudo journalctl --vacuum-size=500M # оставить не больше 500 МБ
sudo journalctl --vacuum-time=14d # оставить последние 14 дней
Постоянный лимит задаётся в /etc/systemd/journald.conf параметром SystemMaxUse=, после изменения - sudo systemctl restart systemd-journald.
Журналы в /var/log
Ротацией журналов занимается logrotate. Если какой-то журнал растёт до гигабайтов, проверьте его настройку в /etc/logrotate.d/. Активный журнал не удаляйте командой rm - программа продолжит писать в удалённый файл, и место не освободится (см. ниже). Очищайте его так:
sudo truncate -s 0 /var/log/имя.log
Старые архивы *.gz и *.1, *.2 удалять можно.
Кэш пакетов
sudo apt clean # Debian, Ubuntu: удалить скачанные пакеты
sudo apt autoremove # удалить ненужные зависимости и старые ядра
sudo dnf clean all # Fedora, RHEL и родственные
sudo dnf autoremove
sudo pacman -Sc # Arch: удалить кэш неустановленных пакетов
Старые ядра
В Debian и Ubuntu старые ядра удаляет apt autoremove. В Fedora и RHEL число хранимых ядер задаёт параметр installonly_limit в /etc/dnf/dnf.conf, а удалить лишние сразу можно так:
sudo dnf remove $(dnf repoquery --installonly --latest-limit=-2 -q)
Команда оставит два последних ядра. Текущее ядро (uname -r) никогда не удаляйте.
Snap
Snap хранит несколько старых версий каждого пакета. Ограничить их число:
sudo snap set system refresh.retain=2
snap list --all | awk '/disabled/{print $1, $3}' | while read name rev; do sudo snap remove "$name" --revision="$rev"; done
Вторая команда удаляет уже отключённые старые версии.
Docker
Образы, остановленные контейнеры и кэш сборки быстро занимают десятки гигабайт:
docker system df # сколько занимают образы, контейнеры, тома и кэш
docker system prune # удалить остановленные контейнеры, неиспользуемые сети и висящие образы
docker system prune -a # плюс все образы, не используемые контейнерами
docker builder prune # кэш сборки
Тома (docker volume prune) удаляйте только если уверены, что данных в них не нужно: там обычно лежат базы данных.
Пользовательские кэши
~/.cache в домашних папках - кэш браузеров, миниатюр и программ. Его можно удалить целиком, программы создадут заново. Ещё стоит заглянуть в корзину (~/.local/share/Trash) и папку загрузок.
Место не освобождается после удаления
Если файл удалён, а df показывает прежнюю заполненность, файл всё ещё открыт каким-то процессом. Место освободится, только когда процесс его закроет. Найти такие файлы:
sudo lsof +L1
В выводе будет процесс (COMMAND, PID) и размер. Перезапустите эту службу - и место вернётся. Если перезапуск невозможен, файл можно обрезать через дескриптор процесса:
sudo truncate -s 0 /proc/<PID>/fd/<номер дескриптора>
Когда места совсем нет
- Зарезервированные блоки. На разделах ext4 по умолчанию резервируется часть места для root. Поэтому root может освободить место, даже когда обычные пользователи уже не могут писать. На разделах с данными (не системных) резерв можно уменьшить:
sudo tune2fs -m 1 /dev/sdXN. - Невидимые файлы под точкой монтирования. Если раньше в папку писали до того, как туда смонтировали отдельный диск, старые файлы прячутся под ним и занимают место на корневом разделе. Их видно, если временно отмонтировать диск или смонтировать корень в другую папку:
sudo mount --bind / /mntиduпо/mnt. - Если ничего не удаляется - увеличьте раздел (на виртуальной машине это делается за минуты) или вынесите тяжёлые данные на отдельный диск.
Чтобы ситуация не повторилась, ограничьте размер журналов, настройте ротацию для своих приложений и добавьте оповещение о заполнении диска в систему мониторинга.





Комментарии
Комментариев пока нет - будьте первым.