当前生产环境中我们所使用的ceph版本为jewel版本:
# ceph --version
ceph version 10.2.10 (5dc1e4c05cb68dbf62ae6fce3f0700e4654fdbbe)
因此,这里我们也以该版本为例来介绍ceph源代码的编译。当前我们的操作系统环境如下(ceph编译时需要耗费极大量的内存,建议内存至少4G以上):
# lsb_release -a
LSB Version: :core-4.1-amd64:core-4.1-noarch
Distributor ID: CentOS
Description: CentOS Linux release 7.3.1611 (Core)
Release: 7.3.1611
Codename: Core
# uname -a
Linux localhost.localdomain 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
# free -h
total used free shared buff/cache available
Mem: 3.7G 1.2G 520M 65M 2.0G 2.0G
Swap: 4.9G 0B 4.9G
所使用的编译器版本为:
# gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Ceph的源码可以去Github之上clone下来,或者去Ceph官网下载。这里重点提一下Ceph的版本问题,Ceph在Hammer版本之后,采取了新的版本命名规则:
x.0.z - 开发版
x.1.z - 候选版
x.2.z - 稳定、修正版
1. 编译安装Jewel ceph
1.1 下载ceph源码
这里我们下载ceph-10.2.10版本。我们有如下几种方法:
1) 直接克隆指定版本
# git clone https://github.com/ceph/ceph.git -b v10.2.10 --depth 1
# cd ceph
# ls -al .
./ .git/ .gitmodule_mirrors .mailmap .peoplemap
../ .gitignore .gitmodules .organizationmap
# git submodule update --force --init --recursive
# git log -s
commit 5dc1e4c05cb68dbf62ae6fce3f0700e4654fdbbe
Author: Jenkins Build Slave User
Date: Wed Oct 4 14:17:25 2017 +0000
10.2.10
2) 克隆整个ceph工程
在ceph官网下载的tar.gz包缺少文件,用git clone下载的ceph包比较全,因此我们采用如下方法
# git clone --recursive https://github.com/ceph/ceph.git
下载ceph的其他子模块,否则在编译过程中会出现缺少库:
# git submodule update --force --init --recursive
克隆完成后,我们使用git branch -a命令来查看所有的分支:
# git branch -a
* master
remotes/origin/BZ-1650306
remotes/origin/HEAD -> origin/master
remotes/origin/argonaut
remotes/origin/bobtail
remotes/origin/ceph-facts-role
remotes/origin/cuttlefish
remotes/origin/dumpling
remotes/origin/emperor
remotes/origin/firefly
remotes/origin/giant
remotes/origin/guits-add_dep
remotes/origin/guits-fix_simple_activate_fs
remotes/origin/hammer
remotes/origin/hammer-next
remotes/origin/infernalis
remotes/origin/jewel
remotes/origin/jewel-next
remotes/origin/joscollin-patch-1
remotes/origin/joscollin-patch-2
remotes/origin/kraken
remotes/origin/luminous
remotes/origin/luminous-no-scripts
remotes/origin/master
remotes/origin/mimic
remotes/origin/mimic-new
remotes/origin/nautilus
remotes/origin/revert-26048-luminous-37977
remotes/origin/rh-luminous
remotes/origin/rh-luminous_old
remotes/origin/v
remotes/origin/v10.2.0
remotes/origin/wip-36686-luminous
remotes/origin/wip-41038-nautilus
remotes/origin/wip-41238-nautilus
remotes/origin/wip-add-diag-suite
remotes/origin/wip-cd-vol-size
remotes/origin/wip-ceph-volume-tests-no-dashboard
remotes/origin/wip-daemonwatchdog-testing6
remotes/origin/wip-ldapauth-wusui
remotes/origin/wip-luminous-conf-error-message
remotes/origin/wip-pcuzner-testing
remotes/origin/wip-perf-keys
remotes/origin/wip-qa-rgw-swift-server
remotes/origin/wip-qa-rgw-swift-server-nautilus
remotes/origin/wip-rm37865
remotes/origin/wip-smoke-use-ca
remotes/origin/wip-zafman-26971-diag
另外也可以通过git tag命令来查询所有标签:
# git tag -l
mark-v0.70-wip
v0.1
v0.10
v0.11
v0.12
v0.13
v0.14
v0.15
v0.16
v0.16.1
v0.17
v0.18
v0.19
v0.19.1
v0.2
v0.20
v0.20.1
v0.20.2
然后使用如下命令切换到10.2.10版本:
# git checkout v10.2.10
3) 克隆指定tag或commitID
对于一个大工程,我们很适合采用此方法。
首先新建一个文件夹ceph-10.2.10
# mkdir ceph-10.2.10
# cd ceph-10.2.10
接着在当前目录ceph-10.2.10创建一个空repository:
# git init
之后将其添加到一个远程仓库:
# git remote add my-ceph https://github.com/ceph/ceph.git
之后fetch一个commit(或branch 或tag)
# git fetch my-ceph v10.2.10 //注意此处v10.2.10为远程ceph仓库对应的一个tag
将本地仓库的master分支reset为指定的commit
# git reset --hard FETCH_HEAD
最后再更新submodules
# git submodule update --force --init --recursive
# git log -s
1.2 编译ceph
下载完ceph源码,我们先参看一下README.md的说明(或查看官网ceph编译说明),以了解大体编译步骤(请保持环境干净,否则可能引起不必要的麻烦。笔者编译时就因为事先安装过rocksdb而出现问题)。
1) 安装依赖项
执行如下命令检测并安装相应的依赖项:
# ./install-deps.sh
2) 编译ceph
其实ceph编译有两种方式,一种是运行autogen.sh后接着运行configure,接着运行make编译,编译完成后用make install安装。还有另外一种是直接编译成deb包。下面我们就分别介绍一下这两种方式。
方式1
1.1 生成相关编译文件
执行如下命令预先生成编译时需要的相关文件:
# ./autogen.sh
在执行过程中提示没有libtoolize,及gcc,g++等工具,执行如下命令进行安装:
# yum install libtool
# yum install gcc
# yum install gcc-c++
1.2 生成Makefile文件
执行如下命令生成编译对应的Makefile文件:
# ./configure --with-rbd --with-debug --with-rados --with-radosgw --with-cephfs --enable-client --enable-server --enable-xio --enable-pgrefdebugging --enable-valgrind
上面我们enable一些选项,主要是为了便于我们后边在研究ceph源代码时可以对相关的单元测试脚本进行测试。
在执行configure过程中可能会提示需要安装相应的软件包,执行如下命令安装:
# yum install snappy-devel
# yum install leveldb-devel
# yum install libuuid-devel
# yum install libblkid-devel
# yum install libudev-devel
# yum install keyutils-libs-devel
# yum install cryptopp-devel
# yum install fuse-devel
# yum install libatomic_ops-devel
# yum install libaio-devel
# yum install xfsprogs-devel
# yum install boost-devel
# yum install libedit-devel
# yum install expat-devel
如果不想要依赖于google-perftools,请使用: ./configure –without-tcmalloc;如果需要调试以及编译测试程序可以加上--with-debug选项
此外还可以设置--prefix=
--prefix=/usr/local/ceph --sysconfdir=/etc/ceph
如果我们想要使用GDB来进行调试的话,我们需要修改Makefile文件,找到所有O2行,把它替换成-O0-Wall -g:
# pwd
/root/ceph-inst/ceph
# grep -nw "O2" ./Makefile
431:CCASFLAGS = -g -O2
433:CFLAGS = -D_LARGEFILE64_SOURCE -g -O2
443:CXXFLAGS = -g -O2 -std=gnu++11
532:PYTHON_CFLAGS = -I/usr/include/python2.7 -I/usr/include/python2.7 -fno-strict-aliasing -O2 -g ...
如果需要进行更深层次调试的话,可以执行如下命令安装调试依赖包:
# yum install lttng-tools* lttng-ust* lttng*
1.3 编译
在编译时我们最好将src目录设置到PATH中,以防在编译过程中对ceph-authtool等工具找不到:
# pwd
/root/ceph-inst/ceph
# export PATH=$PATH:/r