Скрипт для автоматического обновления минорной версии Linux-ядра

Материал из Linux Wiki
Версия от 22:15, 17 октября 2008; Rain (обсуждение | вклад) (заменил 2 команды на шелл-вариант)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к навигацииПерейти к поиску

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

  • типы архивов исходных кодов ядра:
    • linux-2.6.x(x).tar.(bz2|gz) - основная ветка
    • linux-2.6.x(x).y(y).tar.(bz2|gz) - основная ветка с апдейтами (используются патчи типа patch-2.6.x(x).y1(y1)-y2(y2).tar.(bz2|gz) )
  • типы основных патчей
    • patch-2.6.x(x).y(y).tar.(bz2|gz) - для апгрейда основной ветки
    • patch-2.6.x(x).y1(y1)-y2(y2).tar.(bz2|gz) - для апгрейда ветки с апдейтами
  • типы прочих патчей
    • все, что начинается с patch (но не запаковано), кроме основных патчей
    • все, что заканчивается на *.patch
    • все, что заканчивается на *.diff
Зависимости
kernel-package, fakeroot, patch, желательно ketchup и доступ в интернет (для проверки доступных версий)

#!/bin/bash
#===============================================================================
#
#        AUTHOR:   (linuxoid.rain@gmail.com), Rain
#
#       CREATED:  12.09.2007 15:49:40 EEST
#      REVISION:  01
#===============================================================================

# Проверка типа патча, распаковка при необходимости.
# Патч должен быть стандартного типа, распакованный или в bz2|gz-архиве
patch_type () {
if	[ `file -b $1 | awk '{print $1}'` == 'bzip2' ]
	then	bunzip2 $1 && echo -e "\e[36m$1:\t\t\e[35mbz2\e[36m, unpacking...\e[0m"
elif	[ `file -b $1 | awk '{print $1}'` == 'gzip' ]
	then	gunzip $1 && echo -e "\e[36m$1:\t\t\e[35mgzip\e[36m, unpacking...\e[0m"
elif	[ `file -b $1 | grep -o 'diff'` == 'diff' ]
	then	echo -e "\e[36m$1:\t\t\t\e[35mNormal diff file, nothing to do...\e[0m"
else	echo -e "\e[31mUnknown patch type, aborting...\e[0m" && exit 1
fi
}

# проверка типа архива исходного кода ядра
if	[ `ls -1 | grep -oE '^linux-2.6.[0-9]{1,2}\.tar\.bz2$'` ]
	then	stype='mainline' && echo -e "\e[36mSource type:\t\t\t\e[35mMainline\e[0m"
elif	[ `ls -1 | grep -oE '^linux-2.6.([0-9]{1,2}\.){2}tar\.bz2$'` ]
	then stype='incr' && echo -e "\e[36mSource type:\t\t\t\e[35mMainline with security updates\e[0m"
	else	echo -e "\e[5;31mError:\t\t\tNo source tarball found!\e[0;0m" && exit 1
fi

# установка переменных - определение архива и каталога с исходным кодом
star=`ls -1 | grep -o linux-2.6.*.tar.bz2`
sdir="${star%.tar*}"
#sdir=`echo $star | awk -F".tar" '{print $1}'`

# определение способа наложения патча:
# один патч от основной ветки или инкрементные от версии с секьюрными обновлениями
if	[ $stype = 'mainline' ]
	then	mpatch=`ls -1 | grep -oE '^patch-2\.6\.[0-9]{1,2}\.[0-9](\.gz|\.bz2)?$'`
		if [ ! -z $mpatch ]
			then
			patch_type $mpatch
			mpatch=`echo $mpatch | cut -d . -f -4`
		fi
elif	[ $stype = 'incr' ]
	then	mpatch=`ls -1 | grep -oE '^patch-2\.6\.[0-9]{1,2}\.[0-9]{1,2}-[0-9]{1,2}(\.gz|\.bz2)?$'`
		if [ ! -z "$mpatch" ]
			then
			for i in $mpatch
				do
				patch_type $i
			done
			mpatch=`echo $mpatch | sed -e 's/\.gz//g' -e 's/\.bz2//g'`
		fi
fi

# определение всех остальных патчей, кроме основного - должны иметь расширение *.diff, *.patch, 
# или начинаться с patch, но не быть gzip или bz2-архивами
othpatch=`ls -1 | grep -v "$mpatch " | grep -E '^patch.*(! (gz|bz2))|*.diff|*.patch'`

# определение файла конфигурации ядра. Для ядра берется файл из текущей директории с названием,
# начинающимся с config-, или файл конфигурации текущего ядра из /boot
if	[ ! -z `ls -1 | grep -E 'config-'` ]
	then
		conffile=`ls -1 | grep -E 'config-'`
	else
		conffile=/boot/config-`uname -r`
fi

# проверка существования каталога с исходным кодом, если существует - удаляется
if [ -e $sdir ]
	then	echo -e "\n\e[31mSource directory exist, removing...\e[0m"
		mv $sdir $sdir-old
		rm -rf $sdir-old &
fi

# распаковка архива с исходным кодом
echo -e "\e[36mUnpacking sources\t\t\e[35m$star\e[0m\n"
tar xf $star

# если доступен ketchup, проверить последние версии ядра
if [ -e /usr/bin/ketchup ]
	then
	echo -e "\e[36mAttempting to get the info about the latest stable kernel version from www.kernel.org\e[0m"
	lateststab=`ketchup -s 2.6`
	echo -e "\e[36mAttempting to get the info about the latest development kernel version from www.kernel.org\e[0m"
	latestdev=`ketchup -s 2.6-rc`
	cantest="1"
fi

# копирование файла конфигурации в каталог с исходным кодом
cp $conffile $sdir/.config
echo -e "`date +%x/%X`\n" > patching.log
cd $sdir

echo -e '\e[36m\nAll patch logs are in\t\t\e[35mpatching.log\e[0m'
echo -e '\e[36m\nApplying security patches...\e[0m'

# наложение основного патча
if [ ! -z "$mpatch" ]
	then
	if	[ $stype = 'mainline' ]
		then	echo -e "\e[36mApplying\t\t\t\e[35m$mpatch\e[0m"
			echo -e "\n$mpatch\n" >> ../patching.log
			patch -p1 -i ../$mpatch >> ../patching.log
	elif	[ $stype = 'incr' ]
		then	for j in $mpatch
				do
				echo -e "\e[36mApplying\t\t\t\e[35m$j\e[0m"
				echo -e "\n$j\n" >> ../patching.log
				patch -p1 -i ../$j >> ../patching.log
			done
	fi
	else echo -e "\e[31mNo security patch found\e[0m"
fi

if [ ! -z $cantest ]
	then
	yourver=`head -4 Makefile | grep -oE '[0-9]{1,2}$' | tr '\n' '.' | grep -oE '([0-9]{1,2}.){3}[0-9]'`
	if [ $lateststab != $yourver ]
		then
		echo -e "\e[5;31m
Notice:
\e[0;36mYour kernel is\t\t\t\e[35m$yourver\n\e[36mLatest kernel is\t\t\e[35m$lateststab
\e[31mPlease, download latest version at www.kernel.org\e[0m"
	fi
	echo -e "\n\e[5;31mInfo:\n\e[0;36mCurrent development\nversion is\t\t\t\e[35m$latestdev\e[0m"
fi

sleep 3
echo -e "\n\e[36mApplying all other patches...\e[0m"

# наложение остальных патчей
for k in $othpatch
do
	echo -e "\e[36mApplying\t\t\t\e[35m$k\e[0m"
	echo -e "\n$k\n" >> ../patching.log
	patch -p1 -i ../$k 1>>../patching.log
done

echo -e "\n\e[36mReplacing Makefile...\e[0m"
sed -i 's/-O2/-O3/g' Makefile

if [ -x /usr/bin/make-kpkg ]
	then
	if [ -x /usr/bin/fakeroot ]
		then 
		echo -e "\e[36mStarting compilation...\e[0m"
		make-kpkg --rootcmd fakeroot kernel_image kernel_headers
		echo -e "\e[36mAll done, removing kernel source tree\e[0m"
		rm -rf ../$sdir
	else
		echo -e "\e[5;31mError: /usr/bin/fakeroot not found, please install "fakeroot" package\e[0;0m"
	fi
else
	echo -e "\e[5;31mError: /usr/bin/make-kpkg not found, please install "kernel-package" package\e[0;0m"
fi

exit 0