Автоматизация очистки старых ядер в Ubuntu: DevOps-подход с apt и cron

Старые ядра Linux на Ubuntu постепенно занимают место, особенно на разделе /boot. После нескольких обновлений apt upgrade там остаются пакеты linux-image-* и linux-headers-*, которые уже не нужны для загрузки. Ниже два рабочих подхода: автоматизация через apt autoremove и cron (удобно на десктопе) и точечный apt purge (предпочтительнее на серверах, где важен контроль).

Зачем чистить ядра

Каждое обновление ядра оставляет предыдущую версию на случай отката. Это нормально, но со временем ненужные пакеты накапливаются. Переполненный /boot мешает установке новых ядер и обновлений. Регулярная очистка или явный ручной purge поддерживает порядок без сюрпризов при next upgrade.

Вариант 1: apt autoremove и cron

В современных Ubuntu (22.04 и новее) очистка неиспользуемых ядер хорошо стыкуется с apt autoremove: пакеты, помеченные как автоматически установленные и больше не нужные, уходят вместе с конфигами при --purge.

Текущее ядро

Сначала зафиксируйте активную версию: её удалять нельзя.

uname -r

Пример: 5.15.0-73-generic. Дальше любые скрипты должны исключать это ядро (и обычно ещё одно запасное).

Очистка через apt

Базовая команда:

sudo apt autoremove --purge

Флаг --purge убирает и конфигурационные файлы. Список оставшихся образов:

dpkg --list | grep linux-image

Планировщик cron

На десктопе разумно повесить очистку на расписание. Редактор crontab от root:

sudo crontab -e

Пример: 1-го числа каждого месяца в 03:00:

0 3 1 * * /usr/bin/apt autoremove --purge -y >> /var/log/kernel-clean.log 2>&1
  • -y без интерактивных подтверждений (нужно для unattended-запуска);
  • >> /var/log/kernel-clean.log 2>&1 stdout и stderr в лог для разбора, если что-то пошло не так.

В nano: сохранить Ctrl+O, Enter, выход Ctrl+X.

После первого ручного прогона или срабатывания cron снова проверьте список образов:

dpkg --list | grep linux-image

Вариант 2: ручной apt purge

На серверах чаще оставляют ручной контроль: смотрите список, оставляете текущее и запасное, удаляете остальное. Один из распространённых one-liner (аккуратно: перед запуском на проде имеет смысл сначала вывести список без apt purge):

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

Как устроена цепочка

  • dpkg -l 'linux-*' пакеты, связанные с ядром;
  • sed '/^ii/!d' только установленные (ii);
  • исключение текущего uname -r (через sed);
  • извлечение имени пакета;
  • head -n -1 оставляет одно запасное ядро в хвосте списка;
  • sudo apt purge удаление отфильтрованного набора.

После purge обновите конфиг загрузчика:

sudo update-grub

Десктоп и сервер

  • Десктоп: cron + apt autoremove --purge обычно достаточно. Обновления частые, откат реже критичен, экономия места на /boot ощутима.
  • Сервер: лучше ручной purge после проверки, что новое ядро грузится и сервисы в норме. Имеет смысл держать минимум два запасных образа. Пример с head -n -2 (оставляет два «хвостовых» ядра в выборке):
sudo apt purge $(dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | head -n -2)

Полезные проверки

Место на разделах:

df -h

Если autoremove не трогает ядра, они могут быть помечены как вручную установленные. Перевод в auto, затем снова autoremove:

sudo apt-mark auto linux-image-*

Уточняйте маску под конкретные версии, если не хотите затронуть все linux-image-* разом. Затем:

sudo apt autoremove --purge

Кратко

  • на десктопе: apt autoremove --purge по cron с логом;
  • на сервере: ручной apt purge, текущее + запасные ядра, потом update-grub;
  • перед массовым удалением смотрите uname -r и dpkg --list | grep linux-image;
  • следите за df -h на /boot.

Источники и ссылки


Комментарии загружаются…