Матеріал з docs.linux.org.ua — збірника документації з Unix/Linux українською мовою.
#!/bin/bash
# 20060310 patch_kernel_src.sh hse@ukr.net
# Distributed under the terms of the GNU General Public License v2 or late
# patching linux kernel source code (installing)
# use code from scripts/patch-kernel
patchdir=/usr/portage/distfiles # директорія куди скачали архіви ядра та патчів
VER=2.6.10 # версія ядра (kernel-2.6.*.bz2 ядро без припатчу)
STOP=2.6.15 # версія ядра на якій спинити patch-kernel, обов'язково використовуйте при накладанні припатчів!
sourcedir0=/usr/src # директорія де розпакуються і пропатчаться сирці ядра
sourcedir=$sourcedir0/linux-$VER # директорія де розпакуються і пропатчаться сирці ядра
# Уважно слідкуйте, щоб версія патчів співпадала з версією ядра (STOP=2.6.15)!
# Послідовність патчів можу бути дуже суттева
addpatch[1]=genpatches-2.6.15-10.base.tar.bz2 # стабілізаційні патчі Gentoo
addpatch[2]=genpatches-2.6.15-10.extras.tar.bz2 # збірка додаткових патчів Gentoo
addpatch[3]=patch-2.6.15-om-1.bz2 # патч для кластеризації openmosix
addpatch[4]=ruby-2.6.13-A0.diff.bz2 # патч для багатотермінальності
addpatch[5]=fusion-2.6.11.diff.bz2 # патч для використання заліза DirectFBодночасно багатьма прогами
N=3 # кількість патчів
# verifing signature (перевірка підписів)
for i in `ls -v $patchdir/ |grep '.bz2.sign'`
do
j="`echo "$i" |awk -F'bz2' '{ print $1 }'`""bz2"
gpg --verify $patchdir/$i $patchdir/$j > ./verify.gpg 2>&1
if [ "`cat ./verify.gpg |grep 'gpg: Good signature from'`" = "" ]
then
echo " $j bad signature exiting ... "
exit 1
else
echo " $j Good signature "
fi
done
# unpaking source code (розпаковуємо ядро)
echo "Unpacking kernel source..."
if [ -d $sourcedir ]
then
echo " dirictory $sourcedir exist!!! "
exit 1
else
cd $sourcedir0
bzip2 -dkc $patchdir/linux-$VER.tar.bz2 | tar xf -
fi
#patching kernel (патчемо ядро)
$sourcedir/scripts/patch-kernel $sourcedir $patchdir $STOP
cd $sourcedir
((i=1))
while (( $i <= $N ))
do
echo -n "Applying ${addpatch[$i]} (bzip2)..."
bzip2 -dkc $patchdir/${addpatch[$i]} | patch -Np1 -s || exit 1
echo "done."
echo "${addpatch[$i]}" >> patches.txt
((i=$i+1))
done
# determine current kernel version (визначаємо версію ядра)
TMPFILE=`mktemp .tmpver.XXXXXX` || { echo "cannot make temp file" ; exit 1; }
grep -E "^(VERSION|PATCHLEVEL|SUBLEVEL|EXTRAVERSION)" $sourcedir/Makefile > $TMPFILE
tr -d [:blank:] < $TMPFILE > $TMPFILE.1
source $TMPFILE.1
rm -f $TMPFILE*
if [ -z "$VERSION" -o -z "$PATCHLEVEL" -o -z "$SUBLEVEL" ]
then
echo "unable to determine current kernel version" >&2
exit 1
fi
NAME=`grep ^NAME $sourcedir/Makefile`
NAME=${NAME##*=}
VER=$VERSION.$PATCHLEVEL.$SUBLEVEL${EXTRAVERSION}
echo "Current kernel version is $VER ($NAME)"
if [ -d $sourcedir0/linux-$VER ]
then
echo " dirictory $sourcedir0/linux-$VER exist!!! "
exit 1
else
mv $sourcedir $sourcedir0/linux-$VER
fi
echo "
Компіляція та встановлення Лінукс ядра версії-$VER
Якщо Ви цього не бажаєте натисніть Ctrl+C
"
sleep 20
# "перевірка" сирців
cd $sourcedir0/linux-$VER
make mrproper
# конфігурація
cp ../.config ./
if [[ "$1" == "genkernel" ]]
then
emerge -n genkernel
#genkernel --oldconfig --no-mrproper --gensplash=livecd-2005.0 --kerneldir=/usr/src/linux-$VER/ --kernname=LiveCD --lvm2 --dmraid all
genkernel --gensplash=livecd-2005.0 --kerneldir=/usr/src/linux-$VER/ --kernel-config=/usr/src/.config --kernname=LiveCD --lvm2 all
else
# конфігурація
cp ../.config ./
make oldconfig
# компіляція та встановлення
make && make modules_install && cp arch/i386/boot/bzImage /boot/kernel-$VER && cp System.map /boot/System.map-$VER
fi
rm /usr/src/linux; ln -s $sourcedir0/linux-$VER /usr/src/linux
echo "
Тепер Вам необхідно перезібрати всі пакети, що залежать від ядра!
Переважно це драйвери, що не входять в ядро (ati-drivers, lm_sensors, drbd...)
Додайте нове ядро в /boot/grub/grub.conf та перезавантажтесь з новим ядром.
"
sleep 1
exit 0