Старые ядра 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>&1stdout и 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.