向Linux内核应用补丁
-------------------------
Original by: Jesper Juhl, August 2005
Last update: 2006-01-05
什么是补丁?
补丁就是文本文档,里面存放了两个不同版本代码树之间不同之处的一些元数据。
补丁由‘diff’程序产生。要正确使用补丁,必须知道该补丁基于什么版本,应用之后代码树进入那个新版本。
怎么应用或者回滚一个补丁?
首先要进入内核源代码树顶目录,
应用补丁:
patch -p1 < ../patch-x.y.z
回滚:
patch -R -p1 < ../patch-x.y.z
注释:
1. patch的-pNUM参数,用来指示从patch文件中的文件名中,从顶层目录开始剥去NUM个目录层次,例如补丁文件中的一个diff文件为:
diff --git a/Makefile b/Makefile
如果我们在当前目录使用patch -p1对代码树打补丁,则patch程序要先把文件名’a/Makefile‘剥去一层,然后把补丁应用在当前目录的Makefile文件上;
2. ’<'是使用重定向的方法传递给‘patch’程序补丁数据,另外我们也可以用其他方法:
patch -pi -i ../patch-x.y.z
zcat ../patch-x.y.z.gz | patch -p1
bzcat ../patch-x.y.z.bz2 | patch -p1
3. --try-run参数可以模拟打补丁的过程,并产生响应的输出,但不会真正的应用该补丁.
打补丁的常见错误:
待补充
patch程序的替代程序:
学习使用interdiff程序.
从哪儿下载补丁:
The 2.6.x.y (-stable) and 2.6.x patches live at
ftp://ftp.kernel.org/pub/linux/kernel/v2.6/
The -rc patches live at
ftp://ftp.kernel.org/pub/linux/kernel/v2.6/testing/
The -git patches live at
ftp://ftp.kernel.org/pub/linux/kernel/v2.6/snapshots/
The -mm kernels live at
ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/
2.6.x内核:
这种3个版本号的内核时Linus发布的基础稳定版本(base stable releases),而在这种版本上面,
如果出现内核的倒退或者严重问题的话,就会基于基础稳定版本发布一个修复补丁,然后就形成4个
数字的稳定版内核。这里要强调,4位数版本内核补丁都是基于3位数版本内核的,例如:2.6.12版
本发布之后,又连续出现了几个补丁:
patch-2.6.12.1
patch-2.6.12.2
patch-2.6.12.3等等
这几个补丁都是基于2.6.12的,应用这几个补丁之前,内核版本都要设定为2.6.12.当2.6.x内核之
后出现了2.6.x+1版本的补丁之后,该补丁也是基于2.6.x的。
-rc内核
候选发型内核(release-candidate)。这是由Linus发行的开发板内核。每当Linus觉得git树已经达到
一定的稳定状态,且可以用来测试的时候,他就会发布一个这样的版本。
-rc内核补丁的应用方法跟4位数版本号内核一样,例如: 2.6.x-rcN补丁是基于2.6.x代码树的。
-git内核
这是Linus内核树的日常快照,使用git源进行管理。这种补丁应用应该很少,一些例子如下:
# 从2.6.12 到2.6.12-git1
$ cd ~/linux-2.6.12
$ patch -p1 < ../patch-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
$ patch -p1 < ../patch-2.6.13-rc2
$ patch -p1 < ../patch-2.6.13-rc2-git3
$ cd ..
$ mv linux-2.6.12-git1 linux-2.6.13-rc2-git3
-mm内核
这是Andrew Morton发布的体验版内核。这些内核里面提供了很多新特性和其他的体验补丁。
一旦Andrew认为一个补丁没问题了,他就会把这个补丁推送给Linus而进入主内核树,也就是git
树。
这里可以看到,-mm是代码进入git树之前的一个步骤,但并不是每个patch都要先经过这里。
一些子系统的维护者就会直接向Linus推送补丁。但一般情况下,补丁都要通过-mm进入-git内核。
-mm内核打补丁的例子:
# moving from 2.6.12 to 2.6.12-mm1
$ cd ~/linux-2.6.12 # change to the 2.6.12 source dir
$ patch -p1 < ../2.6.12-mm1 # apply the 2.6.12-mm1 patch
$ cd ..
$ mv linux-2.6.12 linux-2.6.12-mm1 # rename the source appropriately
# moving from 2.6.12-mm1 to 2.6.13-rc3-mm3
$ cd ~/linux-2.6.12-mm1
$ patch -p1 -R < ../2.6.12-mm1 # revert the 2.6.12-mm1 patch
# we now have a 2.6.12 source
$ patch -p1 < ../patch-2.6.13-rc3 # apply the 2.6.13-rc3 patch
# we now have a 2.6.13-rc3 source
$ patch -p1 < ../2.6.13-rc3-mm3 # apply the 2.6.13-rc3-mm3 patch
$ cd ..
$ mv linux-2.6.12-mm1 linux-2.6.13-rc3-mm3 # rename the source dir
阅读(1335) | 评论(0) | 转发(0) |