当前位置: 代码迷 >> 综合 >> linux kernel patch 使用说明
  详细解决方案

linux kernel patch 使用说明

热度:92   发布时间:2023-12-09 22:23:31.0

内核补丁不是一定需要的,这要看你选择的是怎样的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) 检查当前内核源码的版本号。

  1. [root@rhel5 ~]# cd /usr/src/  
  2. [root@rhel5 src]# ls -F  
  3. kernels/  linux-2.6.26  redhat/  
  4. [root@rhel5 src]#cd linux-2.6.26                
    //进入linux-2.6.26内核目录  
  5.  [root@rhel5 linux-2.6.26]# make kernelversion    
    //查看内核版本号  
  6. 2.6.26  
  7. [root@rhel5 linux-2.6.26]# head -5 Makefile    
    //查看Makefile文件,了解内  
  8. 核版本号  
  9. VERSION = 2 
  10. PATCHLEVEL = 6 
  11. SUBLEVEL = 26 
  12. EXTRAVERSION =   
  13. NAME = Rotary Wombat 

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

  1. [root@rhel5 ~]# wget -c   
  2. http://www.kernel.org/pub/linux/kernel/v2.6/linux
    -2.6.26.tar.bz2 .      //到官网下载内核  
  3. --18:59:19--    
  4. http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.26.tar.bz2  
  5. Resolving www.kernel.org... 199.6.1.164, 204.152.191.37, 130.239.17.4, ...  
  6. Connecting to www.kernel.org|199.6.1.164|:80... connected.  
  7. HTTP request sent, awaiting response... 200 OK  
  8. Length: 49441874 (47M) [application/x-bzip2]  
  9. --18:59:20--  (try: 2)    
  10. http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.26.tar.bz2  
  11. Reusing existing connection to www.kernel.org:80.  
  12. HTTP request sent, awaiting response... 200 OK  
  13. Length: 49441874 (47M) [application/x-bzip2]  
  14. Saving to: 'linux-2.6.26.tar.bz2'  
  15.  
  16. 100%[=======================================>
    49,441,874 126K/s in 4m 28s  
  17.  
  18. 19:03:49 (180 KB/s) - `linux-2.6.26.tar.bz2' saved 
    [49441874/49441874]  
  19.  
  20. --19:03:49--  http://./  
  21. Resolving .... failed: Name or service not known.  
  22. FINISHED --19:03:49--  
  23. Downloaded: 1 files, 47M in 4m 28s (180 KB/s)   
  24.  
  25. [root@rhel5 ~]# tar -jxf linux-2.6.26.tar.bz2 -C /usr/src/            
  26.                                                 
    //解包解压缩内核 

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

  1. [root@rhel5 src]# wget -c   
  2. http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.26.8.gz .   
  3.                                                        
    //到官网下载补丁。  
  4. --18:53:09--    
  5. http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.26.8.gz  
  6. Resolving www.kernel.org... 199.6.1.164, 204.152.
    191.37, 130.239.17.4, ...  
  7. Connecting to www.kernel.org|199.6.1.164|:80... connected.  
  8. HTTP request sent, awaiting response... 200 OK  
  9. Length: 134442 (131K) [application/x-gzip]  
  10. --18:53:14--  (try: 2)    
  11. http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.26.8.gz  
  12. Reusing existing connection to www.kernel.org:80.  
  13. HTTP request sent, awaiting response... 200 OK  
  14. Length: 134442 (131K) [application/x-gzip]  
  15. Saving to: `patch-2.6.26.8.gz'  
  16.  
  17. 100%[=======================================>
    134,442   43.7K/s  in 3.0s  
  18.  
  19. 18:53:17 (43.7 KB/s) - 'patch-2.6.26.8.gz' saved [134442/134442]  
  20.  
  21. --18:53:17--  http://./  
  22. Resolving .... failed: Name or service not known.  
  23. FINISHED --18:53:17--  
  24. Downloaded: 1 files, 131K in 3.0s (43.7 KB/s) 

(4) 解压缩补丁。

  1. [root@rhel5 src]# ls -F  
  2. kernels/  linux-2.6.26/  patch-2.6.26.8.gz  redhat/  
  3. [root@rhel5 src]# gzip -dv patch-2.6.26.8.gz  
  4. patch-2.6.26.8.gz:       71.8% -- replaced with patch-2.6.26.8  
  5. [root@rhel5 src]# ls -F  
  6. kernels/  linux-2.6.26/  patch-2.6.26.8  redhat/ 

(5) 安装补丁。

  1. [root@rhel5 src]# cd linux-2.6.26/      //进入linux-2.6.26内核源码目录  
  2. [root@rhel5 linux-2.6.26]# ls           //显示linux-2.6.26内核源码目录内容  
  3. COPYING        MAINTAINERS     arch     fs       kernel  samples   usr  
  4. CREDITS        Makefile        block    include  lib     scripts   virt  
  5. Documentation  README          crypto   init     mm      security  
  6. Kbuild         REPORTING-BUGS  drivers  ipc      net     sound  
  7.  
  8. [root@rhel5 linux-2.6.26]# patch -p1 <../patch-2.6.26.8 //安装2.6.26.8内  
  9. 核补丁  
  10. ......中间已省略。  
  11. patching file sound/core/pcm.c  
  12. patching file sound/core/pcm_native.c  
  13. patching file sound/core/rawmidi.c  
  14. patching file sound/core/seq/oss/seq_oss_synth.c  
  15. patching file sound/pci/emu10k1/emu10k1_main.c  
  16. patching file sound/pci/emu10k1/emumixer.c  
  17. patching file sound/pci/hda/hda_intel.c  
  18. patching file sound/pci/hda/patch_analog.c  
  19. patching file sound/pci/hda/patch_sigmatel.c  
  20. patching file sound/pci/oxygen/hifier.c  
  21. patching file sound/pci/oxygen/oxygen.c  
  22. patching file sound/pci/oxygen/oxygen_mixer.c  
  23. patching file sound/pci/trident/trident_main.c  
  24. patching file sound/ppc/awacs.c  
  25. patching file sound/soc/fsl/fsl_dma.c  
  26. patching file sound/soc/fsl/fsl_ssi.c  
  27. patching file virt/kvm/kvm_main.c 

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

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

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

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

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

  1. [root@rhel5 linux-2.6.26]# head -5 Makefile  
  2. VERSION = 2 
  3. PATCHLEVEL = 6 
  4. SUBLEVEL = 26 
  5. EXTRAVERSION = .8  
  6. NAME = Rotary Wombat  
  7.  
  8. [root@rhel5 linux-2.6.26]# make kernelversion  
  9. 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  2009 - 03 - 17  08 : 50 : 04.000000000  + 0800
+ + + linux - 2. 6. 28. 8 /net /sunrpc /svc.c  2009 - 03 - 30  19 : 18 : 41. 859375000  + 0800
@@  - 1050, 11  + 1050, 11 @@ svc_process( struct svc_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. 3 linux - 2. 6. 31. 3_1 /  > mypatch
$ cd linux - 2. 6. 31. 3
$ patch  -p1  < mypatch