內核和lustre補丁

Applying Lustre Kernel Patches to a Tree

1、使用git下載最新的lustre源代碼
   cd /usr/src/kernels/
   git clone git://git.lustre.org/prime/lustre.git
2、lustre的補丁相關信息主要存放在源代碼中的lustre/kernel_patches/
   cd ./lustre/kernel_patches/
   在該目錄下:
   targets目錄:        存放了已經test過的lustre能夠打補丁的內核版本信息(主板本、發佈版本、series信息、架構等)
   series目錄 :        存放了針對內核版本的所有相關的patches名字,按打補丁的順序排列,根據targets目錄下相應內核版本信息文件中的SERIES記錄查找
   patches目錄:        存放了所有的補丁文件,每個補丁文件只修改一個功能。命名方式:<patchname><kernel-version>.patch,例如lockdep_chains-2.6.18-vanilla.patch
                        或者jbd-stats-2.6-rhel5.patch,vanilla表示kernel.org上的原版內核
   kernel_configs目錄: 存放了相應內核版本、架構相關的config文件,用於覆蓋相應內核源代碼頂級目錄下的.config文件。
3、選擇好平臺、內核版本後,先選擇一個targets目錄下文件,然後決定相應的series文件
4、從http://downloads.lustre.org/public/kernels/下載lustre支持的內核版本源代碼
   cd /usr/src/kernels/  下載到該目錄下
5、解壓縮
   tar -jxvf linux-2.6.18-194.17.1.el5.tar.bz2
6、從上文的kernel_configs目錄下選擇相應的config文件,並覆蓋linux內核源碼頂層目錄下的.config文件
   cp /usr/src/kernels/lustre/lustre/kernel_patches/kernel_configs/kernel-2.6.18-2.6-rhel5-x86_64-smp.config /usr/src/kernels/linux-2.6.18-194.17.1/.config
7、在linux頂層源碼目錄下建立patches連接,並打補丁
   cd /usr/src/kernels/linux-2.6.18-194.17.1/
   ln -s  /usr/src/kernels/lustre/lustre/kernel_patches/series/2.6-rhel5.series  series
   ln -s  /usr/src/kernels/lustre/lustre/kernel_patches/patches patches
   quilt  push -va
8、編譯linux內核及相關模塊
   cd /usr/src/kernels/linux-2.6.18-194.17.1/
   make oldconfig
   make bzImage
   make modules

9、編譯lustre

   cd /usr/src/kernels/lustre/

    ./configure --with-linux=/usr/src/kernels/lustre/linux-2.6.18-194.17.1

    make




1、修改patch文件
   使用的命名格式::<patchname><kernel-version>.patch,例如lockdep_chains-2.6.18-vanilla.patch或者jbd-stats-2.6-rhel5.patch,vanilla表示kernel.org上的原版內核
   
   更新patches時要注意:
   把新版本patches與舊版本patches儘可能的相似,這樣git diff可以清晰的給出對patch的改變
   維護每個patch的不同版本儘可能相近,例如jbd2-jcberr-2.6-rhel5.patch和jbd2-jcberr-2.6-sles11.patch,有相近的內容修改
2、維護series文件
   一般情況下一個series針對一個內核,如果有可能的話,patches應該適應多個內核,以減少patches數目
3、修改內核patch的bug,以sd_iostats-2.6-rhel5.patch爲例子
   (1)、檢查相應內核版本、架構對應的targets目錄下文件,並找到對應的series文件,從中找到有問題的patch,以sd_iostats-2.6-rhel5.patch爲例

   (2)、quilt pop blkdev_tunables-2.6-rhel5.patch,該命令會將blkdev_tunables-2.6-rhel5.patch放在棧頂,而將series文件中該blkdev_tunables-2.6-rhel5.patch之後的patch

            全部改成unapplied狀態,並恢復對應源代碼

   (3)、修改bug,在這裏調用quilt edit drivers/scsi/lpfc/lpfc.h,添加#define TEST_TEST_TEST 0x01

   (4)、使用quilt diff可以查看差別

   (5)、執行quilt refresh來更新lustre中的源patch,-o用於建立一個新的session
   (6)、執行quilt gendiff > developers-fix.diff
   (7)、執行quilt push -a
   (8)、測試代碼
   (9)、經acceptance-small test suite測試後,可以提交patch






更新內核
新版內核是2.6.25,patches是針對2.6.24的
(1)、開始打patches,直topmost的patch失敗,例如foo-2.6.20.patch
(2)、如果該foo-2.6.20.patch被用在其他series,則調用quilt fork foo-2.6.25-rhel.patch來逐字拷貝foo-2.6.20.patch,並使用
     新名字quilt fork foo-2.6.25-rhel.patch來命名
(3)、使用quilt push -f強制打補丁
(4)、quilt edit解決衝突的地方
(5)、調用quilt refresh更新該patch
(6)、使用新patch名來驗證series文件已被更新
     來back out強制打的patch,調用quilt pop -R -f


在內核中添加新文件
(1)、確定top patch是你想要的patch,使用quilt push {patch_name} or quilt pop {patch_name}
(2)、edit新文件
(3)、把該文件加入你的patches,調用quilt add [-p {patch_name}] {file_name},如果top patch是你想把新文件加入的patch,那麼
     可以省略-p {patch_name}


在已有源文件中修改
(1)、確認top patch是你想要的patch,通過quilt push {patch_name}或quilt pop {patch_name}
(2)、調用quilt add {該源文件名},來將該源文件加到top patch
(3)、修改源文件
(4)、調用quilt refresh來刷新patch


把一個patch加入series
(1)、理想的情況是,調用quilt add來將patch加入series文件結尾,以防止級聯補丁修改
(2)、import該patch後,使用quilt push和quilt refresh來應用和刷新補丁
(3)、驗證下series文件已被更新
(4)、使用git add把patch加入repository
如果你想加入一個新的patch,則使用quilt new,然後修改patch,並使用quilt refresh。


注:
 一直以爲make oldconfig的作用是將利用當前的.config覆蓋defconfig,從而使下次運行make config/menuconfig時的缺省設置成爲當前.config的設置,今天發現是個錯誤,需要澄清:


1. 如果.config不存在,運行make config/menuconfig時的缺省設置由固化在各個Kconfig文件中各項目的缺省值決定。
2. 如果.config存在,運行make config/menuconfig時的缺省設置即是當前.config的設置,若對設置進行了修改,.config將被更新。
3. arch/arm/defconfig是一個缺省的配置文件,make defconfig時會根據這個文件生成當前的.config。
4. arch/arm/configs文件夾中有許多命名爲xxx_defconfig的配置文件,如果運行make xxx_defconfig,當前.config文件會由xxx_defconfig文件生成。
5. make oldconfig的作用是備份當前.config文件爲.config.old,如若make config/menuconfig設置不當可用於恢復先前的.config。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章