Скрипт для автоматического обновления минорной версии Linux-ядра
Материал из Linux Wiki
Версия от 22:10, 17 октября 2008; Rain (обсуждение | вклад)
Скрипт предназначен для сборки ядра с наложением секьюрити и прочих патчей. Для использования положить в каталог со скриптом нужные патчи, архив исходного кода ядра, секьюрити-патчи, при необходимости - файл конфигурации ядра, после чего запустить скрипт
- типы архивов исходных кодов ядра:
- 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=`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