免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 795 | 回复: 0
打印 上一主题 下一主题

编译Linux2.6 内核 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-25 20:13 |只看该作者 |倒序浏览
X86, Ubuntu 上编译Linux2.6内核,总结如下:wC8itug
wC8itug
基础知识wC8itug
在介绍如何编译内核之前, 需要对内核相关概念有一定的了解. 关于Linux kernel的介绍浩如烟海, 这里只介绍系统中相关的目录, 文件及命令.wC8itug
wC8itug
/bootwC8itug
wC8itug
/boot/vmlinuz-       : 用于启动的压缩内核镜像, 它也就是/arch//boot中的压缩镜像.wC8itug
/boot/system.map-  : 存储内核符号地址.wC8itug
/boot/initrd.img-     : 初始化RAM硬盘时, 用来存储挂载根文件系统所需的模块.wC8itug
/boot/grub/menu.lst                : grub的配置文件. (不同的发行版中它可能位于不同位置.wC8itug
wC8itug
/lib/moduleswC8itug
wC8itug
该目录包含了内核模块及其他文件. 注意, modules中一般会有多个目录: 系统自带的内核模块在这里, 你编译自己的内核模块后, 它们也会被安装到这里. 不同的目录由内核版本号来区分. 即modules里目录的名称是内核版本号. (使用$ uname -r 可知当前系统内核所用的模块位于哪个目录).wC8itug
wC8itug
/lib/modules//build wC8itug
储存为该版本的内核编译新模块所需的文件. 包括Makefile, .config, module.symVers(模块符号信息), 内核头文件(位于include/, include/asm/中)wC8itug
wC8itug
/lib/modules//kernelwC8itug
储存内核目标文件(以.ko为后缀). 它的目录组织和内核源代码中kernel的目录组织相同.wC8itug
wC8itug
/lib/modules//中:wC8itug
modules.alias       : 模块别名定义. 模块加载工具使用它来加载相应的模块.wC8itug
modules.dep        : 定义了模块间的依赖关系.wC8itug
modules.symbols : 指定符号属于哪个模块.wC8itug
wC8itug
这些文件都是文本文件, 可以查看它们.wC8itug
wC8itug
$ uname -rwC8itug
wC8itug
uname(1)被用来查看系统信息, 这里对我们有用的是它的"-r"选项, 它显示内核版本信息.wC8itug
wC8itug
wC8itug
下载内核, 验证签名, 解压缩wC8itug

http://www.kernel.org/pub/linux/kernel/
下载最新版本的2.6内核. 速度还比较快. 这里以linux-2.6.17.13为例:wC8itug
wC8itug
1, 下载内核压缩包wC8itug
wC8itug
bzip2格式比gzip压缩效率更高, 一般就下载bz2的压缩包. 下载了内核压缩包之后, 还可下载对应的sign文件. 它被用来验证内核压缩文档的openPGP签名. wC8itug
$ wget -c http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.17.13.tar.bz2wC8itug
$ wget -c http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.17.13.tar.bz2.signwC8itug
wC8itug
2, 验证签名wC8itug
wC8itug
首先从pgp的服务器获取签名公匙, linux内核包的公匙编号是0x517D0F0E. 再利用sign文件来验证.bz2压缩包的签名.  如果输出中有类似gpg: Good signature from "Linux Kernel Archives Verification Key " 的内容, 说明该包是有效的. 后面给出的警告信息可以忽略.wC8itug
wC8itug
$ gpg --keyserver wwwkeys.pgp.net --recv-keys 0x517D0F0EwC8itug
$ gpg --verify linux-2.6.17.13.tar.bz2.sign linux-2.6.17.13.tar.bz2wC8itug
wC8itug
GPG签名只是保证镜像网站提供的压缩包和kernel.org所提供的是相同的, 如果你在kernel.org下载, 不需要验证签名.wC8itug
wC8itug
3, 解压缩wC8itug
wC8itug
解压缩之前, 有个问题值得思考: 要将压缩包解压到何处? 即要在哪个目录进行Linux内核源代码的编译? wC8itug
wC8itug
内核源码树的README中有这样一段话:wC8itug
wC8itug
Do NOT use the /usr/src/linux area! This area has a (usually incomplete) set of kernel headers that are used by the library header files.  They should match the library, and not get messed up by whatever the kernel-du-jour happens to be.wC8itug
实际上, 在我的Ubuntu系统中, /usr/src/ 目录中最初是没有linux目录的. 你可以在/usr/src中新建一个目录, 用内核版本命名, 比如/usr/src/linux-2.6.17.13. 这样, 即便之前在/usr/src中安装了linux的头文件, 也不会对它们造成影响.wC8itug
wC8itug
我采用的方法是: 在/usr/local/src/kernel目录中进行.wC8itug
wC8itug
编译内核时候, 若在make 后添加 "O="将会使生成的目标文件(包括.config)被放置到指定的目录. 否则, 生成的目标文件默认地被放到内核源码目录. 我们就采用默认的方法. 这是安全的.wC8itug
wC8itug
4, 打补丁wC8itug
wC8itug
对于kernel.org中的内核, 我个人认为没必要下载patch, 再打补丁. 费那事干嘛, 直接下载bz2包不就行了. 特定的补丁只能针对紧随其前的一个版本. 比如你想从2.6.17.1升级到2.6.17.13. 你得打12次补丁, 忒麻烦了.wC8itug
wC8itug
但是, 有时候需要对"官方内核"添加补丁, 以支持特定的系统. 比如ARMLinux, 它往往不是发布完整的内核, 而是发布针对特定版本的补丁包. 这种情况下就要知道如何打补丁了. 方法很简单: 把补丁下载, 解压. 得到patch-. 将它放到解压后的内核目录树的父目录中(也就是补丁和内核目录在同一目录). 然后cd到内核目录树中运行


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/54285/showart_430390.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP