By: 潘云登
Date: 2009-5-20
Email: intrepyd@gmail.com
Homepage: http://blog.csdn.net/intrepyd
Copyright: 该文章版权由潘云登所有。可在非商业目的下任意传播和复制。
对于商业目的下对本文的任何行为需经作者同意。
step-by-step
编译自己的内核1. 通过kernel.org,获取内核源码包,如linux-2.6.29.3.tar.bz2。将其解压到/usr/src目录下。
sudo tar xjf linux-2.6.29.3.tar.bz2 /usr/src |
2. 进入/usr/src,为linux-2.6.29.3文件夹创建linux链接。如果已存在linux链接,可以先删除。
cd /usr/src sudo ln -s linux-2.6.29.3 linux cd linux |
3. 如果你之前编译失败过,需要先清理残留文件。
make mrproper |
4. 拷贝原有的配置文件到源码目录下。
sudo cp /boot/config-`uname -r` ./.config |
如果不存在config-`uname -r`文件,可以在根目录下查找。
find / -name 'config-2*' |
5. 利用原有的配置文件对内核进行配置。
sudo make menuconfig |
选择Load an Alternate Configuration File回车->.config回车->exit回车->yes回车。
6. 修改Makefile文件中的内核版本号,这一步可以省略。
VERSION = 2 PATCHLEVEL = 6 SUBLEVEL = 29 EXTRAVERSION = .3-description |
注意,这里的EXTRAVERSION只能由字母,数字,"."或"-"组成。
7. 开始编译内核,又到了喝咖啡的时间了:)
sudo make all |
8. 执行下列语句,安装内核。
sudo make modules_install sudo make install |
这时,在/boot目录下生成了三个文件,
-rw-r--r-- 1 root root 101K 2009-05-19 19:59 /boot/config-2.6.29.3 -rw-r--r-- 1 root root 1.4M 2009-05-19 19:59 /boot/System.map-2.6.29.3 -rw-r--r-- 1 root root 3.4M 2009-05-19 19:59 /boot/vmlinuz-2.6.29.3 |
缺少了引导硬件的initrd.img。
9. 在Jaunty Jackalope(Ubuntu 9.04)下,使用mkinitramfs创建initrd.img。
sudo mkinitramfs -o /boot/initrd.img-2.6.29.3 |
如果你找不到该命令,可以试试mkinitrd,它的用法如下:
sudo mkinitrd /boot/initrd.img-2.6.29.3 |
10. 在/boot/grub/menu.lst文件中添加启动项。
title linux 2.6.29.3 uuid XXX kernel /boot/vmlinuz-2.6.29.3 root=UUID=XXX ro quiet splash initrd /boot/initrd.img-2.6.29.3 quiet |
XXX替换为你原有启动项中的内容。
11. 重启系统,验证内核是否成功安装。
不幸的是,进入ubuntu后,出现花屏。难道是我的initrd.img创建有误?百思不得其解,还请各位仙人指导。
几个重要文件的作用
1. vmlinuz
vmlinuz是可引导的、压缩的内核。Linux能够使用硬盘空间作为虚拟内存,因此得名“vm”。文件中包含一个微型的gzip用于解压缩内核并引导它。
2. initrd
initrd是"initial ramdisk"的简写,一般被用来临时地引导硬件到实际内核vmlinuz能够接管并继续引导的状态。它把kernel的启动分成两个阶段:在kernel中保留最少最基本的启动代码,然后把对各种各样硬件设备的支持以模块的方式放在initrd中。这样的一个好处就是,在保持kernel不变的情况下,通过修改initrd中的内容就可以灵活地支持不同的硬件。
3. system.map
System.map是一个特定内核的内核符号表。顾名思义就是将内核中的符号(如变量名,函数名)和它的地址联系起来的一个列表。它使得用户可以直接使用符号名进行编程,而不用去记符号的地址。
利用发行版提供的工具编译内核
除了上述使用make编译内核的方式外,各linux发行版也提供了各自编译内核的工具。以ubuntu为例,其编译内核的主要过程摘抄如下:
1. 安装必要工具
apt-get install kernel-package libncurses5-dev fakeroot wget bzip2 |
2. 编译内核
make-kpkg clean fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers |
3. 安装内核
dpkg -i linux-image-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb dpkg -i linux-headers-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb |
4. 添加启动项
具体过程可google:How To Compile A Kernel - The Ubuntu Way。