900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > linux kernel patch 使用说明

linux kernel patch 使用说明

时间:2022-08-30 15:21:27

相关推荐

linux kernel patch 使用说明

内核补丁不是一定需要的,这要看你选择的是怎样的Linux内核,比如下载下来标准的Linux内核,想要编译linux系统在x86的PC机上运行,就根本不用什么板间支持的补丁了,因为标准Linux内核本身基于x86平台测试。而如果使用Embedix内核,开发板是PPC体系的,内核可能本身已经支持PPC,也不需要安装补丁了。但嵌入式系统往往工作在不同的特定目标板上,如arm,这就需要使linux内核扩展对目标体系的支持了。

常见的如arm板,下载了标准Linux内核是不够的,还要从arm linux的相关站点下载相应版本的补丁,标准内核安装了补丁后才能正确配置,对目标体系支持。如linux-2.4.18.tar.bz2内核,打补丁 patch-2.4.18-rmk7.bz2就跟整合了的源码包linux-2.4.18-rmk7.tar.bz2一样了,是一个armlinux系统内核了。而如果需要扩展对m68k芯片的支持,就需要m68k的补丁了。

补丁的安装方法可以参考man patch的说明,我总结自己常用的方法如下:

1、 patch应用的方法是进入内核目录后#patch -p1 < patch文件的位置,注意<前后都有一个空格,如:

#bunzip2 patch-2.4.18-rmk7.bz2把patch-2.4.18-rmk7.bz2解压成patch-2.4.18-rmk7(覆盖了原压缩文件)

把patch-2.4.18-rmk7移动到内核解压目录linux中。

# mv patch-2.4.18-rmk7 linux/

进入linux目录

#patch -p1 < patch-2.4.18-rmk7

得到

……

patching file net/irda/iriap.c

patching file net/irda/irlan/irlan_common.c

patching file net/irda/irlap_event.c

patching file net/irda/irlap_frame.c

patching file net/irda/irttp.c

patching file net/sched/Config.in

成功应用补丁。

2、把解压的补丁(不用解压)移动到解压的内核目录中,执行# bzip2 -dc patch-2.4.18-rmk5.bz2| patch -p1

其中patch -p1 ../patch-2.6.26.8补丁命令的"-p"参数说明如下:

"-p 0":表示使用完整路径名。

"-p 1":表示去除路径前面的斜杠。

"-p 4":表示去除路径前面的斜杠和前面的三个目录。

##############################################################################################

8.4.5内核补丁编译步骤

Linux内核工作一段时间后,某些模块出现新的版本或者需要支持更高级的功能时,便需要给内核打上相应的补丁。

以下示例演示了为linux-2.6.26内核打补丁的过程,补丁打完后内核的版本为linux-2.6.26.8,具体步骤如下所示:

(1) 检查当前内核源码的版本号。

[root@rhel5~]#cd/usr/src/ [root@rhel5src]#ls-F kernels/linux-2.6.26redhat/ [root@rhel5src]#cdlinux-2.6.26

//进入linux-2.6.26内核目录 [root@rhel5linux-2.6.26]#makekernelversion

//查看内核版本号 2.6.26 [root@rhel5linux-2.6.26]#head-5Makefile

//查看Makefile文件,了解内 核版本号 VERSION=2PATCHLEVEL=6SUBLEVEL=26EXTRAVERSION=NAME=RotaryWombat

(2) 若用户没有安装linux-2.6.26内核,则可以采用以下步骤对其下载并解压。如果已经安装了linux-2.6.26内核版本,可跳过此步骤。

[root@rhel5~]#wget-c/pub/linux/kernel/v2.6/linux

-2.6.26.tar.bz2.//到官网下载内核 --18:59:19--/pub/linux/kernel/v2.6/linux-2.6.26.tar.bz2 ...199.6.1.164,204.152.191.37,130.239.17.4,... |199.6.1.164|:80...connected. HTTPrequestsent,awaitingresponse...200OK Length:49441874(47M)[application/x-bzip2] --18:59:20--(try:2)/pub/linux/kernel/v2.6/linux-2.6.26.tar.bz2 :80. HTTPrequestsent,awaitingresponse...200OK Length:49441874(47M)[application/x-bzip2] Savingto:'linux-2.6.26.tar.bz2' 100%[=======================================>]

49,441,874126K/sin4m28s 19:03:49(180KB/s)-`linux-2.6.26.tar.bz2'saved

[49441874/49441874] --19:03:49--http://./ Resolving....failed:Nameorservicenotknown. FINISHED--19:03:49-- Downloaded:1files,47Min4m28s(180KB/s)[root@rhel5~]#tar-jxflinux-2.6.26.tar.bz2-C/usr/src/

//解包解压缩内核

(3) 下载补丁,将linux-2.6.26内核升级到linux-2.6.26.8版本。

[root@rhel5src]#wget-c/pub/linux/kernel/v2.6/patch-2.6.26.8.gz.

//到官网下载补丁。 --18:53:09--/pub/linux/kernel/v2.6/patch-2.6.26.8.gz ...199.6.1.164,204.152.

191.37,130.239.17.4,... |199.6.1.164|:80...connected. HTTPrequestsent,awaitingresponse...200OK Length:134442(131K)[application/x-gzip] --18:53:14--(try:2)/pub/linux/kernel/v2.6/patch-2.6.26.8.gz :80. HTTPrequestsent,awaitingresponse...200OK Length:134442(131K)[application/x-gzip] Savingto:`patch-2.6.26.8.gz' 100%[=======================================>]

134,44243.7K/sin3.0s 18:53:17(43.7KB/s)-'patch-2.6.26.8.gz'saved[134442/134442] --18:53:17--http://./ Resolving....failed:Nameorservicenotknown. FINISHED--18:53:17-- Downloaded:1files,131Kin3.0s(43.7KB/s)

(4) 解压缩补丁。

[root@rhel5src]#ls-F kernels/linux-2.6.26/patch-2.6.26.8.gzredhat/ [root@rhel5src]#gzip-dvpatch-2.6.26.8.gz patch-2.6.26.8.gz:71.8%--replacedwithpatch-2.6.26.8 [root@rhel5src]#ls-F kernels/linux-2.6.26/patch-2.6.26.8redhat/

(5) 安装补丁。

[root@rhel5src]#cdlinux-2.6.26///进入linux-2.6.26内核源码目录 [root@rhel5linux-2.6.26]#ls//显示linux-2.6.26内核源码目录内容 COPYINGMAINTAINERSarchfskernelsamplesusr CREDITSMakefileblockincludelibscriptsvirt DocumentationREADMEcryptoinitmmsecurity KbuildREPORTING-BUGSdriversipcnetsound [root@rhel5linux-2.6.26]#patch-p1<../patch-2.6.26.8//安装2.6.26.8内 核补丁 ......中间已省略。 patchingfilesound/core/pcm.c patchingfilesound/core/pcm_native.c patchingfilesound/core/rawmidi.c patchingfilesound/core/seq/oss/seq_oss_synth.c patchingfilesound/pci/emu10k1/emu10k1_main.c patchingfilesound/pci/emu10k1/emumixer.c patchingfilesound/pci/hda/hda_intel.c patchingfilesound/pci/hda/patch_analog.c patchingfilesound/pci/hda/patch_sigmatel.c patchingfilesound/pci/oxygen/hifier.c patchingfilesound/pci/oxygen/oxygen.c patchingfilesound/pci/oxygen/oxygen_mixer.c patchingfilesound/pci/trident/trident_main.c patchingfilesound/ppc/awacs.c patchingfilesound/soc/fsl/fsl_dma.c patchingfilesound/soc/fsl/fsl_ssi.c patchingfilevirt/kvm/kvm_main.c

其中patch -p1 ../patch-2.6.26.8补丁命令的"-p"参数说明如下:

"-p 0":表示使用完整路径名。

"-p 1":表示去除路径前面的斜杠。

"-p 4":表示去除路径前面的斜杠和前面的三个目录。

(5) 查看当前内核源码的版本。

[root@rhel5linux-2.6.26]#head-5Makefile VERSION=2PATCHLEVEL=6SUBLEVEL=26EXTRAVERSION=.8 NAME=RotaryWombat [root@rhel5linux-2.6.26]#makekernelversion 2.6.26.8

至此,内核补丁已打好,接下来就是使用make menuconfig之类的命令来配置内核、编译内核、编译模块、安装模块和安装内核。

patch 制作: diff -urN src dst > patch 生成patch patch -p[0-n] -s < patch使用patch,-s参数即silent,表示终端无信息输出

1.为单个文件生成补丁

$ diff-up linux-2.6.28.8/net/sunrpc/svc.orig.c linux-2.6.28.8/net/sunrpc/svc.c 这条命令会产生类似如下的输出, 你将它重定向到一个文件中, 这个文件就是patch.diff-up linux-2.6.28.8/net/sunrpc/svc.orig.c-03-1708:50:04.000000000+0800

+++linux-2.6.28.8/net/sunrpc/svc.c-03-3019:18:41.859375000+0800

@@-1050,11+1050,11@@ svc_process(structsvc_rqst*rqstp) 参数详解: -u 显示有差异行的前后几行(上下文), 默认是前后各3行, 这样, patch中带有更多的信息. -p 显示代码所在的c函数的信息.

2.为多个文件生成补丁

$ diff-uprN linux-2.6.28.8.orig/net/sunrpc/linux-2.6.28.8/net/sunrpc/ 这条命令对比了linux-2.6.28.8.orig/net/sunrpc/和linux-2.6.28.8/net/sunrpc/两个目录下的所有源码差异. 参数详解: -r 递归地对比一个目录和它的所有子目录(即整个目录树). -N 如果某个文件缺少了, 就当作是空文件来对比. 如果不使用本选项, 当diff发现旧代码或者新代码缺少文件时, 只简单的提示缺少文件. 如果使用本选项, 会将新添加的文件全新打印出来作为新增的部分.

3.打补丁

生成的补丁中, 路径信息包含了你的Linux源码根目录的名称, 但其他人的源码根目录可能是其它名字, 所以, 打补丁时, 要进入你的Linux源码根目录, 并且告诉patch工具, 请忽略补丁中的路径的第一级目录(参数-p1).$ patch-p1<patch1.diff diff命令必须在整个Linux源码的根目录的上一级目录中执行.

4. 示例

给修改过的内核生成patch,然后用生成的patch给未修改过的内核打补丁 其中,目录linux-2.6.31.3为未修改过的内核,目录linux-2.6.31.3_1为修改过的内核 $ diff-uparN linux-2.6.31.3linux-2.6.31.3_1/>mypatch

$ cd linux-2.6.31.3

$ patch-p1<mypatch

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。