对某个版本的Linux内核做了修改以后,如果希望发布出去给别人用,那么就需要制作针对此版本的patch文件。
patch文件是一个文本文档,这个文档包含了在两个不同版本的源代码树之间的变化。
为了正确地打上一个补丁,你需要知道这个补丁是从哪个基础版本产生的以及这个补丁要把目前的源代码树变化到什么新版本。
这些信息或者会出现在补丁原数据中,或者可能从文件名中推断出来。
比如基于kernel内核做了修改,修改了LCD代码,
修改前的内容放在文件夹kernel下,
修改后的内容放在文件夹kernel_new下,
那么制作patch文件的命令为
zhenwx-desktop:~/sourcecode/$ diff -Naur kernel/ kernel_new/> zwx-lcd.patch当前目录为/home/zhenwx/sourcecode/,该目录有原来修改前的内核kernel目录和修改后的目录kernel_new
2,怎样打补丁patch和卸载补丁patch
用patch命令来打补丁。patch读取一个diff(或者patch)文件,然后把文件中描述的变化内容应用到代码树上。
Linux内核中的补丁是相对于保存内核源代码目录的父目录而生成的。
patch文件中的文件路径包含了它所基于的内核源文件目录名(或者像是"a/"和"b/"之类的其它名字),这可能和自己的内核源代码目录名不匹配,
切换到自己的内核源代码目录,打补丁的时候去掉patch中文件名字路径的第一个分量(patch命令的-p1参数)。
使用-R参数卸载掉一个以前已经打上的补丁。
打补丁:
patch -p1
卸载掉这个补丁:
patch -R -p1
假设zwx-lcd.patch和kernel文件夹是在同一目录下,且上述命令在kernel文件夹内执行
如果在/sourcecode目录下面执行命令
zhenwx-desktop:~/sourcecode/$patch -p0<../zwx-lcd.patch
语 法:patch [-bceEflnNRstTuvZ]
[-B <备份字首字符串>]
[-d <工作目录>]
[-D <标示符号>]
[-F <监别列数>]
[-g <控制数值>]
[-i <修补文件>]
[-o <输出文件>]
[-p <剥离层级>]
[-r <拒绝文件>]
[-V <备份方式>]
[-Y <备份字首字符串>]
[-z <备份字尾字符串>]
[--backup-if -mismatch]
[--binary]
[--help]
[--nobackup-if-mismatch]
[--verbose]
[原始文件 <修补文件>] 或 path
[-p <剥离层级>] < [修补文件]
patch指令是让用户利用设置修补文件的方式,修改,更新原始文件。
倘若一次仅修改一个文件,可直接在指令列中下达指令依序执行。
如果配合修补文件的方式则能一次修补大批文件,这也是Linux系统核心的升级方法之一。
-b或--backup 备份每一个原始文件。
-B<备份字首字符串>或--prefix=<备份字首字符串> 设置文件备份时,附加在文件名称前面的字首字符串,该字符串可以是路径名称。
-c或--context 把修补数据解译成关联性的差异。
-d<工作目录>或--directory=<工作目录> 设置工作目录。
-D<标示符号>或--ifdef=<标示符号> 用指定的符号把改变的地方标示出来。
-e或--ed 把修补数据解译成ed指令可用的叙述文件。
-E或--remove-empty-files 若修补过后输出的文件其内容是一片空白,则移除该文件。
-f或--force 此参数的效果和指定-t参数类似,但会假设修补数据的版本为新 版本。
-F<监别列数>或--fuzz<监别列数> 设置监别列数的最大值。
-g<控制数值>或--get=<控制数值> 设置以RSC或SCCS控制修补作业。
-i<修补文件>或--input=<修补文件> 读取指定的修补问家你。
-l或--ignore-whitespace 忽略修补数据与输入数据的跳格,空格字符。
-n或--normal 把修补数据解译成一般性的差异。
-N或--forward 忽略修补的数据较原始文件的版本更旧,或该版本的修补数据已使 用过。
-o<输出文件>或--output=<输出文件> 设置输出文件的名称,修补过的文件会以该名称存放。
-p<剥离层级>或--strip=<剥离层级> 设置欲剥离几层路径名称。
-f<拒绝文件>或--reject-file=<拒绝文件> 设置保存拒绝修补相关信息的文件名称,预设的文件名称为.rej。
-R或--reverse 假设修补数据是由新旧文件交换位置而产生。
-s或--quiet或--silent 不显示指令执行过程,除非发生错误。
-t或--batch 自动略过错误,不询问任何问题。
-T或--set-time 此参数的效果和指定-Z参数类似,但以本地时间为主。
-u或--unified 把修补数据解译成一致化的差异。
-v或--version 显示版本信息。
-V<备份方式>或--version-control=<备份方式> 用-b参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,这个字符串不仅可用-z参数变更,当使用-V参数指定不同备份方式时,也会产生不同字尾的备份字符串。
-Y<备份字首字符串>或--basename-prefix=--<备份字首字符串> 设置文件备份时,附加在文件基本名称开头的字首字符串。
-z<备份字尾字符串>或--suffix=<备份字尾字符串> 此参数的效果和指定-B参数类似,差别在于修补作业使用的路径与文件名若为src/linux/fs/super.c,加上backup/字符串后,文件super.c会备份于/src/linux/fs/backup目录里。
-Z或--set-utc 把修补过的文件更改,存取时间设为UTC。
--backup-if-mismatch 在修补数据不完全吻合,且没有刻意指定要备份文件时,才备份文件。
patch帮助#man patch
-p参数决定了是否使用读出的源文件名的前缀目录信息,不提供-p参数,则忽略所有目录信息,
patch -p0 (“p”指的是路径,后面的 数字表示去掉路径的第几部分。 0,表示不去掉,为全路径)