转自:http://blog.chinaunix.net/u2/60641/showart.php?id=526561
编译 Linux2.6 内核总结
在X86, Ubuntu 上编译Linux2.6内核,总结如下:
基础知识 在介绍如何编译内核之前, 需要对内核相关概念有一定的了解. 关于Linux kernel的介绍浩如烟海, 这里只介绍系统中相关的目录, 文件及命令. /boot /boot/vmlinuz-<version> : 用于启动的压缩内核镜像, 它也就是/arch/<arch>/boot中的压缩镜像. /boot/system.map-<version> : 存储内核符号地址. /boot/initrd.img-<version> : 初始化RAM硬盘时, 用来存储挂载根文件系统所需的模块. /boot/grub/menu.lst : grub的配置文件. (不同的发行版中它可能位于不同位置. /lib/modules 该目录包含了内核模块及其他文件. 注意, modules中一般会有多个目录: 系统自带的内核模块在这里, 你编译自己的内核模块后, 它们也会被安装到这里. 不同的目录由内核版本号来区分. 即modules里目录的名称是内核版本号. (使用$ uname -r 可知当前系统内核所用的模块位于哪个目录). /lib/modules/<kernel-version>/build /lib/modules/<kernel-version>/kernel 这些文件都是文本文件, 可以查看它们. 下载内核, 验证签名, 解压缩 到http://www.kernel.org/pub/linux/kernel/ 下载最新版本的2.6内核. 速度还比较快. 这里以linux-2.6.17.13为例: 1, 下载内核压缩包 bzip2格式比gzip压缩效率更高, 一般就下载bz2的压缩包. 下载了内核压缩包之后, 还可下载对应的sign文件. 它被用来验证内核压缩文档的openPGP签名. 详细信息可参考这里 . $ wget -c http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.17.13.tar.bz2 $ gpg --keyserver wwwkeys.pgp.net --recv-keys 0x517D0F0E
3, 解压缩 解压缩之前, 有个问题值得思考: 要将压缩包解压到何处? 即要在哪个目录进行Linux内核源代码的编译? 内核源码树的README 中有这样一段话:
我采用的方法是: 在/usr/local/src/kernel目录中进行. 编译内核时候, 若在make 后添加 "O=<complete_dir>"将会使生成的目标文件(包括.config)被放置到指定的目录. 否则, 生成的目标文件默认地被放到内核源码目录. 我们就采用默认的方法. 这是安全的. 4, 打补丁 对于kernel.org中的内核, 我个人认为没必要下载patch, 再打补丁. 费那事干嘛, 直接下载bz2包不就行了. 特定的补丁只能针对紧随其前的一个版本. 比如你想从2.6.17.1升级到2.6.17.13. 你得打12次补丁, 忒麻烦了. 但是, 有时候需要对"官方内核"添加补丁, 以支持特定的系统. 比如ARMLinux, 它往往不是发布完整的内核, 而是发布针对特定版本的补丁包. 这种情况下就要知道如何打补丁了. 方法很简单: 把补丁下载, 解压. 得到patch-<version>. 将它放到解压后的内核目录树的父目录中(也就是补丁和内核目录在同一目录). 然后cd到内核目录树中运行 : $ patch -p1 <../patch-<version> 配置内核 显然, 需要make, gcc等工具, 在Ubuntu中, 只需一条简单命令就可安装所有的源代码编译工具: 2, 内核配置工具介绍 Linux提供了多种内核配置工具, 最基础的是 make config , 它列出每个编译选项, 而且是基于文本的, 一般不用它.
其实可以直接在menuconfig中加载已有的配置文件, 不要将它改名为.config. 否则完成配置, 退出menuconfig时会提示你运行 make mrproper. 上面提到的方法只是比较适合于oldconfig! make相关命令 $ make clean : 删除生成的目标文件, 往往用它来实现对驱动的重新编译. 可以查看内核源码树中的README和Makefile了解上述配置方法. 4, 开始配置 1, 修改Makefile (可选) VERSION = 2 我们在编译内核之前, 可以先修改Makefile中的版本信息(一般是修改EXTRAVERSION, 比如EXTRAVERSION =-zp). 这样就能将自己编译的内核同别人编译的相同版本内核区分开来. 修改, 编译之后, 可使用 $ uname -r 查看内核版本信息. 但实际上, 从2.6.8的版本起可在内核版本号后面添加个性化字符串. 所以也就没有必要修改Makefile了: () Local version - append to kernel release 如果你即修改了Makefile中的EXTRAVERSION, 又在配置时定义了local version. 那么local version所定义的字符串将位于末尾, 紧跟在EXTRAVERSION的值之后. 另外, 如果要用到ccache, 也需要修改Makefile. 参考后面的内容! 2, 准备一个.config文件. (1) 使用make defconfig将在源码树的根目录得到.config.
3, 建议配置步骤:
配置完成后,就要进行编译了。编译2.6的内核很简单, Makefile自动检测依赖性,产生编译文件(bzImage),你也不用另外编译modules!. 只需运行: $ make 使用make编译内核的技巧 1, 可以略去编译信息(但仍能看到warning, error) $sudo make > /dev/null $sudo make -j2 > /dev/null 2, 加速编译过程. (1) 可以使用 $ make -j<n> . 其中n = 2 * cpu的个数. 对于一般的单CPU系统, 通常用 $ make -j2 . 为编译过程分配2个人物, 这样在进行磁盘I/O时候, CPU就不会空闲了. 一般这个选项可以将速度提高10%左右. (2) 还可以使用 ccache 来提高编译速度. Debian/Ubuntu系统中默认没有安装, 首先安装它: $ sudo apt-get install ccache . 然后更改内核根目录的Makefile, 将CC和HOSTCC变量定义前添加ccache: CC = $(CROSS_COMPILE)gcc HOSTCC = gcc 更改为: CC = ccache $(CROSS_COMPILE)gcc HOSTCC = ccache gcc 编译生成的文件介绍 vmlinux : 未经压缩的原始linux内核镜像. 编译完成后, 在 arch/i386/boot目录中会有 bzImage 映象文件. 安装内核步骤如下: (2)更改/boot/mynewkernel中bzImage的名字 (3)备份、修改grub配置文件 修改menu.list,加入以下内容(从既有的menu.list中相关的内容拷贝): title zp, make defconfig, 2.6.17.13 root (hd0,2) kernel /boot/mynewkernel/vmlinuz-2.6.17.13 root=/dev/sda3 ro quiet splash savedefault boot (4)安装模块: $sudo make modules_install reboot, 在grub启动菜单中选择新内核启动... 参考资料 |