一直以为Linux内核的编译是一件很复杂的事情,虽然有几次也实在是按捺不住冲动,要自己来编译一下试试,但是类似的几次尝试都是以失败而告终。在不久前,看到过一些关于Debian下编译内核的文章,说得很详细,而且似乎看起来也并不是很复杂的样子,于是决定自己编译一下内核,毕竟对于使用Linux的人来说没有自己编译过内核还真是一件叫人遗憾的事情。在这里记下的是自己编译2.6.19内核的方法,希望对于大家会有一些小小的帮助。
1 下载内核:我们可以在
http://www.kernel.org上找到我们所希望的内核,在这里我们使用的较新的2.6.19版本的内核。
2 将内核解压/usr/src目录下:
代码: |
|
- $ tar -xvf linux-2.6.19.tar.bz2
|
|
以前看到过的一些关于内核编译的文章都会说到在这里创建一个指向源码目录的linux链接,但是在新的2.6版本的内核中没有进行这一步,而且有时如果这样做反倒会造成编译不成功,所以在这里我们也就把这一步免了。
3 安装所需的软件包:
代码: |
|
- $ apt-get install kernel-package libncurses5-dev fakeroot build-essential
|
|
4 配置内核:
在这里我们可以按照我们的兴趣与需要来配置内核。而如果我们对于这些配置选项并不是很熟悉,我们可以使用我们以前的配置文件来进行配置:
代码: |
|
- $ cp /boot/config-`uname -r` .config
|
|
5 编译内核:
代码: |
|
- $ fakeroot make-kpkg --append-to-version=.061228 linux-image
|
|
在这里我们有必要先介绍一下make-kpkg与fakeroot这两个软件包。
在Debian编译内核,我们可以使用make-kpkg,这是一个可以自动替换"make dep;make clean;make bzImage;make modules"命令序列的脚本。而最其最常用的两个参数就是--append-to-version与--revision。
--append-to-version这个选项可以让我们来指定一个额外的内核版本,这个可以成为内核名的一问分。我们可以使用数字,"+",",",但是不要使用下划线"_".比较常见的用法是我们可以当天的日期作为参数,从而来区分不同的内核。如我正在运行的内核版本号如下:
代码: |
|
- mylxiaoyi@debian:~$ uname -r
- 2.6.19.061228
|
|
这里我们要注意的是我们要避免设置--append-to-version为如"-686","-K7","-sparc"等值,因为这些值常为Debian的预编译内核所使用。
内核模块位于/lib/modules子目录下。每一个内核有他自己的子目录。每次当我们以一个新的名字来安装一个新的内核时,这个包安装程序就会在/lib/modules目录下创建一个新的子目录来保存他自己的模块。
这就意味着每一次我们使用--append-to-version的一个新的值来编译一个内核时,我们就可以保证这个内核有一个新的名字,而他的模块也不会与其他的内核模块相冲突。
注意:如果我们使用相同的名字来安装一个内核时,安装程序就会覆盖掉已安装的内核及其模块。
--revision只会影响Debian软件包本身的名字而不是内核的名字。与--append-to-version相似,我们只可以使用数,"+",".",不要使用下划线"_"。如果我们并没有为--revision指定一个值,make-kpkg就会使用"10.00.Custom".
使用不同的--revision的值就可以避免相同名字的内核之间的冲突。
Debian kernel-image文件的名字格式如下:
代码: |
|
- kernel-image-(kernel-version)(--append-to-version)_(--revision)_(architecture).deb
|
|
进行内核编译时我们用到的另外一个软件包就是fakeroot。使用fakeroot我们可以普通用户的身份来运行make-kpkg,并且可以以普通的权限来完成大多数的工作。在接近工作的结尾时,fakeroot就会以模拟root环境来创建一个kernel-image软件包。
这样经过一段时间的等待以后我们就会得到一个deb包,如:
代码: |
|
- linux-image-2.6.19.061228_2.6.19.061228-10.00.Custom_i386.deb
|
|
这时我们就可以使用dpkg来安装这个包了:
代码: |
|
- $ dpkg -i linux-image-2.6.19.061228_2.6.19.061228-10.00.Custom_i386.deb
|
|
6 创建ramdisk:
在新版本的内核中创建ramdisk使用的是mkinitrd.yaird。我们首先要安装这个软件包:
代码: |
|
- $ apt-get install mkinitrd.yaird
|
|
在使用这个软件包创建ramdisk之前,我们需要修改/boot/config-2.6.19.061228文件,将
代码: |
|
- CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
|
这句注释掉,否则我们就会得到一个错误信息。
代码: |
|
- $ vim /boot/config-2.6.19.061228
|
|
代码: |
|
- [...]
- # CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
- [...]
|
|
这样以后我们就可以创建ramdisk了:
代码: |
|
- $ mkinitrd.yaird -o /boot/initrd.img-2.6.19.061228 2.6.19.061228
|
|
7 修改Grub配置文件使用新版本的内核启动。
呵呵~~这样看来在Debina下编译内核也并不是一件很困难的事情,这样我们就可以完全按照我们的需要来配置我们的Linux内核了~~
参考:
http://www.linuxsir.org/bbs/showthread.php?t=284609
http://blog.chinaunix.net/u/19185/showart_202665.html