一、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可以提升重复合代码的效率。