是日,闲暇之余研究了一下Linux的Kernel的编译。以前都是在Windows平台工作,几乎无机会用Linux,于是也想凑热闹玩一下。平台是最新的Ubuntu 10.04 LTS,Kernel也是最新下载的2.6.35.2版本。其实现在Kernel的编译比过去方便的多,用menuconfig的话几乎不用人工配置,命令也不用敲多少行。编译内核算是学Linux Kernel最开始的部分。
编译步骤:
1. 到http://www.kernel.org/ 上下载最新的内核源代码linux-2.6.35.2.tar.bz2(目前最新的版本),然后放在/usr/src目录下。
2. 为了使编译过程方便,建议进入root账户进行操作,这样做使你不用每次都用sudo命令。(我还不太了解这样做安全性是否可靠)
进入Terminal,执行:su root 然后输入你的Password,这样就在root账户权限下进行剩下的操作了。
3. 下载的Linux源码是压缩包,需要解压到目录下:tar -j x vf linux-2.6.35.2.tar.bz2 -C /usr/src
4. 进入解压后的目录:cd /usr/src/linux-2.6.35.2
5. 检查有无不正确的.o文件和依赖关系: make mrproper (其实这一步可以省略,因为是刚下载好的源码,一定是干净的;如果使用的是已经编译过的code,则需要做这一步)
6. 配置Kernal选项:make menuconfig (这一步很重要,它决定了你可以个人定制化你的Kernel。当你使用menuconfig时,会有一些选择列出来) 主列表如下:
General Setup: 常规的配置,比如Kernel config, CPU Group,Aduiting等等
Loadable module support: 定制你要加载哪些modules
Enable the block layer: 主要是块设备和大文件的设置
Processor type and features: 处理器配置和定制化
Power management options: 电源管理的定制化,比如Hibernate这样的
Bus options: PCI总线的定制
Executable file formats: 主要是设置ELF的配置
Networking support: 定制网络选项,包括Wireless,Bluetooth和Network选项
Device Drivers: 定制你需要加载的设备驱动
Fireware Drivers: BIOS和EFI这样的固件驱动设置
File System: 文件系统的设置,包括EXT3, EXT4, FAT, CD/DVD...等等N种
Kernel hacking: 主要是设置Kernel debugging的,做内核调试会有用
Security options: 安全选项
Cryptographic API: 加密设置,包括MD5, SHA1, CRC等等N种加密算法的配置
Virtualization: 虚拟化设置
Library routines: 主要定制CRC校验的function
上面是16大项,每一项都有N多小项,说真的这个里面每一项都够研究一阵子的。不过对内核编译而言,你可以全部采用默认选项(会延长编译时间)。设置好了menuconfig,保存退出。
7. 建立Modules依赖关系: make dep
8. 删除配置后剩下的不适用的文件:make clean
9. 编译内核:make bzImage (这个会花些时间,看机器情况和menuconfig的定义而言。我采用默认的设置,编译时间花了20分钟左右。如果Kernel小于512K,可以用make zImage 命令)
10. 编译内核模块:make modules (这个也会花点时间,要看你定制的modules数量而言。采用默认设置,花了大约25分钟。你可以用make -j<n> 加快编译速度,n代表你CPU的数量)
11. 安装内核模块:make modules_install
12. 安装内核:make install
13. 创建initrd文件:(1) cd/ (2)输入:mkinitramfs 2.6.35.2 -o /boot/initrd.img-2.6.35.2-generic
14. 拷贝编译好的内核image: cp /usr/src/linux-2.6.35.2/arch/i386/boot/bzImage /boot/vmlinuz-2.6.35.2-generic
15. 最后一步,修改Grub,更新启动列表:update-grub (如需手动编辑grub.cfg, 则在root账户下使用gedit就可以了)
(注:Ubuntu10.04已经使用了Grub2来管理启动设置,而不是Grub,所以在以往的/boot/grub路径下你是找不到menu.lst的, 因为Grub2已经使用了/boot/grub/grub.cfg来管理配置启动设置,不过最好不要手动编译这个文件,具体的方式是编辑/etc/default/grub和/etc/grub.d下的脚本文件。有关Grub2的详细教程,请参考https://docs.google.com/Doc?docid=0AeVQ5PqmbeaoZGc0czgyOWtfMjRjbWo0ODVoYw&hl=en )
16. Reboot机器,然后Enjoy it!