一、前言我们在配置完Openwrt后,首次编译时会在编译过程中下载各种源码包,而且解压这些源码包并打上patch。 需要对源码进行修改时,可直接修改源码并重新编译,但clean后再次编译时会再次解压源码包,以至所做 的修改全部丢失。本文参考Openwrt官网提供的patch管理方法,实践操作并记录Linux kernel及package源 码修改并生成patch的方法。
二、环境及准备工作
2.1 开发环境
Linux发行版:ubuntu12.0LTS OpenWrt版本:trunk r37950(linux kernel 3.10.10) 硬件:ap121兼容模块(ar9331) 2.2 准备工作patch的管理工具使用quilt,在ubuntu下使用apt-get intallquilt安装quilt工具。 为了让quilt创建适合OpenWrt格式的patch,需要在本地home目录下创建quilt的配置文件.quiltrc,该配 置文件包含diff和patch的选项。使用如下命令可创建quilt的配置文件:
cat> ~/.quiltrc <<EOF QUILT_DIFF_ARGS="--no-timestamps--no-index -pab --color=auto" QUILT_REFRESH_ARGS="--no-timestamps--no-index -pab" QUILT_PATCH_OPTS="--unified" QUILT_DIFF_OPTS="-p" EDITOR="vim" EOF EDITOR指定编辑时所用的编辑器,该处使用vim。
三、package的patch方法
3.1 修改内容package的patch生成方法以修改tftp-hpa为例进行介绍,修改内容为在tftp的main函数中加入一条打印 信息。(进行该操作之前,需要在make menuconfig时选择tftp-hpa包) 3.2 pactch生成步骤1. 准备tftp-hpa源码 make package/feeds/packages/tftp-hpa/{clean,prepare} V=s QUILT=1
此命令会解压tftp-hpa的源码包并准备patch文件(如果有),通过打印信息可获取解压到的目录路径。
2.进入tftp-hpa源码目录 cd build_dir/ /target-mips_r2_uClibc-0.9.33.2/tftp-hpa-0.48
3.安装所有已有patch quilt push -a
4.创建新patch quilt new 001-main_test.patch
patch文件名以数字开头,“-”后为patch的描述信息
开头的数字必须比已有patch的数字都大,使用命令quilt series查看已有patch的列表
5.修改源码文件 quilt edit tftp/main.c
该命令将使用在.quiltrc中定义的编辑器打开main.c文件,在main函数中增加一条打印信息。
如果还有其他文件需要修改,可继续用此命令进行修改
6.查看修改内容 quilt diff
7.更新修改到patch文件
quilt refresh
此命令会将更新的修改保存到当前目录的patches/001-main_test.patch(如果没有 patches目录会自动创建)。
8.返回到buildroot目录 cd ../../../
9.保存patch文件到buildroot makepackage/feeds/packages/tftp-hpa/update V=s
10. 重新编译tftp-hpa包以测试修改 make package/feeds/packages/tftp-hpa/{clean,compile} package/index V=s
11.如果有问题,需要编辑patch文件 3.3 编辑已有patch文件当需要对patch进行修改时,可使用以下步骤: 1.准备tftp-hpa源码 make package/feeds/packages/tftp-hpa/{clean,prepare} V=s QUILT=1
2. 进入tftp-hpa源码目录 cd build_dir/ /target-mips_r2_uClibc-0.9.33.2/tftp-hpa-0.48
3.列出可用的patch quilt series
4.准备要修改的patch quilt push 001-main_test.patch
此命令会按patch编号顺序打补丁,直到指定的patch(包含)
如果当前应用的patch编号已经超过了指定的patch编号,将会按相反顺序移除 patch直到指定的patch
5.编辑源码文件 quilt edit tftp/main.c
6.检查patch中包含的所修改的文件 quilt files
7.查看修改内容 quilt diff
8.保存修改到patch
quilt refresh
9.返回buildroot目录 cd ../../../
10.保存patch文件到buildroot make package/feeds/packages/tftp-hpa/update V=s
11.重新编译tftp-hpa包以测试修改 make package/feeds/packages/tftp-hpa/{clean,compile} package/index V=s
四、linux内核patch方法
4.1 修改内容使用的模块为基于ar9331的ap121兼容板,根据该模块的硬件需要在ap121的基础上 做两处修改:
1.硬件复位的GPIO变更(arch/mips/ath79/mach-ap121.c) 2.增加新flash s25fl164k1的支持(driver/mtd/devices/m25p80.c) 内核的patch分两种,一种是基于platform的,另一种是generic的,修改1属于platform,修改2属于generic。
4.2 platform patch生成步骤platform形式的patch生成步骤如下(源码修改mach-ap121.c): 1.准备内核源码树,使用如下命令 make target/linux/{clean,prepare} V=s QUILT=1
2.进入kernel源码树目录 对attitudeadjustment版本,kernel源码树所在目录为build_dir/linux-*/linux-3.*
对本文使用的trunk版本,使用如下命令进入kernel源码树
cd build_dir/target-mips_r2_uClibc-0.9.33.2/linux-ar71xx_generic/linux-3.10.10
3.安装所有已有patch quilt push -a
4.创建新patch quilt new platform/910-MIPS-ath79-ap121-reset-gpio-change.patch
patch文件名以数字开头,“-”后为patch的描述信息
开头的数字必须比已有patch的数字都大,使用命令quilt series查看已有patch的列表
新建platform的patch时需要在patch名前添加“platform/”前缀
5.修改源码文件 quilt edit arch/mips/ath79/mach-ap121.c
该命令将使用在.quiltrc中定义的编辑器打开mach-ap121.c文件,修改对复位GPIO的定义。
如果还有其他文件需要修改,可继续用此命令进行修改
6.查看修改内容 quilt diff
7.更新修改到patch文件
quilt refresh
此命令会将更新的修改保存到当前目录的patches/platform/910-MIPS-ath79-ap121-reset-gpio-change.patch
8.返回到buildroot目录 cd ../../../../
9.保存patch文件到buildroot make target/linux/update V=s
此命令会将910-MIPS-ath79-ap121-reset-gpio-change.patch保存到target/linux/ar71xx/patches-3.10/ 4.3 generic patch生成步骤generic形式的patch生成步骤如下(源码修改m25p80.c): 1.准备内核源码树,使用如下命令 make target/linux/{clean,prepare} V=s QUILT=1
2.进入kernel源码树目录 对attitude adjustment版本,kernel源码树所在目录为build_dir/linux-*/linux-3.*
对本文使用的trunk版本,使用如下命令进入kernel源码树
cd build_dir/target-mips_r2_uClibc-0.9.33.2/linux-ar71xx_generic/linux-3.10.10
3.安装所有已有patch quilt push -a
4.创建新patch quilt new 998-mtd-m25p80-add-support-for-spansion-s25fl164k1-flash.patch
patch文件名以数字开头,“-”后为patch的描述信息
开头的数字必须比已有patch的数字都大,使用命令quilt series查看已有patch的列表
新建generic的patch时需要在patch名前添加“generic/”前缀
5.修改源码文件 quilt edit driver/mtd/devices/m25p80.c
该命令将使用在.quiltrc中定义的编辑器打开m25p80.c文件,增加对s25fl164k1的声明。
如果还有其他文件需要修改,可继续用此命令进行修改
6.查看修改内容 quilt diff
7.更新修改到patch文件
quilt refresh
此命令会将更新的修改保存到当前目录的patches/generic/998-mtd-m25p80-add-support-for-spansion-s25fl164k1-flash.patch。
8.返回到buildroot目录 cd ../../../../
9.保存patch文件到buildroot make target/linux/update V=s
此命令会将998-mtd-m25p80-add-support-for-spansion-s25fl164k1-flash.patch保存到target/linux/generic/patches-3.10/
五、更新patches当已打补丁的package(或者kernel)更新到新版本时,patch现有补丁时可能不会顺利,出现一些不确定性。 可以通过make的refresh target重建整个patch。 对package,使用类似如下的命令: make package/feeds/packages/tftp-hpa/refresh V=s
对kernel,使用如下命令: make target/linux/refresh V=s
六、迭代修改patch进行新的修改时,可能会对patch进行多次修改。为了加快开发速度,可以在保持源码树的情况下进行修改操作。 1.准备源码树 2.进入源码目录 3. 应用所要打的patch 4.编辑源码文件,更新patch 5.应用所有patch(quilt push -a) 6.返回buildroot目录,运行命令make package/feeds/packages/tftp-hpa/{compile,install}或make target/linux/{compile,install}(对kernel) 7.测试固件 8.如果需要进一步修改,返回第二步 9,使用命令make package/feeds/packages/tftp-hpa/update或make target/linux/update(对kernel)将patches拷贝到buildroot |