Ceph入门到精通-Linux下Ceph源码编译和GDB调试

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

 
 

第一部分 下载Ceph源码

1.1 配置Ceph源码镜像源

Ceph源码是托管在Github上,由于某些原因,国内访问Github网站很慢,所以需要从其他途径加速获取源码。Github官方给出了几个Github的镜像网站:

  1. https://github.com.cnpmjs.org/
  2. https://hub.fastgit.org/

本地需要修改~/.gitconfig文件,才可以从上面镜像网站获取源码,相关配置如下:

#Github镜像源
[url "https://hub.fastgit.org/"]insteadOf = https://github.com/

注:国内也有Ceph源码的镜像,比如Gitee、Gitcode,但不建议从这些网站上获取。因为Ceph源码中使用了大量的第三方源码作为自己的子模块,而Gitee、Gitcode不一定将这些子模块全部同步过来。相反,上面的两个镜像网站和Github完全是同步的,所以可以放心使用。

1.2 克隆ceph源码

Ceph源码很大,可根据需要,选择性下载哪个版本或哪个分支。本案例拉取v14.2.22版本的源码。版本和分支的区别:版本的代码不会随时间改变,被定格在打标签的那一刻;分支的代码会随时间不断开发改变。

# 根据自己需要更换 v14.2.22 为自己需要的版本
git clone -b v14.2.22 --depth=1 https://github.com/ceph/ceph.git

1.3 同步子模块源码

Ceph源码中使用大量的子模块,在 ceph/.gitmodules 文件中罗列出所有的子模块。在后面执行do_cmake.sh 脚本生成 build 目录时,do_cmake.sh 首先同步子模块源码到指定目录。根据经验,在同步子模块源码时很容易出现同步不全,或同步失败,这直接会导致构建 build 目录失败。为了防止此状况发生,建议提前手动去同步子模块源码。

git submodule update --init --recursive

注:如果发现同步子模块源码失败,重复执行上面命令即可。如果中断同步子模块源码,此时必须要到相应目录下删除该子模块所有文件,尤其是 .git 文件。如果不删除 .git,重复执行上面命令时,则会直接跳过同步该子模块,导致子模块源码缺失。这个问题无法被检测到,因为执行完上面命令后,依然会显示同步成功,而不会提示哪个子模块没有被同步。
 
 

第二部分 源码编译

2.1 安装依赖

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

2.1.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.1.2 屏蔽调用安装libboost的部分

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

 *Bionic*)#install_boost_on_ubuntu bionic;;

2.1.3 设置pypi镜像源

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

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

2.1.4 安装其他依赖

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

sudo apt install libzstd1-dev

2.1.5 执行脚本

./install-deps.sh

2.2 编译Ceph源码

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

2.2.2 构建build目录

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

./do_cmake.sh

2.2.3 下载boost源码包

在执行make编译的时候,脚本会自动下载 boost_1_72_0.tar.bz2,由于下载地址和网络问题,下载很慢,为了节省时间,提前手动下载,下载地址:https://download.ceph.com/qa/boost_1_72_0.tar.bz2,将下载的好的包放在ceph/build/boost/src即可。

2.2.4 编译

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

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

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

第三部分 部署Debug版本的集群

3.1 集群部署

Cpeh源码提供了一个部署开发集群的脚本:vstart.sh,该脚本会利用本地IP和不同端口来配置MON、MGR、OSD等。切换到切换到build目录下,执行以下命令,部署一个新的集群

MON=1 OSD=6 MDS=0 MGR=1 RGW=0 ../src/vstart.sh -d -n  -x  --without-dashboard

参数解释:

  1. MON、 OSD、 MDS、 MGR是配置相应的个数
  2. -d:debug,开启debug模式
  3. -n:new,新建一个集群
  4. -x:cephx,cephx认证
  5. --without-dashboard,mgr的一个配置,自测发现如果这个不关闭,部署会报错

3.2 查看集群状态

切换到build目录下,执行以下命令,查看集群状态

./bin/ceph -s 

结果如下

  cluster:id:     88b11a21-7dd1-49d8-bb24-c18821ff09aehealth: HEALTH_OKservices: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 pgsobjects: 0 objects, 0 Busage:   12 GiB used, 594 GiB / 606 GiB availpgs:   

注:ceph 14.2.22版本的vstart.sh脚本并没有将ceph可执行文件添加到系统环境变量中,所有的ceph命令都必须在build目录下执行

3.3 部署ceph分级存储结构

本案例需要调试ceph分级存储功能,因此简单的搭建一个分层存储结构。为集群分配6个OSD,创建2个pool,cache pool和ec pool,每个pool分配了3个osd。
详细部署请参考(文章还在编写中)
 
 

第四部分 代码调试

4.1 查看PG-OSD映射关系

如果仔细阅读源码,会发现ceph分级存储主要是由主OSD进程来负责。如果不是主OSD,是无法调试到代码中的。所以需要查看分级存储中缓存池的PG映射关系。

#切换到build目录下,执行以下命令
./bin/ceph pg ls-by-pool cache_poolPG  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 

从结果可以看到PG5.0对应的主OSD为OSD 2

4.2 查看主OSD进程

执行以下命令

ps -ef | grep ceph

结果如下

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

从结果可以看到,主OSD进程号为 22235

4.3 GDB多线程调试

关于linux gdb多线程调试具体用法这里就不多介绍,需要学习了解的,请百度。以下仅为本案例调试步骤

4.3.1 进入gdb模式

gdb调试需要以管理员权限,执行以下命令,进入gdb模式

sudo gdb

结果如下

[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 设置断点

#本例断电设置在PrimaryLogPG::do_op函数开始
(gdb) b PrimaryLogPG.cc:1952
Breakpoint 1 at 0x55b305d28af2: file /home/admins/code/ceph/src/osd/PrimaryLogPG.cc, line 1952.#设置完断电之,执行continue
(gdb) c
Continuing.

4.3.4 测试

向存储池中写入数据,测试结果如下

[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        {

从上面结果可以看到,当写入数据时,函数停在代码的1952行,现在就可以使用gdb命令进行代码调试,和正常调试代码一样。但需要值得注意的一点是,由于ceph osd存在心跳机制,当调试某一个osd时,如果长时间没有走完该走的流程,该osd会被标记为down,就无法再继续调试。需要重新进入gdb模式!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/39147.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ubuntu18.04】01-network-manager-all.yaml和interfaces和resolv.conf各有什么区别和联系

文章目录 01-network-manager-all.yaml、interfaces 和 resolv.conf 是与网络配置相关的文件&#xff0c;它们在网络设置中有着不同的作用和使用方式。 01-network-manager-all.yaml: 这是一个配置文件&#xff0c;通常在 Ubuntu 系统上使用 NetworkManager 进行网络管理时使用…

ChatGPT​保密吗?它有哪些潜在风险?如何规避?

自2022年11月公开发布以来&#xff0c;ChatGPT已成为许多企业和个人的必备工具&#xff0c;但随着该技术越来越多地融入我们的日常生活&#xff0c;人们很自然地想知道&#xff1a;ChatGPT是否是保密的。 问&#xff1a;ChatGPT保密吗&#xff1f; 答&#xff1a;否&#xff0…

C++11并发与多线程笔记(3)线程传参详解,detach()大坑,成员函数做线程函数

C11并发与多线程笔记&#xff08;3&#xff09;线程传参详解&#xff0c;detach 大坑&#xff0c;成员函数做线程函数 1、传递临时对象作为线程参数1.1 要避免的陷阱11.2 要避免的陷阱21.3 总结 2、临时对象作为线程参数2.1 线程id概念2.2 临时对象构造时机抓捕 3、传递类对象…

VR时代真的到来了?

业界对苹果的期待是&#xff0c;打造一台真正颠覆性的&#xff0c;给头显设备奠定发展逻辑底座的产品&#xff0c;而实际上&#xff0c;苹果只是发布了一台更强大的头显。 大众希望苹果回答的问题是“我为什么需要一台AR或者VR产品&#xff1f;”&#xff0c;但苹果回答的是“…

从零开始学习 Java:简单易懂的入门指南之MAth、System(十二)

常见API&#xff0c;MAth、System 1 Math类1.1 概述1.2 常见方法1.3 算法小题(质数)1.4 算法小题(自幂数) 2 System类2.1 概述2.2 常见方法 1 Math类 1.1 概述 tips&#xff1a;了解内容 查看API文档&#xff0c;我们可以看到API文档中关于Math类的定义如下&#xff1a; Math类…

每天一道leetcode:300. 最长递增子序列(动态规划中等)

今日份题目&#xff1a; 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1,6,2,2,7] …

【JavaEE进阶】SpringBoot项目的创建

文章目录 一. SpringBoot简介1. 什么是SpringBoot?2. SpringBoot的优点 二. SpringBoot项目创建1. 使用IDEA创建2. 使用网页创建SpringBoot项目 三. 运行SpringBoot项目 一. SpringBoot简介 1. 什么是SpringBoot? Spring Boot 是一个用于快速构建基于 Spring 框架的应用程序…

Spring对象装配

在spring中&#xff0c;Bean的执行流程为启动spring容器&#xff0c;实例化bean&#xff0c;将bean注册到spring容器中&#xff0c;将bean装配到需要的类中。 既然我们需要将bea装配到需要的类中&#xff0c;那么如何实现呢&#xff1f;这篇文章&#xff0c;将来阐述一下如何实…

SOFABoot——基本使用(笔记)

文章目录 一、前言二、快速开始2.1 基本搭建2.2 测试是否成功2.3 其他部分日志测试异步启动 三、SOFABoot的模块化开发3.1 基于Spring上下文的隔离3.2 Root Application Context3.3 模块并行化启动3.4 JVM服务与RPC服务的发布与引用3.5 模块配置Module-NameRequire-ModuleSprin…

wsl2安装mysql环境

安装完mysql后通过如下命令启动mysql service mysql start 会显示如下错误&#xff1a; mysql: unrecognized service 实际上上面显示的错误是由于mysql没有启动成功造成的 我们要想办法成功启动mysql才可以 1.通过如下操作就可以跳过密码直接进入mysql环境 2.如果想找到my…

微服务与Nacos概述-5

引入OpenFeign 添加依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency><groupId>com.alibaba.cloud</groupId>…

“记账”很麻烦,看这场竞赛中的队伍与合合信息是如何解决问题的

在我们日常生活中或多或少都会有记账的情况&#xff0c;以此来对自己的收支和消费习惯进行分析&#xff0c;来帮助自己减少不必要的开支&#xff0c;优化财务决策、合理分配资金&#xff0c;减少财务压力和不必要的浪费。 但记账这个动作本身就是一件比较麻烦的。虽然现阶段有…

数据结构入门 — 时间复杂度、空间复杂度

前言 数据结构_空间复杂度_时间复杂度讲解_常见复杂度对比 本文介绍数据结构中的时间复杂度和空间复杂度 ***文章末尾&#xff0c;博主进行了概要总结&#xff0c;可以直接看总结部分*** 博主博客链接&#xff1a;https://blog.csdn.net/m0_74014525 点点关注&#xff0c;后期…

哈夫曼树(赫夫曼树、最优树)详解

目录 哈夫曼树&#xff08;赫夫曼树、最优树&#xff09;详解 哈夫曼树相关的几个名词 什么是哈夫曼树 构建哈夫曼树的过程 哈弗曼树中结点结构 构建哈弗曼树的算法实现 哈夫曼树&#xff08;赫夫曼树、最优树&#xff09;详解 哈夫曼树相关的几个名词 路径&#xff1a;…

2023牛客暑期多校训练营8(A/H/I/J)

目录 A.Alive Fossils H.Insert 1, Insert 2, Insert 3, ... I.Make It Square J.Permutation and Primes A.Alive Fossils 思路&#xff1a;一开始题意看半天没看懂&#xff0c;后面发现只需要输出t组输入中&#xff0c;都出现过的字符串即可。 代码&#xff1a; void s…

实验三 图像分割与描述

一、实验目的&#xff1a; &#xff08;1&#xff09;进一步掌握图像处理工具Matlab&#xff0c;熟悉基于Matlab的图像处理函数。 &#xff08;2&#xff09;掌握图像分割方法&#xff0c;熟悉常用图像描述方法。 二、实验原理 1.肤色检测 肤色是人类皮肤重要特征之一&#xff…

7.原 型

7.1原型 【例如】 另外- this指向&#xff1a; 构造函数和原型对象中的this都指向实例化的对象 7.2 constructor属性 每个原型对象里面都有个constructor属性( constructor构造函数) 作用&#xff1a;该属性指向该原型对象的构造函数 使用场景: 如果有多个对象的方法&#…

Springboot 实践(4)swagger-ui 测试controller

前文项目操作&#xff0c;完成了项目的创建、数据源的配置以及数据库DAO程序的生成与配置。此文讲解利用swagger-ui界面&#xff0c;测试生成的数据库DAO程序。目前&#xff0c;项目swagger-ui界面如下&#xff1a; 以”用户管理”为例&#xff0c;简单讲述swagger-ui测试数据库…

无涯教程-Perl - s函数

描述 这不是功能。这是正则表达式替换运算符。根据PATTERN中指定的正则表达式,将数据替换为REPLACE。与m //一样,分隔符由s后的第一个字符定义。 语法 以下是此函数的简单语法- s/PATTERN/REPLACE/返回值 如果失败,此函数返回0,如果成功,则返回替换次数。 例 以下是显示…

笔记:移植xenomai到nuc972

xenomai是一个实时操作系统,想要使用它,先要移植I-pipe补丁 补丁在xenomai / ipipe-arm GitLab 我的内核是4.4-248的,合并上去会有几个小错误,随便改改就好 编译内核没有报错之后,接下来需要修改arch/arm/mach-nuc970/time.c 修改方法参考补丁里面其它设备的定时器驱动,就…