上一次编译内核已经是三年前倒腾 LFS 的事了。这两天心血来潮编译了最新的内核,写个脚本备份一下。这个脚本在 debian 6.0 下成功编译 3.2.0-rc5 并配置好 grub,在别的系统上可能不好使,所以这里更多的是一个过程记录。注释掉的部分是 grub 相关的,因为经实验发现这个工作 update-grub 已经做了。
#!/bin/bash
function display_usage()
{
echo "Usage: $0 [install src | uninstall version]" >&2
}
if [ $# -ne 2 ]; then
display_usage
exit 1
fi
if [ $1 = "install" ]; then
cd $2
if [ $? -ne 0 ]; then
exit 1
fi
if ! [ -f Makefile ]; then
echo "cannot get kernel version." >&2
exit 1
fi
KERNEL_VERSION=`sed -n '1'p Makefile | awk '{print$3}'`.`sed -n '2'p Makefile | awk '{print$3}'`.`sed -n '3'p Makefile | awk '{print$3}'``sed -n '4'p Makefile | awk '{print$3}'`
let nr_thread=`cat /proc/cpuinfo | grep processor | wc -l`*2
make menuconfig
if [ $? -ne 0 ]; then
exit 1
fi
echo "-------------------- make begin --------------------"
make -j $nr_thread
if [ $? -ne 0 ]; then
exit 1
fi
make -j $nr_thread modules
if [ $? -ne 0 ]; then
exit 1
fi
echo "--------------------- make end ---------------------"
echo "-------------------- install begin --------------------"
make modules_install
if [ $? -ne 0 ]; then
exit 1
fi
make install
if [ $? -ne 0 ]; then
exit 1
fi
echo "--------------------- install end ---------------------"
echo "-------------------- update begin --------------------"
cd /boot
mkinitramfs -o initrd.img-$KERNEL_VERSION $KERNEL_VERSION
if [ $? -ne 0 ]; then
exit 1
fi
#matchline=(`sed -n '/menuentry.*'$KERNEL_VERSION'.*/'= /boot/grub/grub.cfg`)
#let nr_line=${#matchline[@]}
#if [ $nr_line -eq 0 ]; then
# echo "cannot find kernel version: $KERNEL_VERSION." >&2
# exit 1
#fi
#awk 'BEGIN{i = 0} {if ($0 ~ /^}/) {if (i < '$nr_line' && NR > '${matchline['i']}') {printf "\tinitrd\t%s\n}\n", "/boot/initrd.img-'$KERNEL_VERSION'"; ++i} else print $0} else print $0}' /boot/grub/grub.cfg > /tmp/tmpgrub.cfg
#mv /tmp/tmpgrub.cfg /boot/grub/grub.cfg
update-grub
echo "--------------------- update end ---------------------"
elif [ $1 = "uninstall" ]; then
rm -rf /lib/modules/$2
rm /boot/*$2*
update-grub
else
display_usage
fi