IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Linux下Ceph源码编译和调试--ceph-deploy版本 -> 正文阅读

[系统运维]Linux下Ceph源码编译和调试--ceph-deploy版本

Ceph版本:14.2.22
Linux版本:ubuntu-server 18.04

前言

调试ceph源码需要提前部署好一个完整的集群,部署集群的方法很多,比如:通过ceph源码自带的vstart脚本部署;通过像ceph-deploy等自动化工具部署;手动输入ceph命令部署。三种部署集群方法在调试源码时的区别如下:

  1. vstart脚本直接使用ceph/build编译出来的bin和lib来搭建集群,一旦源码改变,只需再次编译即可,集群的功能会随编译出来的bin和lib动态变化。
  2. ceph-deploy工具是使用官方编译出来ceph发布版本安装包来搭建集群。但是ceph发布版本的安装包是不可以调试的。如果需要调试源码,必须安装官方一同发布出来的dbg包,同时也要使用官方一同发布出来的ceph源码包。另外,如果源码发生改变,就需要使用ceph/build编译出来新的bin和lib替换系统中对应的部分。
  3. ceph命令也是使用ceph/build编译出来的bin和lib来搭建集群,但比vstart麻烦一些,它需要将ceph/build编译出来的bin和lib使用make install命令安装到系统中。因此如果源码发生改变,就需要使用ceph/build编译出来新的bin和lib替换系统中对应的部分。

本文采用ceph-deploy方式
?
?

第一部分 Ceph源码下载

由前言部分阐述可知,需要从官方发布的源码包中获取,为了提高下载速度,本文采用阿里云开源镜像站的ceph镜像地址:

https://mirrors.aliyun.com/ceph/debian-nautilus/pool/main/c/ceph/ceph_14.2.22.orig.tar.gz

注:一定不要在windows下解压tar包,因为ceph源码中很多文件名不是windows的合法文件名,这样会导致解压文件失败
?
?

第二部分 安装依赖

Ceph源码安装依赖很简单,直接执行源码根目录下install-deps.sh脚本,根据经验发现,该脚本存在一些问题,需要稍微修改一下。

2.1 修改launchpad源

脚本会安装gcc环境,安装包源url只需要保留一个即可,修改install-deps.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.2 屏蔽调用安装libboost的部分

脚本会安装 libboost 库,编译源码过程会再次下载 boost 源码包,因此脚本中不应该再安装 libboost,屏蔽install-deps.sh以下2个地方

 *Bionic*)
        #install_boost_on_ubuntu bionic

2.3 设置pypi镜像源

脚本会安装pypi库,默认url下载很慢,需要设置pypi库镜像源。创建 ~/.pip/pip.conf 文件,并追加以下内容

[global]
index-url = https://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com

2.4 安装其他依赖

编译源码过程中会遇到很多函数用到zstd库,默认情况下ubuntu18.04只安装了libzstd1,但没有用,需要安装 libzstd1-dev

sudo apt install libzstd1-dev

2.5 执行脚本

./install-deps.sh

?
?

第三部分 编译Ceph源码

3.1 开启debug模式

如果想要调试Ceph源码,需要设置编译源码模式为debug模式,默认编译模式为release模式,该模式是不能调试源码。向 ceph/CMakeList 文件的 set(VERSION 14.2.22) 后追加以下内容

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 ")

3.2 构建build目录

直接执行do_cmake脚本,该脚本会进行一系列检测,包括源码是不是完整,依赖是不是都安装了等等。如果出现问题,构建出的build目录是不完整的,最直接的影响是无法生成makefile文件,导致无法编译。

./do_cmake.sh

3.3 编译

使用make编译必须要到ceph/build目录下执行,ceph源码可以单独编译某一个模块,也可以全部编译。使用make可以指定多线程编译,提高编译速度,但要合理分配线程数,建议使用4线程编译即可。

#方式1:全部编译
make all -j4
#方式2:单独编译osd某块
make ceph-osd -j4
#查看所有模块
make help

注:源码编译会生成很多库文件和二进制文件,分别放在ceph/build/lib和ceph/build/bin目录下
?
?

第四部分 集群部署

集群部署既可以采用离线部署也可以采用在线部署方式。本文建议采用在线部署方式,因为在线部署使用的ceph安装包一定是由官方一同发布的ceph源码包编译生成的。这样就省去了离线部署需要制作deb包的步骤,提高效率。ceph-deploy在线部署ceph集群的详细内容,之前笔者已经发布过该文章,此处仅提供文件链接:Linux下在线部署指定版本的Ceph集群。另外,本文需要调试文件系统方面的功能,因此需要搭建好文件系统,文件系统搭建文章正在编写中...
?
?

第五部分 源码调试

由前言部分阐述可知,使用ceph-deploy方式调试代码,需要安装dbg包。本文需要调试mds在管理元数据方面的代码,因此需要安装ceph-mds-dbg包。

5.1 安装dbg包

sudo apt install ceph-mds-dbg

5.2 替换系统安装的bin和lib文件

如果已经修改了官方发布的源码,除了安装dbg包外,还需要使用build/bin和/build/lib编译出来的关于mds的文件替系统默认安装的。如果没有更改,无需替换。系统默认把ceph相关的二进制文件安装到/usr/bin,把ceph依赖的动态库安装到/usr/lib中

5.3 查看mds进程号

root@node0:~# ps -ef | grep ceph
root     26258     1  0 08:51 ?        00:00:00 /usr/bin/python2.7 /usr/bin/ceph-crash
ceph     26578     1  1 08:52 ?        00:03:58 /usr/bin/ceph-mgr -f --cluster ceph --id node0 --setuser ceph --setgroup ceph
ceph     27258     1  0 08:54 ?        00:00:36 /usr/bin/ceph-osd -f --cluster ceph --id 0 --setuser ceph --setgroup ceph
ceph     27715     1  0 08:55 ?        00:00:35 /usr/bin/ceph-osd -f --cluster ceph --id 1 --setuser ceph --setgroup ceph
ceph     28144     1  0 08:55 ?        00:00:35 /usr/bin/ceph-osd -f --cluster ceph --id 2 --setuser ceph --setgroup ceph
ceph     28504     1  0 08:57 ?        00:01:54 /usr/bin/ceph-mon -f --cluster ceph --id node0 --setuser ceph --setgroup ceph
root     29837     2  0 09:23 ?        00:00:00 [ceph-msgr]
root     29847     2  0 09:23 ?        00:00:00 [ceph-watch-noti]
ceph     30506     1  0 09:36 ?        00:01:06 /usr/bin/ceph-mds -f --cluster ceph --id node0 --setuser ceph --setgroup ceph
root     31855 31769  0 15:04 pts/1    00:00:00 grep --color=auto ceph

从结果可以看到mds进程号为 30506

5.4 gdb调试

5.4.1 进入gdb模式

gdb调试需要以管理员权限,本文默认是root用户,所以直接输入gdb即可进入gdb模式

root@node0:~# gdb
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) 

5.4.2 attach mds进程

(gdb) attach 30506
Attaching to process 30506
[New LWP 30507]
[New LWP 30508]
[New LWP 30509]
[New LWP 30510]
[New LWP 30515]
[New LWP 30516]
[New LWP 30517]
[New LWP 30518]
[New LWP 30519]
[New LWP 30520]
[New LWP 30521]
[New LWP 30522]
[New LWP 30523]
[New LWP 30524]
[New LWP 30525]
[New LWP 30526]
[New LWP 30527]
[New LWP 30528]
[New LWP 30529]
[New LWP 30530]
[New LWP 30531]
[New LWP 30534]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
0x00007fcfa8836ad3 in futex_wait_cancelable (private=<optimized out>, expected=0, futex_word=0x5596683c8910) at ../sysdeps/unix/sysv/linux/futex-internal.h:88
88	../sysdeps/unix/sysv/linux/futex-internal.h: No such file or directory.
(gdb)

5.4.3 设置断点

因为需要调试新建目录时,mds对元数据的管理,因此断点设置在Server::handle_client_mkdir起始处

(gdb) b Server.cc:5932
Breakpoint 1 at 0x559664e0fc19: file /root/code/ceph/src/mds/Server.cc, line 5932.

设置完断点后,执行continue

(gdb) c
Continuing.

5.4.4 测试

在挂载出来的文件系统目录下,新建一个目录,代码会跳到之前设置的断点处

Thread 9 "ms_dispatch" hit Breakpoint 1, Server::handle_client_mkdir (this=0x559667754dc0, mdr=...) at /root/code/ceph/src/mds/Server.cc:5932
5932	  const MClientRequest::const_ref &req = mdr->client_request;
(gdb)

从上面结果可以看到,新建一个目录时,函数停在代码的5932行,现在就可以使用gdb命令进行代码调试,和正常调试代码一样

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-03-08 22:59:52  更:2022-03-08 23:02:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 3:36:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码