patch命令使用,linux kernel patch

  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 .-姓名*。重新加入

  如果发现,会将其输出到标准输出终端,默认屏幕。当然,你也可以采用重定向,输出到指定文件,比如拒绝。

  $罚款。-姓名*。重新加入拒绝

  然后可以查看拒绝的内容了。

patch命令使用,linux kernel patch