Build CephFS Kernel Module with Latest Codes
使用CephFS的時候,若需要獲取較高的效能,kernel client是一定會使用到的,但它的每次更新都需要升級Linux核心,這樣影響比較大,很多時候是不能接受的。
其實我們可以通過拉取Linux對應版本的原始碼,把最新的CephFS kernel程式碼merge進當前系統對應版本的原始碼上,然後進行編譯,成功後替換CephFS模組。
這種方法要求兩個Linux Kernel Version相差不要太大,不然程式碼的merge會很痛苦的,也很容易出錯!
編譯安裝CephFS模組
下載核心原始碼
比如當前Linux的最新穩定版本為:4.19.1,我們使用CephFS kernel client的核心版本為:4.18.5。
則通過wget下載4.18.5和4.19.1核心程式碼:
# wget https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.18.5.tar.xz # wget https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.19.1.tar.xz
解壓縮
root@ceph1:~# tar -xvf linux-4.18.5.tar.xz root@ceph1:~# tar -xvf linux-4.19.1.tar.xz
編譯
根據當前機器的版本資訊,修改原始碼的Makefile檔案,並執行編譯:
root@ceph1:~# uname -a Linux ceph1 4.18.5-041805-generic #201808241320 SMP Fri Aug 24 13:22:12 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux root@ceph1:~# cd linux-4.18.5 root@ceph1:~/linux-4.18.5# vim Makefile ... VERSION = 4 PATCHLEVEL = 18 SUBLEVEL = 5 EXTRAVERSION = -041805-generic root@ceph1:~/linux-4.18.5# make menuconfig root@ceph1:~/linux-4.18.5# make
上述命令或花費數個小時,請通過screen來執行。
注:根據make的輸出安裝依賴的packages
以後修改Ceph模組程式碼後,對於Ceph模組的編譯,只需要執行如下命令:
root@ceph1:~/linux-4.18.5# make m=fs/ceph
安裝
編譯後Ceph相關的模組主要有如下幾個,通過insmod安裝即可:
root@ceph1:~/linux-4.18.5# insmod net/ceph/libceph.ko root@ceph1:~/linux-4.18.5# insmod drivers/block/rbd.ko root@ceph1:~/linux-4.18.5# insmod fs/fscache/fscache.ko root@ceph1:~/linux-4.18.5# insmod fs/ceph/ceph.ko root@ceph1:~/linux-4.18.5# lsmod | grep ceph ceph3809280 fscache3645441 ceph libceph3153922 ceph,rbd libcrc32c163845 nf_conntrack,nf_nat,btrfs,raid456,libceph
注:若機器本來已經安裝了ceph模組,依據上述安裝module的逆序解除安裝即可(rmmod命令)
程式碼合併
Linux原始碼中,與ceph相關的程式碼有以下幾個位置:
fs/ceph/ net/ceph/ drivers/block/rbd* include/linux/ceph/
若要使用較新核心版本里的Ceph程式碼在4.18.5核心上編譯模組,需要把對應上面的所有Ceph程式碼copy替換掉,然後依據上面的編譯步驟開始編譯;
可以在如下的連結裡檢視核心4.19.1和4.18.5的程式碼修改:
ofollow,noindex">v4.19.1 diff with v4.18.5
可以看出裡面ceph相關程式碼有很大的變動!
注意事項:
-
因為不同核心版本里的函式名稱、介面和程式碼都可能變化,要依據編譯出錯和提示修改替換後的程式碼,使之能夠在4.18.5核心上編譯通過
-
編譯成功後,使用新的ceph module替換4.18.5裡的ceph module即可,要在測試機器上先測試一下,因為很可能會有kernel panic