Linux内核补丁与patch/diff使用详解

一、Linux内核版本类型及patch简介:
1) 2.6.x为基础版本,patch位置:
  
2) 2.6.x.y为2.6.x基础版本之上派生出来的修正版本,称为-stable内核版本,patch位置:
3) 2.6.x.rcN(Release Candidate)内核,是在2.6.(x-1)之上派生出来的之后版本的侯选版本;此种内核
   不稳定,发布的时候表示可以用来测试了;
   例如对2.6.21加了新功能后派生出2.6.22-rc1,patch位置:
4) git内核是每日内核树的快照,此类型比rc内核更不稳定,从基础版本或rc版本派生出来;
   例如2.6.26-git1,2.6.26-rc9-git2,patch位置:
5) mm内核是专门针对内核的mm模块维护的版本,类似于git版本从基础版本或rc版本派生出来;
   例如2.6.21-mm2, 2.6.21-rc2-mm1,patch位置:
 
不同类型内核的patch名称在前面加上“patch-”(mm内核除外,直接用的版本号),例如:patch-2.6.21, patch-2.6.21.7, patch-2.6.26-git1, patch-2.6.26-rc9-git2, 2.6.21-mm2, 2.6.21-rc2-mm1
 
二、内核补丁类型
1) 增量补丁
   同一类型的版本的补丁是用本版本对相邻的前一个版本制作的。
  例如,patch-2.6.21是对2.6.20做的补丁,patch-2.6.22是对2.6.21做的补丁,这就是增量补丁。
   2.6.x基础版本内核,采用的是增量补丁。
 
2) 非增量补丁
   也增量补丁相反,是基本某一固定版本制作的补丁,而非相邻的前一个版本。
  例如,patch-2.6.21.3是2.6.21.3版本相对于2.6.21基础版本做的补丁,patch-2.6.21.4是2.6.21.4版本相对于2.6.21基础版本做的补丁,也就是说2.6.21.4与2.6.21.3之前没有补丁可用。
   rc内核,git内核和mm内核都是非增量补丁,都是相对于当前基础版本或rc版本制作出来的补丁。
  
另外,对于rc内核,git内核,相应的patch目录下面有inc目录中,包含有增量补丁。
 
三、使用patch命令为内核补丁
   1.现有基础内核版本2.6.21,想转成2.6.21.7内核stable版本,应该怎么办?
   a) 去http://www.kernel.org/pub/linux/kernel/v2.6/下载patch-2.6.21.7;
   b) Linux shell下面,cd到2.6.21内核源文件根目录(linux-2.6.21),将patch-2.6.21.7也放在本目
      录(命令执行的当前止录),执行patch命令::patch -p1 < patch-2.6.21.7
      (p1的意思是忽略patch文件(即diff文件)内容中的第一个路径)
   c) 打完补丁后,即变成了2.6.21.7的内核了,如果想回退至2.6.21基础版本,执行如下命令即可:
      patch -R -p1 < patch-2.6.21.7
      (-R的参数意思表示回退这个patch)
 
   2.现有基础内核版本2.6.21,想转成2.6.23.1内核stable版本,应该怎么办?
   a) 同1中下载patch-2.6.22, patch-2.6.23, patch-2.6.23.1文件,并设置执行路径和环境;
   b) patch -p1 < patch-2.6.22    变成了2.6.22
      patch -p1 < patch-2.6.23    变成了2.6.23
      patch -p1 < patch-2.6.23.1  变成了2.6.23.1
   c) 回退操作
      patch -R -p1 < patch-2.6.23.1  变成了2.6.23
      patch -R -p1 < patch-2.6.23    变成了2.6.22
      patch -R -p1 < patch-2.6.22    变成了2.6.21
 
   3.现有基础内核版本2.6.21-git2,想转成2.6.22-rc1-mm2内核stable版本,应该怎么办?
   a) 同1中下载patch-2.6.21-git2, patch-2.6.22-rc1, 2.6.22-rc1-mm2文件,
      并设置执行路径和环境;
   b) patch -R -p1 < patch-2.6.21-git2    变成了2.6.21
      patch -p1 < patch-2.6.22-rc1        变成了2.6.22-rc1
      patch -p1 < 2.6.22-rc1-mm2          变成了2.6.22-rc1-mm2
   c) 回退操作
      patch -R -p1 < 2.6.22-rc1-mm2          变成了2.6.22-rc1
      patch -R -p1 < patch-2.6.22-rc1        变成了2.6.21
      patch -p1 < patch-2.6.21-git2          变成了2.6.21-git2
 
   到这里应该明白了内核打补丁是怎么一回事儿了吧,就这么简单。
 
四、使用patch和diff动手制作补丁
1.diff命令制作单个patch
 diff -uN src dst > src2dst.patch
 我们的patch制作完毕了,原来patch实际上就是diff生成的内容,简单吧。
 patch -p0 < src2dst.patch  将src文件打补丁变成dst文件
(注:因为diff命令生成的内容的路径是当前路径,因此-p0表示不去除路径)
 自己实际操作一下就明白了。
2.diff命令制作多个patch - patch合并
 a) 方法一
    对多个文件依次使用diff命令生成多个patch,然后将这些patch合并成一个patch文件即可(如使用重
    定向,对于patch1和patch2:echo patch1 > patch1patch2;echo patch2 >> patch1patch2);
 b) 方法二
    对文件夹的diff命令:diff -uNr srcDir dstDir > all.patch
 
五、总结
 diff -urN src dst > patch        生成patch
 patch -p[0-n] -s < patch         使用patch,-s参数即silent,表示终端无信息输出
 patch -Rp[0-n] < patch           回退patch
 patch -p[0-n] --dry-run < patch  只显示运行结果,不实际生效
 另外,当patch命令检测到冲突时会弹出提示,还会生成一些.rej文件,可查看.rej文件来手动修改。
 
 日常的学习或工作中,使用diff+patch可以提升重复合代码的效率。
展开阅读全文

没有更多推荐了,返回首页