伟的博客 研发工程师

如何编译一个内核-Ubuntu方式

2007-06-04

每一个Linux发行版都有自己专门的工具去构建自定义的内核. 本文主要介绍在Ubuntu平台上编译内核, 如何从www.kernel.org(也叫vanilla kernel)获得最新且未改动的内核源代码来构建一个自定义的内核, 这样你可以使用自己的内核而不是发行版的内核, 另外也介绍了如何给内核打补丁, 从而方便增加新的功能. 下面的工作我都在Ubuntu 6.10 Server (“Edgy Eft”)和Ubuntu 6.06 Desktop (“Dapper Drake”)上经过了测试. www.kernel.org网站下载你需要的内核版本, 比如. linux-2.6.18.1tar.bz2(你可以从这里下载所有的2.6内核: http://www.kernel.org/pub/linux/kernel/v2.6/). 然后下载到/usr/src目录: cd /usr/src wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.1.tar.bz2 然后解压内核源代码, 创建一个指向内核源代码目录的linux字符链接: tar xjf linux-2.6.18.1.tar.bz2 ln -s linux-2.6.18.1 linux cd /usr/src/linux 4 给内核源代码打补丁(可选) 有时你的缺省内核不支持新买的设备, 你需要安装新的驱动. 或者你需要使用虚拟技术或其它高级的技术, 而这些现有的内核都不支持. 这样情况下你需要给给内核源代码打补丁(当然补丁已经发布..) 现在我们假设你已经下载需要的补丁(以下例子我叫它patch.bz2)到/usr/src. 运行下面的命令给内核源代码直接打上补丁(你的用户必须位于/usr/src/linux目录): bzip2 -dc /usr/src/patch.bz2 patch -p1 –dry-run bzip2 -dc /usr/src/patch.bz2 patch -p1 第一个命令用于测试, 对内核没有任何影响. 如果没有显示错误, 你可以运行第二个命令给内核打补丁. 如果第一个命令有误, 请务继续的操作! 你也能够通过内核的prepatches方式打补丁. 比如, 如果你需要一个功能, 而这个功能仅存在于2.6.19-rc4中, 正式完整的内核版本仍没有发布, 而patch-2.6.19-rc4.biz2已经发布. 你可以把这个补丁打到2.6.18的内核源代码中, 但请不要达到2.6.18.1或2.6.18.2, 等. 这个规则在接下来的网页中注明: http://kernel.org/patchtypes/pre.html prepatches等同于linux中的测试发行; 他们位于存档的测试目录中, 我们可以使用patch(1)工具对上一个完整发行版(版本号分三部分)打补丁(例如, 2.6.12-rc4 prepatch只可以给2.6.11内核源代码打补丁, 而不是2.6.11.10.) 所以如果你想编译2.6.19-rc4内核, 你必须在步骤3.1下载2.6.18(http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2)替代2.6.18.1内核源代码! 下面是如何给2.6.18打上2.6.19-rc4补丁: cd /usr/src wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.19-rc4.bz2 cd /usr/src/linux bzip2 -dc /usr/src/patch-2.6.19-rc4.bz2 patch -p1 –dry-run bzip2 -dc /usr/src/patch-2.6.19-rc4.bz2 patch -p1 5. 配置内核 使用当前工作内核的配置文件做为新内核配置文件的基础是一个很好的主意. 因此我们拷贝已存的配置文件到/usr/src/linux: cp /boot/config-uname -r ./.config 然后运行 make menuconfig 然后我们看到内核的配置菜单. 移动绿色光标到 Load an Alternate Configuration File 行后选择.config文件(包含了当前工作内核的配置)做为配置文件: 然后浏览内核配置菜单, 选择你需要的功能. 完成配置后, 选择Exit, 回答下面的问题(Do you wish to save your new kernel configuration? 你希望保存新的内核配置吗?), 选择Yes: 6 构建内核 执行下面命令来构建内核: make-kpkg clean fakeroot make-kpkg –initrd –append-to-version=-custom kernel_image kernel_headers 在–append-to-version= 后面你可以写上任何字符串来区别内核版本, 但是必须以” - “符号开始而且后面不包括任何空格. 保持耐心, 内核编译需要一定时间, 主要看你的内核配置和处理器速度. 7 安装新内核 在成功构建内核后, 你在/usr/src目录能发现两个.deb软件包. cd /usr/src ls -l 在我的测试系统上, 他们分别名为 linux-image-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb (包含了实际的内核) 和 linux-headers-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb (包含了需要的文件, 用于以后需要编译额外的内核模块). 我是这样安装的: 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 (现在你甚至能够拷贝这两个.deb文件到其它的Ubuntu系统, 通过上面的方式安装. 你将不再需要编译内核.) 然后检查 /boot/grub/menu.lst文件, 现在你将能发现新内核使用的两个引导配置块: vi /boot/grub/menu.lst 在我测试系统上已经添加好的引导配置块是这样的: title Ubuntu, kernel 2.6.18.1-custom root (hd0,0) kernel /boot/vmlinuz-2.6.18.1-custom root=/dev/sda1 ro quiet splash initrd /boot/initrd.img-2.6.18.1-custom savedefault boot title Ubuntu, kernel 2.6.18.1-custom (recovery mode) root (hd0,0) kernel /boot/vmlinuz-2.6.18.1-custom root=/dev/sda1 ro single initrd /boot/initrd.img-2.6.18.1-custom boot 现在重启系统: shutdown -r now 如果一切进展顺利, 你的新内核正常工作. 你还可以通过运行下面命令来检查新内核是否运行: uname -r 这将会显示如: 2.6.18.1-custom 如果系统没有起来, 重启一下, 你会看到: 按ESC进入GRUB菜单: 选择你以前的内核启动系统, 现在你能再次尝试编译新的工作内核. 不要忘记从/boot/grub/menu.1st文件中移去不需要的引导内核信息. 参考链接: Ubuntu: http://www.ubuntu.com The Linux Kernel Archives: http://www.kernel.org 备注: 转载请保持文章完整性, 欢迎交流. 本文涉及主题: compile, 编译, kernel, linux, ubuntu, 内核 zhaoke 于2006-11-17 6:33 贴于 kernel 分类. 你可以使用这个RSS 2.0 地址来订阅本篇文章的后继留言. 你也可以直接留言, 或是从你的站点 trackback 本篇文章. 5 个留言 zhaoke 2006-11-19 13:57 固定链接 各位抱歉, 忽略了文章开头一个明显的错误, 谢谢Ricky的提示. 这篇文章开头部分和”如何编译一个内核 - Fedora方式“一文很类似, 不过具体的内核编译过程是不相同的. 欢迎交流. 赵珂网志 :: 为什么Ubuntu是最流行的Linux系统(Ubuntu现象) 2007-01-08 22:34 固定链接 […] 相关文章 如何编译一个内核 - Ubuntu方式 […] 真心英雄 2007-03-18 15:22 固定链接 很好,遵照你的过程,可以编译出 kernel的 deb包。 但是有个问题,这种编译方式都是默认采用单cpu的方式,我在双核的机器上,只利用到我一半的cpu处理能力,能否设成两个并发编译任务的默视,我用手工 make -j 2 是可以的,不知道用fakeroot该怎么弄? 谢谢 hixgod 2007-05-09 14:55 固定链接 很不错的文章,转载到了我的blog去了,想你道声谢!! df 2007-05-20 12:06 固定链接 fakeroot make-kpkg –initrd –append-to-version=-custom kernel_image kernel_headers 拷贝东西稍微看一下,这本是一行的,非得分2行。。。。。。

Comments