LINUX的patch文件打patch

如何制做LINUX的patch文件及如何打patchlinux

对某个版本的Linux内核作了修改之后,若是但愿发布出去给别人用,那么就须要制做针对此版本的patch文件。 patch文件也叫补丁,就是一个文本文档,这个文档包含了在两个不一样版本的源代码树之间的变化。 补丁是经过diff应用程序来建立的。 为了正确地打上一个补丁,你须要知道这个补丁是从哪一个基础版本产生出来的以及这个补丁将要把 目前的源代码树变化到什么新的版本。这些信息或者会出如今补丁文件的原数据中,或者可能从文件名中推断出来。git

1,如何制做补丁patch文件       好比基于kernel内核 作了修改,修改了LCD代码,修改前的内容放在文件夹kernel下,修改后的内容放在文件夹kernel_new下,那么制做patch文件的命令为    zhenwx-desktop:~/sourcecode/$diff -Naur kernel/    kernel_new/ > zwx-lcd.patch      当前目录为   /home/zhenwx/sourcecode/,该目录有原来修改前的内核kernel目录和修改后的目录kernel_new    执行命令为  diff -Naur kernel/    kernel_new/ > zwx-lcd.patch    diff命令就会对比kernel和kernel_new目录的文件,产生patch文件zwx-lcd.patch    这时就 能够把zwx-lcd.patch发布到网上。    这个patch文件是描述文件的路径信息和将第几行内容删除,在第几行添加内容,删除用减号,添加用加号     2,怎样打补丁patch和卸载补丁patch     可使用patch程序来打一个补丁。patch程序读取一个diff(或者patch)文件,而后把文件中     描述的变化内容应用到代码树上。     Linux内核中的补丁是相对于保存内核源代码目录的父目录而生成的。     这就意味着:patch文件中的文件路径包含了它所基于的内核源文件目录的名字(或者像是"a/"和"b/"     之类的其它名字)。     因为这极可能和你本地机器上的内核源代码目录的名字不匹配。你应该切换到你的内核源代码目录,而且在打补丁的时候去掉patch     中文件名字路径的第一个份量(patch命令的-p1参数能够完成这个任务)。     为了卸载掉一个之前已经打上的补丁,使用-R参数来打补丁。     因而,若是你使用以下的命令来打补丁:      patch -p1web

    那么你能够像下面这样来卸载掉这个补丁:      patch -R -p1      例如其余人下载到上面提供的patch文件后,只需在标准的kernel内核目录里执行  zhenwx-desktop:~/sourcecode/kernel/$     patch -p1<../zwx-lcd.patch        这里假设zwx-lcd.patch和kernel文件夹是在同一目录下,且上述命令 在kernel文件夹内执行  若是在/sourcecode目录下面执行命令  zhenwx-desktop:~/sourcecode/$     patch -p0<../zwx-lcd.patch        linux下patch命令使用详解     linux打补丁命令     功能说明:修补文件。     语  法: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  在修补数据不彻底吻合,且没有刻意指定要备份文件时,才备份文件。   --binary  以二进制模式读写数据,而不经过标准输出设备。   --help  在线帮助。   --nobackup-if-mismatch  在修补数据不彻底吻合,且没有刻意指定要备份文件时,不要备份文件。   --verbose  详细显示指令的执行过程。     patch,是打补丁的命令,有不少用法,见帮助#man patch  -p参数决定了是否使用读出的源文件名的前缀目录信息,不提供-p参数,则忽略全部目录信息,   patch -p0       (“p”指的是路径,后面的数字表示去掉路径的第几部分。0,表示不去掉,为全路径)   patch -p1       (“p”后面的数字1,表示去掉前第一个路径,第一个"/"之前的目录,依此类推。  如/usr/src/linux-2.6.11/Makefile这样的文件名,在提供-p3参数时将使用linux-2.6.11/Makefile做为所要patch的文件。   对于刚才举的Linux内核源码LCD升级包的例子,假定源码目录位于/home/zhenwx/sourcecode/kernel中,  则在当前目录为/home/zhenwx/sourcecode/时使用"patch -p0<../zwx-lcd.patch"能够工做,  在当前目录为/home/zhenwx/sourcecode/kernel时,使用"patch -p1<../zwx-lcd.patch"也能够正常工做。   若是patch文件里面描述的第一级目录和你本身的第一级目录名字不同,要将第一级的目录去掉,这个方法就派上用场了。   好比若是你拿到的patch描述的目录和你的不同,patch第一行描述的目录信息   diff --git a/arch/arm/mach-msm/acpuclock-8064.c b/arch/arm/mach-msm/acpuclock-8064.c   可是你的目录既不是a,也不是b,那么你就要将目录的第一层去掉,到你的kernel的路径下面打patch   用-p1参数ui