patch命令使用,linux kernel patch
因为u-boot迁移过程中有几个常用文件需要修改,每次手动修改会太麻烦。制作补丁可以解决这个问题。
学习资料的收集比较简单。第一种方法类似于这个首要问题。网上资料很丰富。谷歌或百度搜索,然后选择有价值的材料。第二种方法是阅读联机文档。要完成收集工作,当然最后还是要在自己的Linux上实验,对比总结,消化吸收自己的东西。要摆脱这样的错误观念:你必须学会所有。你知道,一次学完是不可能的。只能先学最常用的,以后在不断练习的过程中逐渐丰富,最后达到比较高的水平。把握的原则是:每天学点东西,学以致用,促进学习。
首先介绍一下diff和patch。我不会在这里介绍man online文档中的所有选项,所以没有必要。99%的时候,我们只会使用几个选项。所以你必须学会这些选项。
1、差异
-
名字
diff -查找两个文件之间的差异
摘要
文件与文件之间的差异[选项]
-
简单来说,diff的作用就是比较两个文件的不同之处并记录下来,这就是所谓的diff补丁。语法:diff [option]源文件(文件夹)目标文件(文件夹),即给源文件(文件夹)打补丁,使其成为目标文件(文件夹)。术语是“升级”。以下是三个最常用的选项:
-r是一个递归选项。设置此选项时,diff将比较两个不同版本的源代码目录中的所有对应文件,包括子目录文件。
-N选项确保修补文件能够正确处理文件被创建或删除的情况。
-u选项以统一的格式创建修补程序文件,这种格式比缺省格式更紧凑。
2、补丁
-
名字
将差异文件修补应用到原件
摘要
修补程序[选项][原始文件[修补文件]]
但通常只是
patch -pnum修补文件
-
简单来说,patch就是diff做的补丁,实现源文件(文件夹)和目的文件(文件夹)之间的转换。这意味着您可以拥有源文件(文件夹)-目标文件(文件夹)或目标文件(文件夹)-源文件(文件夹)。以下是一些最常用的选项:
-p0选项从当前目录中查找目标文件(文件夹)。
-p1选项忽略一级目录,从当前目录开始搜索。
************************************************************
这里用一个例子来说明:
-旧/模块/PCI表1999年9月27日星期一11:03:56
新/模块/PCI表2000年1 2月19日星期二20:05:41
如果使用了参数-p0,则意味着从当前目录中找到一个名为old的文件夹,在其下,查找modules下的pcitable文件进行补丁操作。
如果使用参数-p1,则意味着忽略一级目录(即不考虑旧的),从当前目录中查找模块所在的文件夹,并在它下面查找pcitable。这样做的前提是当前目录必须是模块所在的目录。并且只要指示了diff补丁文件的路径,diff补丁文件可以在任何地方。当然,你可以使用相对路径或者绝对路径。但我通常习惯用相对路径。
************************************************************
-E选项表示如果发现一个空文件,它将被删除。
-R选项表示现在将交换补丁文件中的“新”文件和“旧”文件(实际上是指将新版本打补丁使其成为旧版本)。
下面结合具体实例进行分析和解决,分为打补丁单个文件和打补丁一个文件夹多个文件两种。
环境:在RedHat 9.0下以armlinux用户身份登录。
该树如下所示:
-引导加载程序
-调试
-图像
-内核
-程序
-根文件
-软件
-来源
-系统应用程序
- tmp
`-工具
在程序文件夹下设置补丁文件夹作为实验,然后进入补丁文件夹。
首先,修补单个文件。
1.建立测试文件test0和test1。
[armlinux@lqm补丁]$ cat test0 EOF
111111
111111
111111
文件结束
[armlinux@lqm补丁]$更多测试0
111111
111111
111111
[armlinux@lqm补丁]$ cat test1 EOF
222222
111111
222222
111111
文件结束
[armlinux@lqm补丁]$更多测试1
222222
111111
222222
111111
2.使用diff创建修补程序test1.patch
[armlinux@lqm补丁]$ diff -uN test0 test1 test1.patch
[注意:因为是单个文件,所以不需要-r选项。选项的顺序无关紧要,即可以是-uN或-Nu。】
[armlinux@lqm补丁]$ ls
test0 test1 test1.patch
[armlinux@lqm补丁]$ more test1.patch
************************************************************
补丁文件的结构
修补
头是分别以-/开头的两行,用来表示要打补丁的文件。-开头表示旧文件,开头表示新文件。
修补文件中的多个修补程序
一个补丁文件可能包含许多以-/开头的部分,每个部分用于制作一个补丁。因此,修补程序文件可以包含多个修补程序。
块
是补丁中要修改的地方。一般都是以不需要修改的东西开始和结束。它们只是用来指示要修改的位置。它们通常以@@ @开始,并以另一个块或新修补头的开始结束。
块的缩进
块将缩进一列,该列用于指示是添加还是删除该行。
块的第一列
该符号表示要添加这一行。
符号表示这一行将被删除。
没有加号和减号,说明这只是一个参考,不需要修改。
************************************************************
***diff命令将在修补文件中记录这两个文件的首次创建时间,如下所示* * *
考试0 2006-08-18 09:12:01.0000000000800
考试1 2006-08-18 09:13
@@ -1,3 1,4 @@
222222
111111
-111111
222222
111111
[armlinux@lqm补丁]$ patch -p0 test1.patch
修补文件test0
[armlinux@lqm补丁]$ ls
test0 test1 test1.patch
[armlinux@lqm补丁]$ cat test0
222222
111111
222222
111111
3.您可以移除补丁并恢复旧版本
[armlinux@lqm补丁]$ patch -RE -p0 test1.patch
修补文件test0
[armlinux@lqm补丁]$ ls
test0 test1 test1.patch
[armlinux@lqm补丁]$ cat test0
111111
111111
111111
第二,修补多个文件。
1.创建一个测试文件夹。
[armlinux@lqm补丁]$ mkdir prj0
[armlinux@lqm补丁]$ cp test0 prj0
[armlinux@lqm补丁]$ ls
prj0 test0 test1 test1.patch
[armlinux@lqm补丁]$ cd prj0/
[armlinux@lqm prj0]$ ls
测试0
[arm Linux @ lqm prj 0]$ cat prj 0 name EOF
-
prj 0/prj 0名称
-
文件结束
[armlinux@lqm prj0]$ ls
test0名称测试0
[armlinux@lqm prj0]$ cat prj0name
-
prj 0/prj 0名称
-
[armlinux@lqm prj0]$ cd.
[armlinux@lqm补丁]$ mkdir prj1
[armlinux@lqm补丁]$ cp test1 prj1
[armlinux@lqm补丁]$ cd prj1
[arm Linux @ lqm pr J1]$ cat prj 1 name EOF
-
prj1/prj1name
-
文件结束
[armlinux@lqm prj1]$ cat prj1name
-
prj1/prj1name
-
[armlinux@lqm prj1]$ cd.
2.创建补丁。
[armlinux@lqm补丁]$ diff -uNr prj0 prj1 prj1.patch
[armlinux@lqm补丁]$ more prj1.patch
diff-uNr prj 0/prj 0 name pr J1/prj 0 name
- prj0/prj0name
pr J1/prj 0 name 1970-01-01 08:00:00.0000000000800
@@ -1,3 0,0 @@
-
-prj0/prj0name
-
diff-uNr prj 0/prj 1 name pr J1/prj 1 name
-prj 0/prj 1 name 1970-01-01 08:00:00.000000000800
26:36.000000000 0800
@@ -0,0 1,3 @@
-
prj1/prj1name
-
diff -uNr prj0/test0 prj1/test0
-2006年08月18日09:23
pr J1/test0 1970-01-01 08:00:00.0000000000800
@@ -1,3 0,0 @@
-111111
-111111
-111111
diff -uNr prj0/test1 prj1/test1
- prj0/test1 1970年1月1日08时00分
中国日报网站
@@ -0,0 1,4 @@
222222
111111
222222
111111
[armlinux@lqm补丁]$ ls
prj 0 pr J1 pr J1。补丁测试0测试1测试1。修补
[armlinux@lqm补丁]$ cp prj1.patch ./prj0
[armlinux@lqm补丁]$ cd prj0
[arm Linux @ lqm prj 0]$补丁-P1公关J1。修补
修补文件prj0name
修补文件prj1name
修补文件测试0
修补文件测试1
[armlinux@lqm prj0]$ ls
prj1name prj1.patch test1
[arm Linux @ lqm prj 0]$ patch-R-P1 pr J1。修补
修补文件prj0name
修补文件prj1name
修补文件测试0
修补文件测试1
[armlinux@lqm prj0]$ ls
prj0name prj1.patch test0
-
总结一下:
单个文件
差异从一个文件到另一个文件
补丁P0至文件。补丁
补丁重新P0到文件。修补
多个文件
diffuNr from-docu to-docu to-docu。修补
补丁P1到docu。修补
补丁RP1到docu。修补
-
三、应用
为内核打补丁。前面在创建交叉编译工具链时,其中有一步就是为内核打补丁。当时还不是特别了解,现在很清晰了。参考前面的文章《基于ARM+Linux嵌入式开发的开发工具链的建立》 。
1、首先是解压,因为发布的补丁文件都是使用压缩压缩的。
$gunzip./setup-dir/patch-2 . 4 . 21-RM k1 . gz
2、然后进入你的内核源代码目录
$cd linux-2.4.21
3、打补丁
patchP1././setup-dir/patch-2.4.21-rmk1
打完补丁后,需要检查一下有没有拒绝执行的文件,即检查。重新加入文件的存在。使用命令:
$find .-姓名*。重新加入
如果发现,会将其输出到标准输出终端,默认屏幕。当然,你也可以采用重定向,输出到指定文件,比如拒绝。
$罚款。-姓名*。重新加入拒绝
然后可以查看拒绝的内容了。