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。