如何制作内核补丁及一些技巧
最近阅读内核邮件列表faq时候。发现一个非常有趣的办法。可以大大节约diff的时间。而且可以节约一个内核大小的空间。具体方法如下。
例如我们的内核代码放在/usr/src/linux-2.6.24 中,接下来
# cd /usr/src
# cp -al linux-2.6.24 linux-2.6.24.orig
这样为每个文件建立一个硬连接,就可以节约480M的空间.你可以在linux-2.6.24目录上面打补丁或者是作任何修改.patch程序并不改动原来文件内容.只是把原来的文件存为 文件名.orig. 并新建一个修改后的文件. 这个技巧的巧妙之处就是利用了硬连接. 硬连接可以让多个文件名指向同一个文件而不真正复制这个文件.cp 的l参数建立硬连接.所以看起来有两个目录.其实只有一个目录的文件.另外一个巧妙之处就是利用了patch 和编辑器自动备份的功能.比如emacs编辑器.第一次修改文件时候会把这个文件另存为 文件名~ 这样的格式.这样就保证了原始的文件的内容始终不被改动.
如果你的编辑器不支持自动备份.当你需要修改某个文件的时候就需要作
cp xx.c temp //真正创建一个新文件
mv temp xx.c. //把原来的硬连接覆盖掉
最近阅读内核邮件列表faq时候。发现一个非常有趣的办法。可以大大节约diff的时间。而且可以节约一个内核大小的空间。具体方法如下。
例如我们的内核代码放在/usr/src/linux-2.6.24 中,接下来
# cd /usr/src
# cp -al linux-2.6.24 linux-2.6.24.orig
这样为每个文件建立一个硬连接,就可以节约480M的空间.你可以在linux-2.6.24目录上面打补丁或者是作任何修改.patch程序并不改动原来文件内容.只是把原来的文件存为 文件名.orig. 并新建一个修改后的文件. 这个技巧的巧妙之处就是利用了硬连接. 硬连接可以让多个文件名指向同一个文件而不真正复制这个文件.cp 的l参数建立硬连接.所以看起来有两个目录.其实只有一个目录的文件.另外一个巧妙之处就是利用了patch 和编辑器自动备份的功能.比如emacs编辑器.第一次修改文件时候会把这个文件另存为 文件名~ 这样的格式.这样就保证了原始的文件的内容始终不被改动.
如果你的编辑器不支持自动备份.当你需要修改某个文件的时候就需要作
cp xx.c temp //真正创建一个新文件
mv temp xx.c. //把原来的硬连接覆盖掉
你可以把文件的读属性去掉.来提醒你不要忘记作上面的工作.
chmod -w *.c
这样做的好处很多.因为实际修改内核代码的文件是很少的.节约了大量的空间和diff时间.
下面讲讲如何作patch和要求
1.patch 中不能有control-M字符.一般windows文件会带这种标记.要切记去除
2.无论多大,把patch放在邮件正文中.不要用附件或者其他形式
3.不要使用会吃掉空格的邮件客户端
diff要求.
1.永远从内核根目录做diff,最好的方法就是对两个内核目录树做diff,按照上面的方法很快
2.使用diff -up 或者是diff -uprN 格式
3.避免移动或者改文件变格式,使diff文件无谓的增大.
4.使用尽量新的内核作diff.否则会被大家乎略
5.每个patch针对一个问题.不要把所有的修改放到一个patch里面,如果你只有一个文件改动过
可以用下面的命令
cd /usr/src
diff -up linux-2.6.24.orig/drivers/net/driver_xyz.c /
linux-2.6.24/drivers/net/driver_xyz.c > my_patch
注意.diff的第一个参数是源(也就是未更改的文件)第二个文件是修改后的文件. 切记切记
通常做法
单个文件可以这样
SRCTREE= linux-2.6
MYFILE= drivers/net/mydriver.c
cd $SRCTREE
cp $MYFILE $MYFILE.orig
vi $MYFILE # make your change
cd ..
diff -up $SRCTREE/$MYFILE{.orig,} > /tmp/patch
多个文件. 干净的目录是linux-2.6.12-vanilla,修改过的目录是linux-2.6
MYSRC= /devel/linux-2.6
tar xvfz linux-2.6.12.tar.gz
mv linux-2.6.12 linux-2.6.12-vanilla
diff -uprN -X linux-2.6.12-vanilla/Documentation/dontdiff /
linux-2.6.12-vanilla $MYSRC > /tmp/patch
dontdiff是内核中不需要diff的文件.
如果发现内容有误.欢迎联系我.
我的邮件是 echo 'aGlkZTE3MTNAZ21haWwuY29tCg=='| python -m base64 -d -
完