Chinaunix首页 | 论坛 | 博客
  • 博客访问: 40618
  • 博文数量: 8
  • 博客积分: 327
  • 博客等级: 入伍新兵
  • 技术积分: 90
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-10 12:10
文章分类
文章存档

2011年(8)

最近访客

分类: LINUX

2011-05-10 12:33:54

获取内核源码
在linux内核官方网站 可以随时获取当前版本的linux源代码,可以完整的压缩形式,也可以是增量补丁形式

下载解压内核源码
内核压缩以GNU zip(gzip)和bzip2两种形式发布
bzip2是默认和首选形式,因为在压缩上比gzip有相当的优势,比如以bzip2形式发布的linux内核做
linux-2.6.38.6.tar.bz2 ,下载源代码之后就可以对它进行解压

如果压缩格式是bzip2形式的:
tar -xvjf linux-2.6.38.6.tar.bz2
如果压缩格式是zip形式的:
tar -xvzf linux-2.6.38.6.tar.gz


安装内核源码
1.在什么地方安装源码?
内核源码一般安装在/usr/src/linux目录下,但请注意,不要把这个源码树用于开发,因为发行版本提供的内核通常打了许多补丁,和主线内核存在很大的差异,某些情况下,发行版本的的补丁会修改设备驱动程序使用的内核API。相反编译你的c库所用到得内核版本就是链接到这个源码树。还有,不要以root身份对内核进行修改,应该建立自己的主目录,以root安装新内核,即使在安装下内核时/usr/src/linux目录都应当原封不动

2.什么是补丁和下载补丁
什么是补丁:一个补丁就是一个文本文档,由diff工具创建,它存在两个不同版本的源代码之间的差异。为了正确地应用一个补丁,我们需要知道这个补丁文件是以哪个版本为基础产生出来的,以及它将把目前的源代码变化到什么新的版本,简单地说,就是要清楚产生这个补丁文件的两个源码版本的情况。
通过打补丁的方法可以升级内核版本,可以不用下载整个源代码,这样可以节省时间,像有些网速不给力的,不用等待很久去下载一个完整的内核
针对每个内核版本的补丁文件可以在ftp.kernel.org上面获得

3.如果打补丁和卸载补
patch工具可以用于打补丁和卸载补丁,内核补丁是相对保存内核源码的父目录而生成的,这就意味着,补丁文件中的文件路径包含了内核源码存放的名字(比如linux-2.6.38.6/,或者像是“a/和b/之类的其他名字”)但是很有可能我们本地电脑系统上的内核源码存放目录和补丁中不匹配,我们需要切换到自己的内核目录中,并且执行patch命令的时候加上-p1参数这样就会去掉补丁文件中路径的第一个分量,比如:
#cd /usr/src/linux
#patch -p1 < ../ptach-x.y.z
其实这个路径可以去查看补丁文件,看看补丁打到什么路径看情况进行修改
卸载一个以前打上的补丁,需要用参数“-R”
#patch -R -p1 < ../patch.x.y.z

4.如何利用内核补丁升级内核
有几种情况我举了例子
a.将内核2.6.23升级到2.6.24 这种情况可以直接使用补丁文件patch-2.6.24
#patch -p1 < ../patch-2.6.24

b.将内核从2.6.23.8升级到2.6.24.6这种情况下需要将升级过程分解成几个步骤,首先将2.6.23.8退回到2.6.23,然后再升级到2.6.24,最后升级到2.6.24.6
#bzcat ../patch-2.6.23.8.bz2 | patch -p1 -R
#bzcat ../patch-2.6.24.bz2 | patch -p1
#bzcat ../patch-2.6.24.6.bz2 | patch -p1
为什么这里要用bzcat呢,因为下载得到的内核补丁文件通常使用gzip和bzip2压缩的格式,所以使用前还要将其解压成patch-x.y.z的文件形式,不过,也可以不用解压直接用其上的名字比如bzcat和zcat

c.将内核从2.6.23.6升级到2.6.23.8这种情况需要将升级过程分解,首先将2.6.23.6退回到2.6.23,然后再升级到2.6.23.8
#bzcat ../patch-2.6.23.6.bz2 | patch -p1 -R
#bzcat ../patch-2.6.23.8.bz2 | patch -p1 
除了patch之外,也有其他的工具来打补丁,interdiff ,ketchup等

配置内核
编译内核第一步就是配置配置,这是增加或者减少对一些内核特性饿支持的必要步骤,比如可以为内核增加对ipv6的支持

由于内核提供了数不胜数的功能,支持了难以计数的硬件,因而有许多必须配置它,可以配置的各种选项,以CONFIG_FEATURE形式表示,其前缀为CONFIG。这些配置选项要么是二选一,要么是三选一。二选一就是yes或者no,比如说CONFIG_PREEMPT就是二选一,表示内核抢占功能是否开启,三选一可以是yes,no,module。module意味着该配置选项被选定了,但编译的时候这部分功能的实现代码是以模块的形式生成
选择yes的话就是编译进内核

几种配置方式:
为了完成内核的配置,必须切换到root用户,然后转入内核源码目录(就是你下载新内核的目录)如果:
#cd /usr/src/linux/linux-2.6.38
然后执行下面命令之一:
#make config
#make oldconfig
#make menuconfig
#make gconfig
#make defconfig
#make allyesconfig
#make allmodconfig

1.make config
基于文本的最为传统的也是最为枯草的一种配置方式,但是它可以使用任何情况,这种方式会为每一个内核支持的特性向用户提问,如果用户回答“y”,则把特性编译进内核;回答“m”,则它特性作为模块进行编译;回答“n”,则表示不对该特性提供支持
如果回答每个问题前,必须考虑清楚,如果在配置过程中犯了错误给了错误的回答,就只能按“ctcl+c”强行退出了

2.make oldconfig
make oldconfig和make config类似,但是它的作用是在现有的内核设置文件基础上建立一个新的设置文件,只会向用户提供有关新内核特性的问题,在新内核升级的过程中,make oldconfig非常有用,用户将现有的配置文件.config复制到新内核的源码中,执行make oldconfig,此时,用户只需要回答那些针对新增特性的问题

3make menuconfig
基于终端的一种配置方式,提供了文本模式的图形用户界面,用户可以通过光标移动来浏览所支持的各种特性。使用这用配置方式时,系统中必须安装有ncurese库,否则会显示“Unable to find the Ncurses libraies”的错误提示

4.make xoncifg
基于X Winodws的一种配置方式,提供了漂亮的配置窗口,不过只有能够在X Server上使用root用户欲行X应用程序时,才能够使用,它依赖于QT,如果系统中没有安装QT库,则会出现“Unable to find the QT installation”的错误提示

5.make gconfig
与make xocnifg类似,不同的是make gconfig依赖于GTK库

6.make defconfig
按照默认的配置文件arch/i386/defconfig对内核进行配置,生成.config可以用作初始化配置,然后再使用make menuconfig进行定制化配置

7.make allyesconfig
尽量多地使用“y”设置内核选项值,生成的配置中包含了全部的内核特性

8.make allmodconfig
尽可能多的使用“m”设置内核选项值来生成配置文件

编译内核步骤
1。下载源代码以及解压源代码
#cd /usr/src
#tar -jxvf linux-2.6.38.tar.bz2
#cd /usr/src/linux-2.6.38

2.如果需要的话下载补丁为内核打补丁

3.配置内核(建议使用下面的配置方式)
#make menuconfig

4.编译内核
#make

5.安装内核模块,将所有编译得到的内核模块复制到/lib/modules//目录下面
#make modules_install

6.安装内核
#make install
make install主要完成了3个工作:
a.复制生成内核镜像到/boot目录,在内核编译完成后,源代码树目录arch/i386/boot/中会生成一个bzImage文件,该文件被复制到/boot目录并重名为vmlinuz-2.6.38
b.生成initrd-2.6.38.img文件
c.配置引导程序


编译技巧:
减少编译的垃圾信息,我们希望在编译时看到错误和警告的信息,但对匆匆刷过的屏幕的垃圾信息不感兴趣,可以用下面命令:
#make > /dev/null(就是把无用的ixnxi输出信息重定向到永无返回值的黑洞/dev/null)

加速编译
#make -j2 > /dev/null
可以使用“-j”参数,其中n=2*cpu的个数,对于一般的单cpu系统,通常使用“-j2”参数,为编译过程分配两个任务,这样在进行磁盘I/O操作时候,cpu就不会空闲了

还可以利用distcc(1)或者ccache(1)工具,也可以动态的改善内核的编译时间











阅读(2157) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~