archlinux 编译安装内核

一离开 Red Hat 的开发环境很多东西都不顺手,编译安装内核就是一个例子。在 Fedora/RHEL 上,直接 make install 就什么都装好了,到了 archlinux 下可就不行了,它上面没有 /sbin/installkernel 不说,制作 initrd 工具也不一样,内核 config 放置不一样,就连内核版本号命名方式也不一样。所以就得自己写脚本来搞定了。

首先,你要把 CONFIG_LOCALVERSION 和 CONFIG_LOCALVERSION_AUTO 关了,前者是加自己的版本标识,后者是使用 git 来决定当前编译内核的版本号,所以说你会得到类似 2.6.33-rc7-ARCH-00010-g6339204-dirty 的东东,很烦人,直接关掉。

然后就是内核 config 文件的放置,Fedora 上都是单独放到 /boot 下,而 archlinux 是编译进内核的,也就是说在 /proc/config.gz 里,是通过 CONFIG_IKCONFIG_PROC 来控制的。我觉得放置在哪没多大关系,咱又不差内存。;)

好了,下面就是脚本了,它可以帮你完成安装内核这个最后的步骤,有点像 installkernel。但你必须在内核源代码根目录下运行,而且假设你执行完了 make modules_install 这一步,当然了,假设你使用的是 grub。

有兴趣的同学可以把它改成 installkernel 一样的接口,这样就可以直接 make install 了。

[bash]

!/bin/bash

#

1. This must be run in the top kernel source directory.

2. Assume you already install the modules.

version=make kernelversion
cp System.map /boot/System.map.${version}

Maybe only works on x86

cp arch/uname -m/boot/bzImage /boot/vmlinuz-${version}
mkinitcpio -k “${version}” -c /etc/mkinitcpio.conf -g /boot/kernel.${version}.img

kernel_args=cat /proc/cmdline
root_device=awk '/^root/ { print $2; exit; }' /boot/grub/menu.lst
if ! grep -q “Test Kernel ${version}” /boot/grub/menu.lst
then
cat >> /boot/grub/menu.lst <<eof

title Test Kernel ${version}
root ${root_device}
kernel /boot/vmlinuz-${version} ${kernel_args}
initrd /boot/kernel.${version}.img
EOF
fi
[/bash]