Очистка дискового пространства в Ubuntu

Со временем любая операционная система может «засоряться» по мере установки и удаления программ. Файлы журналов событий, неиспользуемые устаревшие пакеты, все это занимает лишнее пространство. Особенно за наличием сводного пространства необходимо следить, если вы эксплуатируете VPS сервер. Это на домашнем компьютере плюс/минус пара гигабайт не сделает роли, а на VPS сервере, где весь диск может быть не более 20 ГБ, дополнительное пространство никогда не будет лишним. В отличие от Windows, ОС построенные на Linux более чувствительны к нехватке свободного места на диске. В особо критических случаях при полном заполнение диска, вы даже не сможете войти в системе по SSH доступу. В посте рассматриваются простые шаги по очистке диска от устаревших данных и программ.

Оглавление

  1. Проверка свободного места на диске
  2. Анализ дискового пространства
  3. Очистка системы
  4. Литература

Проверка свободного места на диске

До очистки диска необходимо вначале проверить свободное дисковое пространство. Обычно для отображения дискового пространства использую утилиту  df , но есть и другая более удобная утилита  pydf . Утилита pydf (Python Disk File System) — отображает информацию о дисковом пространстве, аналогично команде df, но с более удобным и читаемым форматом. Основное отличие pydf от df заключается в том, что pydf использует цветовую кодировку для разных файловых систем и предоставляет более наглядное представление о том, сколько места занято и сколько свободно.

Для установки утилиты  pydf  необходимо выполнить команду:

sudo apt update && sudo apt install pydf

Запуск утилиты  pydf  в терминале:

pydf

Утилита выведет список всех подключенных файловых систем с информацией о занятом и свободном пространстве.

Результат:

anton@vmubuntu:~$ pydf
Filesystem  Size Used Avail  Use%                          Mounted on
/dev/sda2   118G  12G   99G  10.4 [##....................] /
/dev/loop16 128k 128k     0 100.0 [######################] /snap/bare/5
/dev/loop1   55M  55M     0 100.0 [######################] /snap/core18/2855
...

Как видим, диск заполнен всего на 10.4%, используется 12 из 118 ГБ.

Анализ дискового пространства

Далее необходимо выполнить анализ дискового пространства, дабы понять какие каталоги и файлы занимают больше всего места на диске. Для решения этой задачи предназначена утилита  ncdu .

Утилита ncdu — один из самых удобных инструментов для анализа дискового пространства. Она имеет псевдографический интерфейс, что значительно упрощает работу с ней. Для выхода из программы необходимо нажать на клавишу  Q  или  q .

Для установки утилиты  ncdu  выполнить команду:

sudo apt update && sudo apt install ncdu

После установки вы можете просто ввести команду  ncdu  в терминале:

ncdu

ncdu
Интерфейс утилиты ncdu

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

Если в качестве параметра не указывать путь, то по умолчанию утилита  ncdu  выполнит анализ текущей директории. Для анализа корня диска  /  необходимо выполнить команду:

ncdu /

Вывести список самых больших файлов

Данная команда позволит найти самые большие файлы, начиная с текущего каталога. Вывод идет в порядке убывания по 10 файлов за раз. Количество выводимых файлов можно изменить, просто изменив число 10 на любое другое:

sudo find -type f -exec du -Sh {} + | sort -rh | head -n 10

Очистка системы

Для успешной очистки диска необходимо выполнить следующие шаги, некоторые из них могут быть пропущены, например, если не используются snap-пакеты.

Шаг 1 — Удаление устаревших ядер Linux, неиспользуемых пакетов и кэша

После обновления ОС остаются устаревшие версии ядер, и другие пакеты. Для просмотра установленных версии ядер Linux выполнить команду:

apt list --installed | egrep "linux-image|linux-headers"

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

sudo apt-get purge -y $(dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | head -n -1)

Если конфигурация Grub не обновится по каким-либо причинам, это можно сделать вручную (желательно обновить GRUB загрузчик для подстраховки):

sudo apt autoremove -y && sudo update-grub && sudo update-grub2

Дополнительно можно удалить неиспользуемые старые версии пакетов:

dpkg -l | awk '/^rc/ {print $2}' | xargs sudo dpkg --purge

Скрипт удаляющий неиспользуемые пакеты и очищающий кэш пакетов:

sudo apt --purge autoremove -y \
&& sudo apt clean && sudo apt autoclean -y \
&& sudo rm -rf /var/lib/{cache,log}/ \
&& sudo rm -rf /tmp/* /var/tmp/* \
&& sudo rm -rf /var/cache/fontconfig/ \
&& sudo rm -rf /var/cache/apt/ \
&& sudo rm -rf /var/cache/man/

Дополнительно можно очистить локальный кэш и корзину всех пользователей:

rm -rf ~/.cache/thumbnails/* \
&& rm -rf /home/*/.local/share/Trash/*/** \
&& sudo rm -rf /root/.local/share/Trash/*/** \
&& rm -rf /home/*/.cache/*

Шаг 2 — Удаление лишних пакетов

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

Установка:

sudo apt update && sudo apt install wajig

Вывести список наибольших по размеру пакетов:

wajig large

Результат выполнения команды:

anton@ubuntu:~# wajig large
Package                           Size (KB)        Status
=================================-==========-============
aptitude-common                     10,100      installed
binutils-x86-64-linux-gnu           10,431      installed
linux-image-5.15.0-112-generic      11,443   config-files
...
linux-headers-5.15.0-124            76,130      installed
docker-ce                           94,341      installed
snapd                              101,504      installed
linux-modules-5.15.0-112-generic   112,943   config-files
...
linux-firmware                     929,901      installed

В списке пакетов присутствует пакет snapd. Обычно snap-пакеты на сервере не используются, поэтому если вы очищаете пространство на сервере, то скорее всего данный пакет вам не потребуется. Далее, удалим пакет snapd, который не используется и занимает 101 МБ дискового пространства:

sudo apt purge snapd

Командой apt purge можно удалить и любой другой неиспользуемый пакет.

Команда  purge  в отличие от  apt remove —auto-remove , удаляет все конфигурационные файлы, связанные с данным пакетом, в том числе и сам пакет.

Шаг 3 — Удаление логов

Система журналирования в операционных системах Linux работает на базе демона journald, который занимается обработкой сообщений от служб, initrd, ядра и т.д. Доступ к собранной в журнале информации осуществляется путем использования утилиты journalctl. Она же дает возможности для управления: выполнять фильтрацию, менять формат отображения, мониторить активные процессы и пр. Более подробно в посте Инструкция по использованию Journalctl в Linux.

С течением времени логи системы журналирования занимают все больше место на диске. Вы можете проверить размер журнала с помощью команды:

journalctl --disk-usage

Результат выполнения:

anton@vmubuntu:~# journalctl --disk-usage
Archived and active journals take up 6.4M in the file system.

Системный журнал занимает на диске 6.4 МБ.

Очистим системный журнал, удалим все события старше 3 дней:

sudo journalctl --vacuum-time=3d

Уменьшим размер журнала до 10 МБ:

sudo journalctl --vacuum-size=10M

Удалим логи в папке  /var/log/ , сохраняя структуру директорий:

sudo find /var/log/ -name "*.*" -type f -exec sudo rm -f {} \;
sudo find /var/log/ -name "*" -type f -exec sudo rm -f {} \;
sudo systemctl restart rsyslog &>/dev/null || echo "No need to restart rsyslog service"

Шаг 4 — Удаление старых версии Snap-приложений

Snap-пакеты содержат все необходимые зависимости для запуска программы, именно поэтому они такие большие. Кроме того, в системе Snap хранятся как минимум две версии приложения (в случае, если вы пожелаете вернуться к предыдущей версии).

Для определения занятого пространства snap-пакетами выполните команду:

du -h /var/lib/snapd/snaps

Результат выполнения:

anton@vmubuntu:/home/anton# du -h /var/lib/snapd/snaps
4.0K    /var/lib/snapd/snaps/partial
1.7G    /var/lib/snapd/snaps

Если система Snap не установлена, то в выводе будет ошибка отсутствия директории, вам следует пропустить этой шаг.

Для получения списка всех  установленных snap-пакетов необходимо выполнить команду:

snap list --all

Результат выполнения:

anton@vmubuntu:/home/anton# snap list --all
Name                       Version                     Rev    Tracking         Publisher   Notes
bare                       1.0                         5      latest/stable    canonical✓  base
core18                     20250123                    2855   latest/stable    canonical✓  base
core20                     20250213                    2501   latest/stable    canonical✓  base
...
snap-store                 0+git.7a3a49a6              1248   2/stable/…       canonical✓  disabled
snap-store                 0+git.90575829              1270   2/stable/…       canonical✓  -
snapd                      2.67.1                      23771  latest/stable    canonical✓  snapd,disabled
snapd                      2.68.4                      24505  latest/stable    canonical✓  snapd
snapd-desktop-integration  0.9                         253    latest/stable/…  canonical✓  -

Для ограничения хранения только двух версий snap-пакетов необходимо настроить политику хранения версий, для этого выполните команду:

sudo snap set system refresh.retain=2

Для удаления предыдущих версий snap-пакетов необходимо выполнить скрипт:

snap list --all | awk '/disabled/{print $1, $3}' |
    while read snapname revision; do
        echo "Removing a snap: '$snapname' , revision: '$revision'"
        sudo snap remove "$snapname" --revision="$revision"
    done

Результат выполнения:

anton@vmubuntu:/$ snap list --all | awk '/disabled/{print $1, $3}' |
    while read snapname revision; do
        echo "Removing a snap: '$snapname' , revision: '$revision'"
        sudo snap remove "$snapname" --revision="$revision"
    done
Removing a snap: 'core20' , revision: '2496'
[sudo] password for anton:
core20 (revision 2496) removed
Removing a snap: 'core22' , revision: '1748'
core22 (revision 1748) removed
Removing a snap: 'firefox' , revision: '6042'
firefox (revision 6042) removed
Removing a snap: 'snap-store' , revision: '1248'
snap-store (revision 1248) removed
Removing a snap: 'snapd' , revision: '23771'
snapd (revision 23771) removed

Шаг 5 — Удаление файлов журналирования Docker-контейнеров

Docker предоставляет встроенный механизм логирования, который захватывает потоки стандартного вывода (stdout) и стандартной ошибки (stderr) контейнера. Этот механизм логирования известен как «стандартный» драйвер логирования, и он хранит логи в формате JSON. Логи можно получить с помощью команды  docker logs  или с использованием различных инструментов управления логами.

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

Для оценки занимаемого пространства логами docker контейнеров запустите скрипт docker-show-container-log-size.sh. Запуск:

sudo apt update && sudo apt install curl
curl -s https://raw.githubusercontent.com/devdotnetorg/Linux/refs/heads/master/scripts/docker-show-container-log-size.sh | sudo bash

Результат выполнения:

anton@vmubuntu:~$ curl -s https://raw.githubusercontent.com/devdotnetorg/Linux/refs/heads/master/scripts/docker-show-container-log-size.sh | sudo bash
CONTAINERS
----------
1) NAME: 'coturn', LOG_FILE: 'none', SIZE: none byte
...
9) NAME: 'nginx-proxy_local', LOG_FILE: '/var/lib/docker/containers/6c22788ac955e9c3021d5430eda62d62633a8e06fbff6733a761381a09a941da/6c22788ac955e9c3021d5430eda62d62633a8e06fbff6733a761381a09a941da-json.log', SIZE: 2.08 MiB
10) NAME: 'pihole_local', LOG_FILE: 'none', SIZE: none byte
11) NAME: 'portainer_local', LOG_FILE: '/var/lib/docker/containers/c3a897a7c7c1b611f6f5aef308a733dce6540e96dd4ea0db74b10d8c5d07e3dc/c3a897a7c7c1b611f6f5aef308a733dce6540e96dd4ea0db74b10d8c5d07e3dc-json.log', SIZE: 11.89 KiB

Файлы журналов (драйвер json-file) хранятся в папке конфигурации каждого docker контейнера по пути  /var/lib/docker/containers/{идентификатор_контейнера}/{идентификатор_контейнера}-json.log .

Файлы логов docker контейнеров можно удалить выполнив команду:

sudo find /var/lib/docker/containers/ -name "*-json.log" -type f -exec sudo rm -rf {} \;

Драйверы логирования в Docker

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

  • json-file: Стандартный драйвер логирования, который хранит логи в формате JSON;
  • syslog: Отправляет логи в демон syslog;
  • journald: Отправляет логи в журнал systemd;
  • fluentd: Отправляет логи в агрегатор логов Fluentd;
  • gelf: Отправляет логи в конечную точку Graylog Extended Log Format (GELF).

Существует два варианта настройки ограничений логирования Docker контейнеров. Первый, указывать ограничения логирования для каждого контейнера отдельно. Второй, указать ограничения в файле настроек Docker. Файл настроек для всех Docker контейнеров, он же файл конфигуратор Docker, находится по пути  /etc/docker/daemon.json , по умолчанию данный файл отсуствует. Необходимо создать файл по указанному пути, со следующим содержимом, или добавьте в существующий.

Файл  /etc/docker/daemon.json 

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "1"
  }
}
  • max-size — максимальный объем лог-файла;
  • max-file — количество файлов для хранения логов.

Данные настройки определяют параметры для каждого контейнера, т.е. если запущено 5 контейнеров, то максимальный занимаемый объем логов составит 50 МБ.

Для принятия настроек необходимо перезагрузить демон Docker:

sudo systemctl reload docker

Новые политики ограничения логирования будут влиять только на новые docker контейнеры, для уже существующих, новые политики ограничения не повлияют. Поэтому пересоздайте существующие контейнеры, для принятия новых политик логирования.

Шаг 6 — Общий скрипт очистки системы

Обобщим все выше перечисленные команды для очистки диска в один скрипт, может быть использован для VPS сервера, без очистки директорий профиля пользователей.

Создадим каталог:

 
sudo mkdir -p /var/scripts/

Загрузим файл  clearing-disk-space-in-ubuntu.sh  с репозитория GitHub:

 
sudo apt update && sudo apt install curl
cd /var/scripts/
sudo curl -fsSL https://raw.githubusercontent.com/devdotnetorg/Linux/refs/heads/master/scripts/clearing-disk-space-in-ubuntu.sh -o clearing-disk-space-in-ubuntu.sh

Выставим флаг исполнения:

 
sudo chmod +x clearing-disk-space-in-ubuntu.sh

Запуск:

 
sudo ./clearing-disk-space-in-ubuntu.sh
Результат выполнения
anton@vmubuntu:~$ sudo ./clearing-disk-space-in-ubuntu.sh
Let's start cleaning the Ubuntu system...
1. Removing Old Linux Kernels...
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 5 not upgraded.
2. Removing unused old versions of packages...
3. Remove unused packages and clear the package cache...
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 5 not upgraded.
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
4. Updating the GRUB bootloader...
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 5 not upgraded.
Sourcing file `/etc/default/grub'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-6.11.0-17-generic
Found initrd image: /boot/initrd.img-6.11.0-17-generic
Found memtest86+x64 image: /boot/memtest86+x64.bin
Warning: os-prober will not be executed to detect other bootable partitions.
Systems on them will not be added to the GRUB boot configuration.
Check GRUB_DISABLE_OS_PROBER documentation entry.
Adding boot menu entry for UEFI Firmware Settings ...
done
Sourcing file `/etc/default/grub'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-6.11.0-17-generic
Found initrd image: /boot/initrd.img-6.11.0-17-generic
Found memtest86+x64 image: /boot/memtest86+x64.bin
Warning: os-prober will not be executed to detect other bootable partitions.
Systems on them will not be added to the GRUB boot configuration.
Check GRUB_DISABLE_OS_PROBER documentation entry.
Adding boot menu entry for UEFI Firmware Settings ...
done
5. Clearing system logs and deleting logs...
Vacuuming done, freed 0B of archived journals from /run/log/journal.
Vacuuming done, freed 0B of archived journals from /run/log/journal/277534dde95a4c82a925ea5ed9c4c56f.
Vacuuming done, freed 0B of archived journals from /run/log/journal.
Vacuuming done, freed 0B of archived journals from /run/log/journal/277534dde95a4c82a925ea5ed9c4c56f.
6. Removing Old Snap Applications...
Snap is installed on the system.
Removing a snap: 'core20' , revision: '2496'
core20 (revision 2496) removed
Removing a snap: 'core22' , revision: '1908'
core22 (revision 1908) removed
Removing a snap: 'firefox' , revision: '6073'
firefox (revision 6073) removed
Removing a snap: 'snap-store' , revision: '1248'
snap-store (revision 1248) removed
Removing a snap: 'snapd' , revision: '23771'
snapd (revision 23771) removed
-------------------------------------
Cleanup completed on 'vmubuntu'
Date 03-05-2025 01:31
Freed: 123 MB
-------------------------------------
По итогу выполнения скрипта высвободили 123 МБ дискового пространства. Если система работает длительное время, то размер высвобожденного пространства может достигать несколько гигабайт.

Шаг 7 — Создания сron задачи для выполнения скрипта очистки системы

Для автоматического периодического запуска скрипта создадим cron задачу с запуском в 19:05 ежедневно.

Откроем список cron задач:

sudo crontab -e

Если cron не установлен в системе, то необходимо выполнить команду для установки:

sudo apt update && sudo apt install cron  && sudo systemctl enable cron && sudo systemctl status cron

Добавим строку в самый конец:

# At 19:05
5 19 * * * sudo /var/scripts/clearing-disk-space-in-ubuntu.sh

Для выставления другого расписания выполнения задачи воспользуйтесь сайтом Crontab.guru — The cron schedule expression generator.

Сохраним изменения и перезапустим службу:

sudo systemctl restart cron
sudo systemctl status cron

Если необходимо сохранить вывод исполнения скрипта очистки, то необходимо указать следующий формат исполнения cron задачи:

# At 19:05
5 19 * * * sudo /var/scripts/clearing-disk-space-in-ubuntu.sh >> /var/log/ubuntu-cleanup.log 2>&1

Где  >> /var/log/ubuntu-cleanup.log  — вывод будет записан в лог-файл, который можно просматривать. Только каталог  /var/log/  следует заменить на другой т.к. данный каталог очищается текущим скриптом.

Для просмотра журнала исполнения скрипта выполнить команду:

cat /var/log/ubuntu-cleanup.log

 

Каталог скриптов на GitHub devdotnetorg/Linux.

Литература

Вам также может понравиться

About the Author: Anton

Programistik