Ceph版本:14.2.22
Linux版本:ubuntu-server 18.04
?
?
第一部分 下載Ceph源碼
1.1 配置Ceph源碼鏡像源
Ceph源碼是托管在Github上,由于某些原因,國內(nèi)訪問Github網(wǎng)站很慢,所以需要從其他途徑加速獲取源碼。Github官方給出了幾個Github的鏡像網(wǎng)站:
- https://github.com.cnpmjs.org/
- https://hub.fastgit.org/
本地需要修改~/.gitconfig文件,才可以從上面鏡像網(wǎng)站獲取源碼,相關(guān)配置如下:
#Github鏡像源
[url "https://hub.fastgit.org/"]
insteadOf = https://github.com/
注:國內(nèi)也有Ceph源碼的鏡像,比如Gitee、Gitcode,但不建議從這些網(wǎng)站上獲取。因為Ceph源碼中使用了大量的第三方源碼作為自己的子模塊,而Gitee、Gitcode不一定將這些子模塊全部同步過來。相反,上面的兩個鏡像網(wǎng)站和Github完全是同步的,所以可以放心使用。
1.2 克隆ceph源碼
Ceph源碼很大,可根據(jù)需要,選擇性下載哪個版本或哪個分支。本案例拉取v14.2.22版本的源碼。版本和分支的區(qū)別:版本的代碼不會隨時間改變,被定格在打標(biāo)簽的那一刻;分支的代碼會隨時間不斷開發(fā)改變。
# 根據(jù)自己需要更換 v14.2.22 為自己需要的版本
git clone -b v14.2.22 --depth=1 https://github.com/ceph/ceph.git
1.3 同步子模塊源碼
Ceph源碼中使用大量的子模塊,在 ceph/.gitmodules 文件中羅列出所有的子模塊。在后面執(zhí)行do_cmake.sh 腳本生成 build 目錄時,do_cmake.sh 首先同步子模塊源碼到指定目錄。根據(jù)經(jīng)驗,在同步子模塊源碼時很容易出現(xiàn)同步不全,或同步失敗,這直接會導(dǎo)致構(gòu)建 build 目錄失敗。為了防止此狀況發(fā)生,建議提前手動去同步子模塊源碼。
git submodule update --init --recursive
注:如果發(fā)現(xiàn)同步子模塊源碼失敗,重復(fù)執(zhí)行上面命令即可。如果中斷同步子模塊源碼,此時必須要到相應(yīng)目錄下刪除該子模塊所有文件,尤其是 .git 文件。如果不刪除 .git,重復(fù)執(zhí)行上面命令時,則會直接跳過同步該子模塊,導(dǎo)致子模塊源碼缺失。這個問題無法被檢測到,因為執(zhí)行完上面命令后,依然會顯示同步成功,而不會提示哪個子模塊沒有被同步。
?
?
第二部分 源碼編譯
2.1 安裝依賴
Ceph源碼安裝依賴很簡單,直接執(zhí)行源碼根目錄下install-deps.sh腳本,根據(jù)經(jīng)驗發(fā)現(xiàn),該腳本存在一些問題,需要稍微修改一下。
2.1.1 修改launchpad源
腳本會安裝gcc環(huán)境,安裝包源url只需要保留一個即可,修改install-deps.sh腳本中的函數(shù)ensure_decent_gcc_on_ubuntu
deb [lang=none] http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu $codename main
#deb [arch=amd64 lang=none] http://mirror.cs.uchicago.edu/ubuntu-toolchain-r $codename main
#deb [arch=amd64,i386 lang=none] http://mirror.yandex.ru/mirrors/launchpad/ubuntu-toolchain-r $codename main
2.1.2 屏蔽調(diào)用安裝libboost的部分
腳本會安裝 libboost 庫,編譯源碼過程會再次下載 boost 源碼包,因此腳本中不應(yīng)該再安裝 libboost,屏蔽install-deps.sh以下2個地方
*Bionic*)
#install_boost_on_ubuntu bionic
;;
2.1.3 設(shè)置pypi鏡像源
腳本會安裝pypi庫,默認(rèn)url下載很慢,需要設(shè)置pypi庫鏡像源。創(chuàng)建 ~/.pip/pip.conf 文件,并追加以下內(nèi)容
[global]
index-url = https://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com
2.1.4 安裝其他依賴
編譯源碼過程中會遇到很多函數(shù)用到zstd庫,默認(rèn)情況下ubuntu18.04只安裝了libzstd1,但沒有用,需要安裝 libzstd1-dev
sudo apt install libzstd1-dev
2.1.5 執(zhí)行腳本
./install-deps.sh
2.2 編譯Ceph源碼
2.2.1 開啟debug模式
如果想要調(diào)試Ceph源碼,需要設(shè)置編譯源碼模式為debug模式,默認(rèn)編譯模式為release模式,該模式是不能調(diào)試源碼。向 ceph/CMakeList 文件的 set(VERSION 14.2.22) 后追加以下內(nèi)容
set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -Wall -g")
set(CMAKE_CXX_FLAGS "-O0 -Wall -g")
set(CMAKE_C_FLAGS "-O0 -Wall -g ")
2.2.2 構(gòu)建build目錄
直接執(zhí)行do_cmake腳本,該腳本會進行一系列檢測,包括源碼是不是完整,依賴是不是都安裝了等等。如果出現(xiàn)問題,構(gòu)建出的build目錄是不完整的,最直接的影響是無法生成makefile文件,導(dǎo)致無法編譯。
./do_cmake.sh
2.2.3 下載boost源碼包
在執(zhí)行make編譯的時候,腳本會自動下載 boost_1_72_0.tar.bz2,由于下載地址和網(wǎng)絡(luò)問題,下載很慢,為了節(jié)省時間,提前手動下載,下載地址:https://download.ceph.com/qa/boost_1_72_0.tar.bz2,將下載的好的包放在ceph/build/boost/src即可。
2.2.4 編譯
使用make編譯必須要到ceph/build目錄下執(zhí)行,ceph源碼可以單獨編譯某一個模塊,也可以全部編譯。使用make可以指定多線程編譯,提高編譯速度,但要合理分配線程數(shù),建議使用4線程編譯即可。
#方式1:全部編譯
make all -j4
#方式2:單獨編譯osd某塊
make ceph-osd -j4
#查看所有模塊
make help
注:源碼編譯會生成很多庫文件和二進制文件,分別放在ceph/build/lib和ceph/build/bin目錄下
?
?
第三部分 部署Debug版本的集群
3.1 集群部署
Cpeh源碼提供了一個部署開發(fā)集群的腳本:vstart.sh,該腳本會利用本地IP和不同端口來配置MON、MGR、OSD等。切換到切換到build目錄下,執(zhí)行以下命令,部署一個新的集群
MON=1 OSD=6 MDS=0 MGR=1 RGW=0 ../src/vstart.sh -d -n -x --without-dashboard
參數(shù)解釋:
- MON、 OSD、 MDS、 MGR是配置相應(yīng)的個數(shù)
- -d:debug,開啟debug模式
- -n:new,新建一個集群
- -x:cephx,cephx認(rèn)證
- --without-dashboard,mgr的一個配置,自測發(fā)現(xiàn)如果這個不關(guān)閉,部署會報錯
3.2 查看集群狀態(tài)
切換到build目錄下,執(zhí)行以下命令,查看集群狀態(tài)
./bin/ceph -s
結(jié)果如下
cluster:
id: 88b11a21-7dd1-49d8-bb24-c18821ff09ae
health: HEALTH_OK
services:
mon: 1 daemons, quorum a (age 5m)
mgr: x(active, since 5m)
osd: 6 osds: 6 up (since 4m), 6 in (since 4m)
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 12 GiB used, 594 GiB / 606 GiB avail
pgs:
注:ceph 14.2.22版本的vstart.sh腳本并沒有將ceph可執(zhí)行文件添加到系統(tǒng)環(huán)境變量中,所有的ceph命令都必須在build目錄下執(zhí)行
3.3 部署ceph分級存儲結(jié)構(gòu)
本案例需要調(diào)試ceph分級存儲功能,因此簡單的搭建一個分層存儲結(jié)構(gòu)。為集群分配6個OSD,創(chuàng)建2個pool,cache pool和ec pool,每個pool分配了3個osd。
詳細(xì)部署請參考(文章還在編寫中)
?
?
第四部分 代碼調(diào)試
4.1 查看PG-OSD映射關(guān)系
如果仔細(xì)閱讀源碼,會發(fā)現(xiàn)ceph分級存儲主要是由主OSD進程來負(fù)責(zé)。如果不是主OSD,是無法調(diào)試到代碼中的。所以需要查看分級存儲中緩存池的PG映射關(guān)系。
#切換到build目錄下,執(zhí)行以下命令
./bin/ceph pg ls-by-pool cache_pool
PG OBJECTS DEGRADED MISPLACED UNFOUND BYTES OMAP_BYTES* OMAP_KEYS* LOG STATE SINCE VERSION REPORTED UP ACTING SCRUB_STAMP DEEP_SCRUB_STAMP
5.0 0 0 0 0 0 0 0 18 active+clean 22h 323'18 323:76 [2,4,0]p2 [2,4,0]p2 2021-09-25 16:55:28.572062 2021-09-24 11:30:14.717641
從結(jié)果可以看到PG5.0對應(yīng)的主OSD為OSD 2
4.2 查看主OSD進程
執(zhí)行以下命令
ps -ef | grep ceph
結(jié)果如下
admins 10961 19680 0 15:12 pts/0 00:00:00 grep --color=auto ceph
admins 18474 1 1 Sep24 ? 01:02:09 /home/admins/code/ceph/build/bin/ceph-mon -i a -c /home/admins/code/ceph/build/ceph.conf
admins 18582 1 1 Sep24 ? 00:33:41 /home/admins/code/ceph/build/bin/ceph-mgr -i x -c /home/admins/code/ceph/build/ceph.conf
admins 18806 1 1 Sep24 ? 00:41:15 /home/admins/code/ceph/build/bin/ceph-osd -i 1 -c /home/admins/code/ceph/build/ceph.conf
admins 19096 1 1 Sep24 ? 00:41:06 /home/admins/code/ceph/build/bin/ceph-osd -i 3 -c /home/admins/code/ceph/build/ceph.conf
admins 19242 1 1 Sep24 ? 00:40:37 /home/admins/code/ceph/build/bin/ceph-osd -i 4 -c /home/admins/code/ceph/build/ceph.conf
admins 19415 1 1 Sep24 ? 00:41:00 /home/admins/code/ceph/build/bin/ceph-osd -i 5 -c /home/admins/code/ceph/build/ceph.conf
admins 20385 1 1 Sep24 ? 00:39:47 /home/admins/code/ceph/build/bin/ceph-osd -i 0 -c /home/admins/code/ceph/build/ceph.conf
admins 22235 1 1 Sep24 ? 00:40:24 /home/admins/code/ceph/build/bin/ceph-osd -i 2 -c /home/admins/code/ceph/build/ceph.conf
從結(jié)果可以看到,主OSD進程號為?22235
4.3 GDB多線程調(diào)試
關(guān)于linux gdb多線程調(diào)試具體用法這里就不多介紹,需要學(xué)習(xí)了解的,請百度。以下僅為本案例調(diào)試步驟
4.3.1 進入gdb模式
gdb調(diào)試需要以管理員權(quán)限,執(zhí)行以下命令,進入gdb模式
sudo gdb
結(jié)果如下
[sudo] password for admins:
GNU gdb (Ubuntu 8.1.1-0ubuntu1) 8.1.1
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb)
4.3.2 attach osd2 進程
(gdb) attach 22235
Attaching to process 22235
[New LWP 22237]
[New LWP 22238]
[New LWP 22239]
[New LWP 22248]
[New LWP 22249]
[New LWP 22250]
[New LWP 22251]
[New LWP 22254]
[New LWP 22255]
[New LWP 22256]
[New LWP 22257]
[New LWP 22258]
[New LWP 22259]
[New LWP 22260]
[New LWP 22269]
[New LWP 22270]
[New LWP 22271]
........
........
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
0x00007fd026a7dad3 in futex_wait_cancelable (private=<optimized out>, expected=0, futex_word=0x55b3123d8910) at ../sysdeps/unix/sysv/linux/futex-internal.h:88
88 ../sysdeps/unix/sysv/linux/futex-internal.h: No such file or directory.
(gdb)
4.3.3 設(shè)置斷點
#本例斷電設(shè)置在PrimaryLogPG::do_op函數(shù)開始
(gdb) b PrimaryLogPG.cc:1952
Breakpoint 1 at 0x55b305d28af2: file /home/admins/code/ceph/src/osd/PrimaryLogPG.cc, line 1952.
#設(shè)置完斷電之,執(zhí)行continue
(gdb) c
Continuing.
4.3.4 測試
向存儲池中寫入數(shù)據(jù),測試結(jié)果如下文章來源:http://www.zghlxwxcb.cn/news/detail-651555.html
[Switching to Thread 0x7fd0034cb700 (LWP 22364)]
Thread 57 "tp_osd_tp" hit Breakpoint 1, PrimaryLogPG::do_op (this=0x55b312519400, op=...)
at /home/admins/code/ceph/src/osd/PrimaryLogPG.cc:1952
1952 {
從上面結(jié)果可以看到,當(dāng)寫入數(shù)據(jù)時,函數(shù)停在代碼的1952行,現(xiàn)在就可以使用gdb命令進行代碼調(diào)試,和正常調(diào)試代碼一樣。但需要值得注意的一點是,由于ceph osd存在心跳機制,當(dāng)調(diào)試某一個osd時,如果長時間沒有走完該走的流程,該osd會被標(biāo)記為down,就無法再繼續(xù)調(diào)試。需要重新進入gdb模式!文章來源地址http://www.zghlxwxcb.cn/news/detail-651555.html
到了這里,關(guān)于Ceph入門到精通-Linux下Ceph源碼編譯和GDB調(diào)試的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!