ubuntu 编译linux2.6,PC  Ubuntu下编译 Linux2.6 内核总结

PC  Ubuntu下编译 Linux2.6 内核总结

(2010-06-21 13:42:21)

编译 Linux2.6 内核总结(转)

在X86, Ubuntu 上编译Linux2.6内核,总结如下:

基础知识

在介绍如何编译内核之前, 需要对内核相关概念有一定的了解. 关于Linux kernel的介绍浩如烟海, 这里只介绍系统中相关的目录,

文件及命令.

/boot

/boot/vmlinuz- : 用于启动的压缩内核镜像, 它也就是/arch//boot中的压缩镜像.

/boot/system.map- : 存储内核符号地址.

/boot/initrd.img- : 初始化RAM硬盘时, 用来存储挂载根文件系统所需的模块.

/boot/grub/menu.lst : grub的配置文件. (不同的发行版中它可能位于不同位置.

/lib/modules

该目录包含了内核模块及其他文件. 注意, modules中一般会有多个目录: 系统自带的内核模块在这里, 你编译自己的内核模块后,

它们也会被安装到这里. 不同的目录由内核版本号来区分. 即modules里目录的名称是内核版本号. (使用$ uname -r

可知当前系统内核所用的模块位于哪个目录).

/lib/modules//build

储存为该版本的内核编译新模块所需的文件. 包括Makefile, .config, module.symVers(模块符号信息),

内核头文件(位于include/, include/asm/中)

/lib/modules//kernel

储存内核目标文件(以.ko为后缀). 它的目录组织和内核源代码中kernel的目录组织相同.

/lib/modules//中:

modules.alias : 模块别名定义. 模块加载工具使用它来加载相应的模块.

modules.dep : 定义了模块间的依赖关系.

modules.symbols : 指定符号属于哪个模块.

这些文件都是文本文件, 可以查看它们.

$ uname -r

uname(1)被用来查看系统信息, 这里对我们有用的是它的"-r"选项, 它显示内核版本信息.

下载内核, 验证签名, 解压缩

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

$ wget -c

http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.17.13.tar.bz2.sign

2, 验证签名

首先从pgp的服务器获取签名公匙, linux内核包的公匙编号是0x517D0F0E. 再利用sign文件来验证.bz2压缩包的签名.

如果输出中有类似gpg: Good signature from "Linux

Kernel Archives Verification Key " 的内容,

说明该包是有效的. 后面给出的警告信息可以忽略.

$ gpg --keyserver wwwkeys.pgp.net --recv-keys 0x517D0F0E

$ gpg --verify linux-2.6.17.13.tar.bz2.sign

linux-2.6.17.13.tar.bz2

GPG签名只是保证镜像网站提供的压缩包和kernel.org所提供的是相同的, 如果你在kernel.org下载,

不需要验证签名.

3, 解压缩

解压缩之前, 有个问题值得思考: 要将压缩包解压到何处? 即要在哪个目录进行Linux内核源代码的编译?

内核源码树的

README

中有这样一段话:

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.

际上, 在我的Ubuntu系统中, /usr/src/ 目录中最初是没有linux目录的.

你可以在/usr/src中新建一个目录,

用内核版本命名, 比如/usr/src/linux-2.6.17.13. 这样,

即便之前在/usr/src中安装了linux的头文件,

也不会对它们造成影响.

我采用的方法是: 在/usr/local/src/kernel目录中进行.

编译内核时候, 若在make 后添加 "O="将会使生成的目标文件(包括.config)被放置到指定的目录. 否则,

生成的目标文件默认地被放到内核源码目录. 我们就采用默认的方法. 这是安全的.

4, 打补丁

对于kernel.org中的内核, 我个人认为没必要下载patch, 再打补丁. 费那事干嘛, 直接下载bz2包不就行了.

特定的补丁只能针对紧随其前的一个版本. 比如你想从2.6.17.1升级到2.6.17.13. 你得打12次补丁,

忒麻烦了.

是, 有时候需要对"官方内核"添加补丁, 以支持特定的系统. 比如ARMLinux, 它往往不是发布完整的内核,

而是发布针对特定版本的补丁包. 这种情况下就要知道如何打补丁了. 方法很简单: 把补丁下载, 解压.

得到patch-. 将它放到解压后的内核目录树的父目录中(也就是补丁和内核目录在同一目录). 然后cd到内核目录树中运行:

$ patch -p1

配置内核

1, 前提: 构建编译环境

显然, 需要make, gcc等工具, 在Ubuntu中, 只需一条简单命令就可安装所有的源代码编译工具:

# apt-get install build-essential

当然, 如果你的内核是要安装到不同体系结构的目标系统中, 还需要构建cross编译环境.

2, 内核配置工具介绍

Linux提供了多种内核配置工具, 最基础的是 make config, 它列出每个编译选项, 而且是基于文本的,

一般不用它.

menuconfig (make menuconfig)

menuconfig是比较主流的配置工具, 它需要curse库的支持, 在Ubuntu中默认是没有的, 先安装它:

# apt-get install libncurses5-dev

xconfig (make xconfig)

xconfig基于X11, 使用qt库, 在Ubuntu中先安装qt库:

# apt-get install libqt3-headers libqt3-mt-dev

3, 内核配置相关

.config配置文件

在内核树的根目录中,有一个.config文件,它记录了内核的配置选项,可直接对它进行修改,再运行(若.config不存在,对内核进行配置后会生成

它,这种情况下当然不能开始就运行oldconfig). 实际上, 如果你手头有合适的 .config 文件, 可以运行 make

oldconfig 直接按 .config 的内容来配置

$ sudo make oldconfig

对内核的配置都是围绕 .config 来展开的. 即便开始 .config 文件不存在, 进行配置后会创造它.

其实可以直接在menuconfig中加载已有的配置文件, 不要将它改名为.config. 否则完成配置,

退出menuconfig时会提示你运行 make mrproper. 上面提到的方法只是比较适合于oldconfig!

make相关命令

$ make oldconfig : 基于已有的.config进行配置, 若有新的符号, 它将询问用户.

$ make defconfig : 按默认选项对内核进行配置(386的默认配置是Linus做的).$ make

allnoconfig : 除必须的选项外, 其它选项一律不选. (常用于嵌入式系统).

$ make clean : 删除生成的目标文件, 往往用它来实现对驱动的重新编译.

$ make mrproper : 删除包括.config在内的生成的目标文件.

可以查看内核源码树中的README和Makefile了解上述配置方法.

4, 开始配置

1, 修改Makefile (可选)

在Makefile中, 有这样的内容:

VERSION = 2PATCHLEVEL = 6SUBLEVEL = 16EXTRAVERSION =

.20NAME=Sliding Snow Leopard

我们在编译内核之前, 可以先修改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.

(2) 使用当前系统内核的配置文件, 一般位于/boot目录中. 它的名称并不是.config.

(3) 使用别的发行版提供的配置文件(网上去下载).

slackware的.config是个不错的起点. 在它的配置文件基础上作出适合自己系统的修改, 比较方便.

也可以拷贝发行版提供商的.config文件.

3, 建议配置步骤:

(1) 将配置文件(不要将它命名为.config!)拷贝到内核源码树根目录.

(2) make menuconfig, 然后将上述的配置文件加载进去.

(3) 配置完成后, 将生成的配置文件备份(.config, 也可以在menuconfig中指定生成的配置文件名).

配置选项是最头疼的问题: 配置时候注意驱动的问题,

尤其是网络驱动. 使用 pppoe 的话, 要选上 ppp 相关的选项. 网卡驱动也要注意, 我刚开始配置的时候, 只加上了

lspci |

grep Ethernet 对应的网卡, 但是重启后找不到eth0, 一怒之下, 把所有的1000M 网卡驱动都选为模块.

总算成功.

以后有空仔细看看. 再就是声卡驱动也要注意.可参考我blog里另一篇文章:

配置2.6内核选项注解

也可以到

Linux Kernel Configuration Archive

看一看, 虽然它里面的内容与图形化配置工具中的help大同小异.

编译内核

配置完成后,就要进行编译了。编译2.6的内核很简单,Makefile自动检测依赖性,产生编译文件(bzImage),你也不用另外编译

modules!. 只需运行:

$ make

使用make编译内核的技巧

1, 可以略去编译信息(但仍能看到warning, error)

$sudo make > /dev/null

$sudo make -j2 > /dev/null

2, 加速编译过程.

(1)

可以使用 $ make -j . 其中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)gccHOSTCC = gcc

更改为:

CC = ccache $(CROSS_COMPILE)gcc

HOSTCC = ccache gcc

编译生成的文件介绍

vmlinux : 未经压缩的原始linux内核镜像.

/arch//boot/zImage(bzImage): 使用zlib压缩后的内核镜像.

注意, 不同的体系结构对压缩后内核镜像的默认命名不同, 比如arm的是zImage, 而i386的是bzImage.

(z表示zlib, bz表示"big zlib", 而非bzip2!)

安装内核

编译完成后, 在 arch/i386/boot目录中会有bzImage映象文件.

安装内核步骤如下:

(1)在/boot目录下新建mynewkernel目录,并将bzImage拷贝到/boot/mynewkernel目录下:

$ sudo cp arch/i386/boot/bzImage /boot/mynewkernel

(2)更改/boot/mynewkernel中bzImage的名字

$ sudo mv bzImage vmlinuz-2.6.17.13

(3)备份、修改grub配置文件

$sudo cp /boot/grub/menu.lst menu.lst.origin

修改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启动菜单中选择新内核启动...

参考资料

(1)

Linux-kernel-tree/README

(2)

kernel-build-howto

(3) 关于ccache, 可参考IBM developworks上的

这篇介绍.

分享:

a4c26d1e5885305701be709a3d33442f.png喜欢

0

a4c26d1e5885305701be709a3d33442f.png赠金笔

加载中,请稍候......

评论加载中,请稍候...

发评论

登录名: 密码: 找回密码 注册记住登录状态

昵   称:

发评论

以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值