LINUX.ORG.RU

Скрипт атоматического удаления старых ядер Debian/Ubuntu


0

1

Привет всем!
Решил написать скрипт для поиска и удаления старых ядер, оставшихся после обновлений системы. Работает по-идее для debian/ubuntu. С ядрами вроде как нормально, грепаньем выбираются все, кроме текущего. С заголовочными файлами сложнее. Как ни грепал, пакет linux-headers-номер_текущего_ядра все равно остается в списке удаляемых. Может у кого есть идеи как лучше грепать, да и вообще как можно по-другому список ненужных ядер/исходников сформировать? Просто я в скриптописании не силен, получилась какая-то ерундистика...

Сам скрипт смотрите ниже. Требуется запуск под рутом или с sudo, но только для целей apt-get purge, в остальных командах повышенные привилегии не используются. Можно и на рабочей системе запускать, apt-get запускается с ключом -s (СИМУЛЯЦИЯ), то есть реально ничего в системе НЕ удаляется и НЕ изменяется.

- скрипт предполагает, что вы запускаете его из под самого нового из установленных ядер,
- скрипт предполагает, что версии ядра/исходников начинаются с версии 2 (сейчас все ядра 2.6, до 3ей версии еще пока далековато, да и адаптировать не сложно...)

#!/bin/bash
# this is a script for purging unused old kernels installed in your system,
# you should use this script under newest kernel installed!!!
# Please, run it with sudo or as a root user (needed only for apt-get purge operation)!

# checking for root privileges
if [ "$(id -u)" != "0" ]; then
echo 'This script must be run as root or with sudo command!!!' 2>&1
exit 1
fi

# let's get installed and removed kernels list
# and exclude removed kernels
# and exclude kernel you are using now
# excluding kernel metapackage too (list only linux-image-2....),
# then we are going to write this list to a temporary file
dpkg --get-selections linux-image*\
| grep -v deinstall\
| grep -v `uname -r`\
| grep 2 > /tmp/tmp.txt
# asking user if he wants to purge kernels found...
echo "Old kernels found:"
cat /tmp/tmp.txt
echo "You are now running kernel:"
echo linux-image-`uname -r`
CORRECT_INPUT=0
while [ $CORRECT_INPUT -ne 1 ]
do
	echo -n "Would you like to purge old kernels found? (y/n): "
	read CHOISE
	case $CHOISE in
	y)
	echo "Purging kernels!..."
	CORRECT_INPUT=1
	;;
	n)
	rm /tmp/tmp.txt
	echo "Exiting..."
	CORRECT_INPUT=1
	exit 0
	;;
	*)
	echo "Please enter y or n and press enter!"
	;;
	esac
done
# let's purge unused kernels which are in our tempfile
apt-get -s purge `cat /tmp/tmp.txt | cut --fields=1 -`

echo -n 'Done! Press any key to continue!'
read CONTINUE

# finding old kernel-headers
dpkg --get-selections linux-headers*\
| grep -v deinstall\
| grep 2 > /tmp/tmp.txt
# asking user if he wants to remove old kernel haders too...
echo "Old kernel headers found, script can purge them too:"
cat /tmp/tmp.txt
echo "Your current kernel headers version:"
echo linux-headers-`uname -r`
CORRECT_INPUT2=0
while [ $CORRECT_INPUT2 -ne 1 ]
do
	echo -n "Would you like to purge old kernels headers? (y/n): "
	read CHOISE
	case $CHOISE in
	y)
	echo "Purging kernel headers!..."
	CORRECT_INPUT2=1
	;;
	n)
	rm /tmp/tmp.txt
	echo "Exiting..."
	CORRECT_INPUT2=1
	exit 0
	;;
	*)
	echo "Please enter y or n and press enter!"
	;;
	esac
done
# purging kernel-headers which are in our tempfile
apt-get -s purge `cat /tmp/tmp.txt | cut --fields=1 -`

rm /tmp/tmp.txt
echo 'All done! Exiting script...'
exit 0

Ответ на: комментарий от Jetty

Это Вы к чему? Тут тема вообще-то про удаление старых версий ядер/исходников, которые больше не требуются...А не про установку.

Soulreader ()

> выбираются все, кроме текущего.

Оставь на всякий случай два, включая предпоследнее.

sin_a ★★★★★ ()

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

EKrava ()
Ответ на: комментарий от Soulreader

apt-get -s autoremove `dpkg -l «linux-image*» «linux-headers*» | sed -n «/$(uname -r)/d;/common/d;s/^ii *\(linux-[^0-9]*[0-9]*\.[0-9]*\.[0-9]*[^ ]*\) .*/\1/p»`

maloi ★★★★★ ()

#!/bin/bash

CURKERNEL=$(uname -r|sed 's/-*[a-z]//g'|sed 's/-386//g')
LINUXPKG=«linux-(image|headers|ubuntu-modules|restricted-modules)»
METALINUXPKG=«linux-(image|headers|restricted-modules)-(generic|i386|server|common|rt|xen)»
OLDKERNELS=$(dpkg -l|awk '{print $2}'|grep -E $LINUXPKG |grep -vE $METALINUXPKG|grep -v $CURKERNEL)

echo «Удаление предыдущих ядер...»
sudo apt-get purge $OLDKERNELS
echo «Готово!»

amorpher ★★★★★ ()

># asking user if he wants to purge kernels found...
А если пользователь женщина?

Как ни грепал, пакет linux-headers-номер_текущего_ядра все равно остается в списке удаляемых.

Не вижу, где у вас в скрипте исключаются linux-headers для текущей версии. Ядро исключается (grep -v `uname -r`), а заголовки?

proud_anon ★★★★★ ()
Ответ на: комментарий от EKrava

Пакеты, которые будут УДАЛЕНЫ:
linux-headers-2.6-amd64* linux-headers-2.6.32-5-amd64* linux-headers-2.6.32-5-common* linux-headers-2.6.37-1-amd64* linux-headers-2.6.37-1-common* linux-headers-2.6.37-2-amd64* linux-headers-2.6.37-2-common*
linux-headers-2.6.38-1-amd64* linux-headers-2.6.38-1-common* linux-image-2.6.32-5-amd64* linux-image-2.6.37-1-amd64* linux-image-2.6.37-2-amd64* linux-image-2.6.38-1-amd64* linux-image-amd64* linux-kbuild-2.6.32*
linux-kbuild-2.6.37* linux-kbuild-2.6.38*
обновлено 0, установлено 0 новых пакетов, для удаления отмечено 17 пакетов, и 31 пакетов не обновлено.
Purg linux-headers-2.6-amd64 [2.6.38+32]
Purg linux-headers-2.6.32-5-amd64 [2.6.32-31]
Purg linux-headers-2.6.32-5-common [2.6.32-31]
Purg linux-headers-2.6.37-1-amd64 [2.6.37-1]
Purg linux-headers-2.6.37-1-common [2.6.37-1]
Purg linux-headers-2.6.37-2-amd64 [2.6.37-2]
Purg linux-headers-2.6.37-2-common [2.6.37-2]
Purg linux-headers-2.6.38-1-amd64 [2.6.38-1]
Purg linux-headers-2.6.38-1-common [2.6.38-1]
Purg linux-image-2.6.32-5-amd64 [2.6.32-31]
Purg linux-image-2.6.37-1-amd64 [2.6.37-1]
Purg linux-image-2.6.37-2-amd64 [2.6.37-2]
Purg linux-image-amd64 [2.6.38+32]
Purg linux-image-2.6.38-1-amd64 [2.6.38-1]
Purg linux-kbuild-2.6.32 [2.6.32-1]
Purg linux-kbuild-2.6.37 [2.6.37-1]
Purg linux-kbuild-2.6.38 [2.6.38-1] ~ % uname -r
2.6.38-1-amd64

вы предлагаете мне остаться без ядра?

maloi ★★★★★ ()
Ответ на: комментарий от EKrava

а вот i386

The following packages will be REMOVED:
linux-headers-2.6-686* linux-headers-2.6.32-5-686* linux-headers-2.6.32-5-common* linux-image-2.6-686* linux-image-686* linux-kbuild-2.6.32*
0 upgraded, 0 newly installed, 6 to remove and 0 not upgraded.
Purg linux-headers-2.6-686 [2.6.32+29]
Purg linux-headers-2.6.32-5-686 [2.6.32-31]
Purg linux-headers-2.6.32-5-common [2.6.32-31]
Purg linux-image-2.6-686 [2.6.32+29]
Purg linux-image-686 [2.6.32+29]
Purg linux-kbuild-2.6.32 [2.6.32-1]

~% uname -r
2.6.32-5-686

maloi ★★★★★ ()
Ответ на: комментарий от Soulreader

Это я к тому, что достаточно топовый метапакет поставить, и тогда при апдейтах старое ядро будет удаляться.. Ну и да, если у вас зоопарк ядер разных версий - вы ССЗБ.

Jetty ★★★★★ ()

в Мандриве уже давно искаропки

annulen ★★★★★ ()
sudo apt-get purge $(dpkg -l|grep "^rc"|awk '{print $2}')
moscwich ()
Ответ на: комментарий от Jetty

Это я к тому, что достаточно топовый метапакет поставить, и тогда при апдейтах старое ядро будет удаляться..

это вот этот метапакет?

# aptitude show linux-image-server
Пакет: linux-image-server
Состояние: установлен
Автоматически установлен: нет
Версия: 2.6.32.30.36
Приоритет: необязательный
Раздел: metapackages
Сопровождающий: Ubuntu Kernel Team <kernel-team@lists.ubuntu.com>
Размер в распакованном виде: 32,8k
Зависимости: linux-image-2.6.32-30-server, linux-firmware
Описание: Linux kernel image on Server Equipment.
 This package will always depend on the latest kernel image available for Server Equipment.

#

при апдейтах старые ядра не удаляет :(

shrub ★★★★★ ()
Ответ на: комментарий от proud_anon

Если юзер женщина, комментарии можно подправить.[br] А грепаются заголовки во второй части скрипта, смотрите ниже.[br] Москвичу - этот способ я тоже уже нагуглил, но еще не пробовал...так и придется еще сед с авком учить...

Soulreader ()
Ответ на: комментарий от Jetty

по умолчанию - не будет, глядите в /etc/apt/apt.conf.d/01autoremove.

maloi ★★★★★ ()

Ставим пакет linux-image-2.6-<arch> и всё, в грабе 2 пункта (оба на едиственное ведро). Так уже ооочень давно ))))))

erfea ★★★★★ ()
Ответ на: комментарий от erfea

Я об этом же.
Я так понял что товарищи сначала ставят зоопарк ядер из stable/unstable/testing/experimental а потом не могут найти все что надо по сносить :)

Jetty ★★★★★ ()
Ответ на: комментарий от Jetty

Да нифига подобного. У меня, например, на ноуте убунта LTS. Ядро обычное generic из репозитория. При обновах ядра старые ядра остаются в списке граба. Например: 2.6.32-28, 2.6.32-29, 2.6.32-30... И это ИМХО правильно, потому что новое ядро может и не загрузиться. Но если загрузилось - зачем мне старые ядра? Вот и ищу способ удобный для удаления. С метапакетом не пробовал, надо бы проверить удалятся ли старые...

Soulreader ()
Ответ на: комментарий от erfea
~$ sudo apt-get -s install linux-image-2.6-686
Чтение списков пакетов... Готово
Построение дерева зависимостей       
Чтение информации о состоянии... Готово
Уже установлена самая новая версия linux-image-2.6-686.
обновлено 0, установлено 0 новых пакетов, для удаления отмечено 0 пакетов, и 0 пакетов не обновлено.


~$ dpkg -l linux-image* | grep ii
ii  linux-image-2.6-686                                    2.6.32+29                    Linux 2.6 for modern PCs (meta-package)
ii  linux-image-2.6.26-1-486                               2.6.26-13lenny2              Linux 2.6.26 image on x86
ii  linux-image-2.6.26-2-686                               2.6.26-26lenny2              Linux 2.6.26 image on PPro/Celeron/PII/PIII/P4
ii  linux-image-2.6.32-5-686                               2.6.32-31                    Linux 2.6.32 for modern PCs

Soulreader ()
Ответ на: комментарий от amorpher

[code] ~$ dpkg -l|awk '{print $2}'|grep -E $LINUXPKG |grep -vE $METALINUXPKG|grep -v $CURKERNEL linux-headers-2.6-486 linux-headers-2.6.26-2-486 linux-headers-2.6.26-2-common linux-headers-2.6.32-5-486 linux-headers-2.6.32-5-common linux-image-2.6-686 linux-image-2.6.18-6-686-bigmem linux-image-2.6.26-1-486 linux-image-2.6.26-2-686 linux-image-2.6.26-2-686-bigmem [/code] [br] Видим тут метапакет ядра ---> не катит! Плюс несколько ядер которые у меня заведомо не установлены, зачем их удалять?

Soulreader ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.