一:怎样为Linux内核打补丁
如果你使用如下的命令来打补丁:
patch -p1 < ../patch-x.y.z
那么你可以像下面这样来卸载掉这个补丁(补丁文件也是需要的):
patch -R -p1 < ../patch-x.y.z
二:补丁是基于哪个版本的内核打的
补丁文件可以从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/
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 < ../patch-2.6.12 # 应用2.6.12补丁
$ cd ..
$ mv linux-2.6.11 linux-2.6.12 # 重命名源代码目录
# moving from 2.6.11.1 to 2.6.12
$ cd ~/linux-2.6.11.1 # 切换到内核源代码目录
$ patch -p1 -R < ../patch-2.6.11.1 # 恢复出来2.6.11.1(这个补丁我们可以到ftp://ftp.kernel.org/pub/linux/kernel/v2.6/里面下)
# 源代码目录现在是2.6.11
$ patch -p1 < ../patch-2.6.12 # 应用新的2.6.12补丁
$ cd ..
$ mv linux-2.6.11.1 linux-2.6.12 # 重命名源代码目录
2.6.x.y内核
-----------
带有四位数字版本号的内核是-stable的内核。他们包含了对一个给定的2.6.x内核的一些安全
问题以及发现的重要的退化的修复。
对于那些想要最近的稳定内核并且对于测试开发中的试验性的版本没有兴趣的
用户来说,我们推荐这个分支。
如果没有可用的2.6.x.y内核,那么最高数字的2.6.x内核是目前的稳定内核。
注意:维护稳定内核的团队通常会做一些增量的补丁,就像是基于最近的主流版本发布
的补丁一样。但是在下面我仅仅说明了非增量的情况。那些增量式的版本可以在下面的ftp
处找到: 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 < ../patch-2.6.12.2 # 回归2.6.12.2补丁
$ patch -p1 < ../patch-2.6.12.3 # 应用新的2.6.12.3补丁
$ cd ..
$ mv linux-2.6.12.2 linux-2.6.12.3 # 重新命名内核源代码目录
-rc内核
-------
这些是候选的发布内核。当Linus认为目前的git(内核的源代码管理工具)内核树处于一个
健全的稳定状态足以用来测试的时候,而发布的开发内核。
这些内核是不稳定的,如果你试着运行他们应该会想到可能会不时地有问题出现。
但是这是主开发分支上的最稳定的内核,并且最终会变成下一个稳定的内核。因此
让尽可能多的人来测试它就显得格外重要。
对于那些想帮忙测试开发中的内核但是又不想跑那些试验性的东西的人来说,这将是
一个非常好的分支。(这样的人应该参照下面的关于-git和-mm内核的部分)
-rc补丁是非增量式的,他们应用于2.6.x内核上,就像上面描述的2.6.x.y内核一样。在-rcN
后缀之前的内核版本号代表了这个-rc的内核最终会变成的内核版本。
因此,2.6.13-rc5意思是这是2.6.13内核的第五个候选的发布版本,并且这个补丁应该打在
2.6.12的内核源代码上。
下面是3个关于怎样打这些补丁的例子:
# 首先是一个从2.6.12到2.6.13-rc3的例子
$ cd ~/linux-2.6.12 # 切换到2.6.12的源代码目录
$ patch -p1 < ../patch-2.6.13-rc3 # 打上2.6.13-rc3的补丁
$ cd ..
$ mv linux-2.6.12 linux-2.6.13-rc3 # 重新命名源代码目录
# 现在从2.6.13-rc3迁移到2.6.13-rc5
$ cd ~/linux-2.6.13-rc3 # 切换到2.6.12的源代码目录
$ patch -p1 -R < ../patch-2.6.13-rc3 # 卸载掉2.6.13-rc3补丁
$ patch -p1 < ../patch-2.6.13-rc5 # 应用新的2.6.13-rc5补丁
$ cd ..
$ mv linux-2.6.13-rc3 linux-2.6.13-rc5 # 重新命名源代码目录
# 最后让我们试着从2.6.12.3到2.6.13-rc5
$ cd ~/linux-2.6.12.3 # 切换到内核源代码目录
$ patch -p1 -R < ../patch-2.6.12.3 # 回返2.6.12.3补丁
$ patch -p1 < ../patch-2.6.13-rc5 # 应用新的2.6.13-rc5补丁
$ cd ..
$ mv linux-2.6.12.3 linux-2.6.13-rc5 # 重新命名源代码目录
-git内核
--------
这些是每天Linus的内核树的快照(在一个git仓库中管理着,因此得名)。
这些补丁通常每天都发布而且代表了的Linus的内核树的当前状态,由于它们是自动产生的
甚至没有任何一个光标的骚动来看它们是不是健全的,所以它们比-rc内核更具有试验性。
-git补丁不是增量的,它们或者是应用在2.6.x内核上或者是应用在一个基础的
2.6.x-rc内核上---这一点你可以从他们的名字上看出来。一个名字是2.6.12-git1的
补丁应用在2.6.12内核源代码上,一个名字为2.6.13-rc3-git2的补丁应用在2.6.13-rc3
的内核源代码上。
这里是一些怎样打这些补丁的例子:
# 从2.6.12迁移到2.6.12-git1
$ cd ~/linux-2.6.12 # 切换到内核源代码目录
$ patch -p1 < ../patch-2.6.12-git1 # 应用2.6.12-git1补丁
$ cd ..
$ mv linux-2.6.12 linux-2.6.12-git1 # 重新命名内核源代码目录
# 从2.6.12-git1迁移到2.6.13-rc2-git3
$ cd ~/linux-2.6.12-git1 # 切换到内核源代码目录
$ patch -p1 -R < ../patch-2.6.12-git1 # 回返2.6.12-git1补丁
# 我们现在有了一个2.6.12内核
$ patch -p1 < ../patch-2.6.13-rc2 # 打上2.6.13-rc2补丁
# 内核现在是2.6.13-rc2
$ patch -p1 < ../patch-2.6.13-rc2-git3 # 打上2.6.13-rc2-git3补丁
# 内核现在是2.6.13-rc2-git3
$ cd ..
$ mv linux-2.6.12-git1 linux-2.6.13-rc2-git3 # 重新命名内核源代码目录
-mm内核
-------
这是Andrew Morton发布的实验性的内核
-mm树作为一个新特性和实验性的补丁的实验场。一旦一个补丁在-mm中经过一段时间被证明
有价值,为了使它能包含在主流内核中,Andrew就会把它推给Linus。
尽管鼓励的方法是通过-mm树把补丁推给Linus,这个步骤并不是总被实行。子系统的维护者
(或者个人)有些时候直接把补丁推给Linus,尽管(或者之后)它们已经被它并到了-mm中并得
到了测试(或者有些时候并没有事前在-mm中得到测试)。
通常情况下你应该尽力使你的补丁通过-mm中最大程度测试后再到达主流内核中。
这个分支是一个持续的变化并且包含了一些实验性的特征,很多正在debug的补丁并不适合于
主流的内核等等。这个分支是这个文档中描述的最具有试验性的分支。
这些内核内核不适合于应用在要求稳定的系统上面,并且在运行中比其他任何的分支都可能承担
更大的风险(确信你有最新的备份---跟踪了任何试验性的内核但是甚至更多,于是达到-mm内核)。
这些内核除了包含所有的试验性的补丁以外,它们还包含了在主流-git内核发布的时候任何
可用的改变。
对-mm内核测试会得到极大的赏识,因为这个分支的总的目的就是为了在改变被加到更加稳定的
主流的Linus内核树之前,消除退化、死机、数据失败bug、build失败(以及任何通常意义上的bug)。
但是-mm的测试者应该清醒地认识到这个源代码树中的失败会比其他任何树中的都要普遍。
-mm内核并不会以一个固定的时间发布,但是通常一些-mm内核会在每一个-rc内核(通常1到3个)
发布的中间。-mm内核或者是应用于一个基础的2.6.x内核(当还没有-rc内核发布的时候)或者应用于
一个Linus -rc的内核。
这里有一个打-mm补丁的例子
# 从2.6.12到2.6.12-mm1
$ cd ~/linux-2.6.12 # 切换到2.6.12的源文件目录
$ patch -p1 < ../2.6.12-mm1 # 打一个2.6.12-mm1的补丁
$ cd ..
$ mv linux-2.6.12 linux-2.6.12-mm1 # 重新正确命名这个源文件
# 从2.6.12-mm1到2.6.13-rc3-mm3
$ cd ~/linux-2.6.12-mm1
$ patch -p1 -R < ../2.6.12-mm1 # 卸载掉2.6.12-mm1补丁
# 现在我们得到了一个2.6.12的源文件
$ patch -p1 < ../patch-2.6.13-rc3 # 打一个2.6.13-rc3的补丁
# 我们现在得到一个2.6.13-rc3的源文件
$ patch -p1 < ../2.6.13-rc3-mm3 # 打一个2.6.13-rc3-mm3的补丁
$ cd ..
$ mv linux-2.6.12-mm1 linux-2.6.13-rc3-mm3 # 重新命名源文件目录
三:到 http://http.kernel.org中看到的东西
例如我在2010.07.17是看到的是以下内容:
从上面可以分析出:
稳定版本为: stable标记的是稳定的
mainline:2.6.35-rc5是对内核版本2.6.35的测试版,它的补丁是打在35-1=34,也就是在2.6.34上的,如果我们在2.6.34上面打了这个补丁,也就是相当于2.6.35-rc5的FULL SOURCE。注意:1.首先这个补丁打了过后的内核是测试版本,也就是不稳定版本2.,注意这些补丁不能应用于2.6.x.y的内核
Snapshot:2.6.35-rc5-git2表示这个补丁是打在2.6.35-rc5上的,打完这个补丁的内核代码比起2.6.35-rc5更有试验性,更不稳定,很简单,2.6.35-rc5-git2过后可能就是2.6.35-rc6了,说明2.6.35-rc5-git2还是2.6.35-rc6得测试。
Linux-next:应该和snapshot是差不多的,这个不太清楚。
四:总结以下几点:
1. 首先这个补丁打了过后的内核是测试版本,也就是不稳定版本2.,注意这些补丁不能应用于2.6.x.y的内核,而是应用在2.6.x的基础内核---如果你需要从2.6.x.y到2.6.x+1,那么你首先需要卸载掉2.6.x.y的补丁即把它变成2.6.x的基础内核
2. 如果2.6.34.1的补丁怎么打呢?我们只要把2.6.24.1的patch打到基础内核2.6.34上就可以了,同样2.6.34.5的补丁,我们不需要先打2.6.34.1到5的补丁,因为补丁是非增量的,我们直接把这个补丁打在基础内核2.6.34上就可以了)
3.补丁通常是非增量式的,他们应用于2.6.x内核上,就像上面描述的2.6.x.y内核一样。例如在-rcN后缀之前的内核版本号代表了这个-rc的内核最终会变成的内核版本。