Configuring Linux
28 March 2011

Автоматическое удаление старых ядер

После очередного обновения убунты, я понял что меня вконец замучал растущий список загрузки в grub (это особенно актуально, если альтернативная ОС остается где-то внизу списка). Удалять вручную — это как-то неправильно, поэтому я решил заморочиться об автоматическом способе.

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

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

#!/bin/bash

kernels=`dpkg-query -l linux-image-* | grep ^ii | grep -v e-g | head -n -1 | gawk -F" " '{ print $2 }'`

for i in $kernels
do
echo "Removing kernel: "$i
# sudo apt-get -y remove $i
done


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

Надеюсь, кому-нибудь пригодится.

Убедительная просьба: перед первым запуском команды, запустите ее без хвоста "| xargs apt-get -y purge" и убедитесь, что вы получаете корректный список ядер на удаление.

UPD: Хабраюзеры Messie и ValdikSS подсказали более корректный и однострочный вариант:

dpkg -l linux-image-* | grep ii | grep -v [a-z]-generic | grep -v `uname -r` | awk '{ print $2 }' | xargs apt-get -y purge

UPD2: Вариант из скрипта ubucleaner от Steve_32:

dpkg -l | grep ii | awk '{print $2}' | grep -E 'linux-(image|headers|ubuntu-modules|restricted-modules)' | grep -vE 'linux-(image|headers|restricted-modules)-(generic|i386|server|common|rt|xen)' | grep -v $(uname -r|sed 's/-*[a-z]//g'|sed 's/-386//g') | xargs apt-get -y purge

+60
24.1k 158
Comments 90
Top of the day