【转载文章】原地址 https://www.xuebuyuan.com/631811.html
假设你已经大概知道diff/patch命令怎么用了,还不清楚的话,建议先看我的转载“diff/patch的用法和目录关系”
1.制作补丁包
对单个文件生成补丁,这样做大多已足够:
SRCTREE= linux-2.6
MYFILE= drivers/net/mydriver.c
cd $SRCTREE
cp $MYFILE $MYFILE.orig
vi $MYFILE # make your change
cd ..
diff -ruNa $SRCTREE/$MYFILE.orig $SRCTREE/$MYFILE > /tmp/patch #/tmp/patch 可是自己随意指定啦,不一定要这个样子
为了对多个文件生成补丁,你应当解压一个原版内核(vanilla)或一个未被修改过的内核源码树,来对应你自己的源码树,生成一个diff。例如:
tar xvfz linux-2.6.12.tar.gz
//注意哦:原文件和你修改的文件除了你修改的那些代码外其他的都要保持一致,不然其他的差异也会体现在patch包里,譬如你不要找一个编译过的源码和一个刚刚解压没编译的原来来做patch;应该直接复制一份源码,在其中的一份中修改,然后在这两份源码的父目录下用diff命令做patch包。就像下面做的这样子
cp linux-2.6.12 linux-2.6.12-vanilla
//接下来在linux-2.6.12中修改你的代码吧
//修改完后在linux-2.6.12和linux-2.6.12-vanilla共同的父目录下用下面的命令
diff -ruNa linux-2.6.12-vanilla linux-2.6.12 >xxx.patch
2.安装补丁包(不完善版)
如果是自己做的补丁就不用使用patch命令了啊,因为你是直接修改的自己的内核源码,直接编译修改过的源码内核就好了
如果用的下载的补丁,操作如下:
一个补丁就是一个文本文档,这个文档包含了在两个不同版本的源代码树之间的变化。
补丁是通过diff应用程序来创建的。
为了正确地打上一个补丁,你需要知道这个补丁是从哪个基础版本产生出来的以及这个补丁将要把
目前的源代码树变化到什么新的版本。这些信息或者会出现在补丁文件的原数据中,或者可能
从文件名中推断出来。
怎样打补丁和卸载补丁:
Linux内核中的补丁是相对于保存内核源代码目录的父目录而生成的。
这就意味着:patch文件中的文件路径包含了它所基于的内核源文件目录的名字(或者像是"a/"和"b/"
之类的其它名字)。
由于这很可能和你本地机器上的内核源代码目录的名字不匹配(但是对于查看一个没有标签的补丁所
基于的内核版本是非常有用的)。你应该切换到你的内核源代码目录,并且在打补丁的时候去掉patch
中文件名字路径的第一个分量(patch命令的-p1参数可以完成这个任务)。
为了卸载掉一个以前已经打上的补丁,使用-R参数来打补丁。
于是,如果你使用如下的命令来打补丁:
patch -p1 < xxx.patch #找对目录是关键啊,建议再看看我的一篇转载“diff/patch的用法和目录关系”里面说的直观
//譬如上面提到的XXX.patch是你在linux-2.6.12的父目录下做的,就应该在你的linux-2.6.12目录下用这个补丁了哦
如果后悔了,可以卸载掉这个补丁:
patch -R -p1 #还没试过
补丁打好了,然后,就重新编译你的内核吧
//编译内核是应该在源码的主目录下做的,如上就是在linux-2.6.12这个目录下做以下操作
先备份你的内核源码主目录下的.config 文件
make mrproper
将.config文件拷贝回来源码主目录
make
make modules_install
make install
//然后把你的内核镜像文件考到/boot下面 重启系统就可以了