红联Linux门户
Linux帮助

为linux内核打补丁的方法

发布时间:2014-03-15 22:03:51来源:红联作者:tioced
来源:linux社区

学习linux内核参考

在Linux内核邮件列表中一个经常被问到的问题就是怎样为Linux内核打一个补丁,或者更具体一点说,存在这么多的主干/分支,一个补丁到底要打在哪个版本的基础内核上。希望这篇文档能够为你解释明白这一点。
除了解释怎样应用以及卸载补丁以外,在这里还提供了一个不同内核树(以及如何为它们打上特定补丁)的简要介绍。
什么是补丁?
----------
一个补丁就是一个文本文档,这个文档包含了在两个不同版本的源代码树之间的变化。
补丁是通过diff应用程序来创建的。
为了正确地打上一个补丁,你需要知道这个补丁是从哪个基础版本产生出来的以及这个补丁将要把目前的源代码树变化到什么新的版本。这些信息或者会出现在补丁文件的原数据中,或者可能从文件名中推断出来。
怎样打补丁和卸载补丁
-------------------
可以使用patch程序来打一个补丁。patch程序读取一个diff(或者patch)文件,然后把文件中
描述的变化内容应用到代码树上。
Linux内核中的补丁是相对于保存内核源代码目录的父目录而生成的。
这就意味着:patch文件中的文件路径包含了它所基于的内核源文件目录的名字(或者像是"a/"和"b/"
之类的其它名字)。
由于这很可能和你本地机器上的内核源代码目录的名字不匹配(但是对于查看一个没有标签的补丁所
基于的内核版本是非常有用的)。你应该切换到你的内核源代码目录,并且在打补丁的时候去掉patch
中文件名字路径的第一个分量(patch命令的-p1参数可以完成这个任务)。
为了卸载掉一个以前已经打上的补丁,使用-R参数来打补丁。
file:///D|/applying-patches.txt
file:///D|/applying-patches.txt
于是,如果你使用如下的命令来打补丁:
patch -p1 http://cyberelk.net/tim/patchutils/)来产生一个文件来表示
两个补丁文件之间之间的不同,然后打上这个文件。这可以使你从一个像2.6.12.2的版本一步
就可以到达版本2.6.12.3。-z标志甚至可以使你送给interdiff一些使用gzip或者bzip2压缩的
格式文件而不用使用zcat或者bzcat或者手动解压缩。

下面展示了你可以怎样一步就可以从2.6.12.2到达2.6.12.3
interdiff -z ../patch-2.6.12.2.bz2 ../patch-2.6.12.3.gz | patch -p1
尽管interdiff可以节省一到两步,但是我还是建议你通常情况下应该做这些附加的步骤,
这是由于在某些情况下interdiff会把事情弄糟。
另外的一个替代品是“ketchup”,是一个使用python写的脚本,这个脚本可以自动下载和
打上一些补丁(http://www.selenic.com/ketchup/).
另外一些比较好的工具是diffstat,可以显示patch所作的所有改变的总结;lsdiff,可以显示
在一个patch文件中受影响的文件的简短列表,以及(可选)每一个补丁的行号码;grepdiff,可
以显示在补丁包含给定的正则表达式的时候显示一个被补丁文件修改的文件的列表。
我可以从哪儿下载这些补丁?
file:///D|/applying-patches.txt
file:///D|/applying-patches.txt
补丁文件可以从http://kernel.org/来获得
最近的补丁文件可以从首页的链接中得到,但是他们也有自己的特定的主页。
2.6.x.y(-稳定)以及2.6.x补丁位于:
ftp://ftp.kernel.org/pub/linux/kernel/v2.6/
-rc补丁位于:
ftp://ftp.kernel.org/pub/linux/kernel/v2.6/testing/
-git补丁位于:
ftp://ftp.kernel.org/pub/linux/kernel/v2.6/snapshots/
-mm内核补丁位于:
ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/
在ftp.kernel.org中,你可以使用ftp.cc.kernel.org,这里cc是一个国家的代码。这样你就可以从一个
在地理上离你比较近的位置的镜像站点下载,从而使你获得较快的下载速度,全局上更少的带宽以及
对于kernel.org主服务器的更小的压力---这是比较好的事情,所以你还是在可能的时候使用这些镜像
站点。
2.6.x内核
这是Linus发布的基础稳定版本.发布的最高版本是最新的。
如果发现了冲突或者严重的瑕疵,那么在这个基础上,一个-stable的修正补丁就会被发布
出来(参见下面)。一旦一个新的2.6.x的基础内核发布出来,就可以得到一个测试版本的补丁
,这个补丁基于先前的2.6.x版本内核和这个新的内核。
为了应用一个从2.6.11到2.6.12的补丁,你最好按照下面来做(注意这些补丁不能应用于2.6.x.y的内核,
而是应用在2.6.x的基础内核---如果你需要从2.6.x.y到2.6.x+1,那么你首先需要卸载掉2.6.x.y的补丁)
下面是一些例子:
#从2.6.11到2.6.12
$ cd ~/linux-2.6.11 # 切换到内核源代码目录
$ patch -p1 ftp://ftp.kernel.org/pub/linux/kernel/v2.6/incr/
这些补丁不是增量式的,意味着例如对于2.6.12.3补丁不能应用于2.6.12.2的内核源代码
上去,但是可以应用在2.6.12内核代码上。
因此,为了为了把2.6.12.3的补丁应用到你使用的2.6.12.2的内核源代码上,你不得不卸载掉
2.5.12.2补丁(因此你可以得到一个基础的2.6.12的内核源代码),并且应用新的2.6.12.3补丁。
下面是一个小例子:
$ cd ~/linux-2.6.12.2 # 切换到内核源代码目录
$ patch -p1 -R
文章评论

共有 0 条评论