ceph 源码编译in redhat6.6

一.背景
由于某地项目需要需要ceph支持redhat6.6客户端,因此需要在redhat6.6 basic server进行源码的编译以及rpm包的生成。

二.获取ceph源码
获取ceph源码有几种方式,可以选择从git库上获取,也可以在官网获取,值得一提的是,如果在git库上获取时,默认是只clone 主分支源码到当前工作目录,并不会递归clone ceph submodule里的代码,因此在编译时常出现模块代码不存在的问题。

这里采用git库的方式获取代码:
1.获取ceph git主分支

git clone --recursive https://github.com/ceph/ceph.git 2.获取ceph redhat分支
git checkout -b local origin/rh-jewel 三 编译源码 在生成rpm包之前,我们需要保证源码编译环境正常,因此我们先编译ceph源码,这里获取的是10.2.5的代码。 执行
./autogen.sh 按照提示对libtool进行安装
yum install libtool 执行
./configure --with-radosgw 按照提示安装gcc-c++
yum install gcc-c++ 再次执行configure,我们发现提示如下错误 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q0fvzg1b-1591252550584)(http://img.blog.csdn.net/2017...] 很明显,jewel版本的代码要求支持c++11特性,因此我们升级gcc。 获取gcc-4.8.1
wget http://ftp.gnu.org/gnu/gcc/gc... ` tar xzf gcc-4.8.1.tar.gz cd gcc-4.8.1 ./contrib/download_prerequisites //依赖库 cd .. mkdir build_gcc4.8.1 cd build_gcc4.8.1 ../gcc-4.8.1/configure --prefix=/usr -enable-checking=release --enable-languages=c,c++ --disable-multilib make -j4 make install ` 到此,我们gcc升级完成,可以重新编译ceph源码。 回到ceph源码目录,重新执行configure --with-radosgw,报以下错误 这里写图片描述 这个错误是缺少cython包 在安装此安装包以前需要安装python2.7,默认系统自带2.6,需要进行升级。 获取epel源
wget https://dl.fedoraproject.org/... wget https://rhel6.iuscommunity.or... 安装源
rpm -Uvh epel-release-latest-6.noarch.rpm ius-release.rpm 接下来可以安装python2.7 cython python-devel等安装包
yum install python27 cython python-devel python-pip python-virtualenv 重新执行configure还会报比较多的包缺失,这里不一一赘述。在我的系统中,安装以下安装包:
yum install snappy-devel leveldb-devel libblkid-devel libudeve-dev expat-devel keyutils-libs-devel cryptopp cryptopp-devel cryptopp -utils fuse-devel libuuid-devel libedit-devel libatomic_ops-devel boost boost-devel libaio-devel xfsprogs-devel boost-random openldap-devel fuse-python 在这里,需要注意的是: 默认boost-random安装完后 生成的so名字为 libboost_random-mt.so.1.46.0,但是configure扫描环境变量扫描文件名为libboost_random-mt.so,因此需要生成软链接。
ln -s /usr/lib64/libboost_random.so.1.46.0 /usr/lib64/libboost_random-mt.so ln -s /usr/lib64/libboost_random.so.1.46.0 /usr/lib64/libboost_random.so 使用yum版本boost库后,在编译时还是会出现boost库部分头文件缺失的问题,因此决定使用boost源码安装。 首先卸载boost库相关rpm包,下载解压boost源码、zlib源码、bzip2源码 ` tar xvf boost_1_63_0.tar.gz tar xvf zlib-1.2.11.tar.gz tar xvf bzip2-1.0.6.tar.gz export BZIP2_SOURCE=/root/bzip2-1.0.6 export ZLIB_INCLUDE=/root/zlib-1.2.11 cd boost_1_63_0 ./bootstrap.sh –prefix=/usr/local/ ./bjam --toolset=gcc --with-iostreams runtime-link=static link=static stage ./bjam --TOOLS=gcc --with-thread install ./b2 --prefix=/usr/local -sZLIB_SOURCE=/root/zlib-1.2.11/ --build-type=complete --layout=tagged install ` 注意,在编译boost的时候一定指定type为complete,否则boost默认编译mininal版本,不编译多线程版本的库,造成ceph编译报错。 boost安装完成后,重新编译ceph 重新configure --with-radosgw再make源码,在这之前需要修改rbd-nbd,在redhat6.6版本上内核不支持nbd,如果需要编译rbd-nbd需要对内核进行升级。然而,这次又出错了,报 gcc rados.c cephfs.c No such file,很困惑,提示里看到一个关键词pybind。 百度了一下pybind这个工具,是将python代码转换为c代码的,rados.c cephfs.c是通过这个工具转换出来的,然后再进行编译,另外在代码里看到很多python2.6的字眼,我们不是将2.6升级成2.7了么,怎么还是2.6? 因此决定将rpm包卸载,进行源码安装。
rpm -e python27 python27-libs 获取python2.7源码
tar xvf Python-2.7.13.tgz ./configure --prefix=/usr/local/python27 make install 写了个简单脚本进行2.6 2.7版本转换 `bash #!/bin/bash # # switch python in (26, 27) # # # processname: switch_python.sh # case "$1" in py27) echo "Starting switch to python27" ln -sf /usr/local/python27/bin/python /usr/bin/python ln -sf /usr/local/python27/bin/easy_instal /usr/bin/easy_install ln -sf /usr/local/python27/bin/pip /usr/bin/pip ln -sf /usr/local/python27/bin/virtualenv /usr/bin/virtualenv echo "Success...already27." ;; py26) echo "Starting switch to python26" ln -sf /usr/bin/python2.6 /usr/bin/python ln -sf /usr/bin/easy_install-2.6 /usr/bin/easy_install ln -sf /usr/bin/pip2.6 /usr/bin/pip ln -sf /usr/bin/virtualenv-2.6 /usr/bin/virtualenv echo "Success...already26." ;; *) echo "Usage: $0 {py26|py27}" exit 1 ;; esac ` 再进行完python转换后,继续make,发现报的错误变成setup错误,百度此错误后安装setup-tool。
wget --no-check-certificate https://pypi.python.org/packa... tar -zxvf setuptools-12.0.3.tar.gz cd setuptools=12.0.3 python setup.py install 安装完毕后,再次进行make,报cython.build module找不到,因此决定升级cython。
wget https://bootstrap.pypa.io/get... python get-pip.py pip install distribute pip install Cython ln -s /usr/local/bin/sphinx-build /usr/local/bin/sphinx-1.0-build 等安装完这些,发现报
ld-cannot find -ltpython2.7 很奇怪,源码安装为啥没有编译动态库,因此重新安装python27
yum install python27 python27-devel 继续make还是报统一错误,于是将so做成软链接
ln -s /usr/lib64/libpython2.7.so.1.0 /usr/lib64/libpython2.7.so 再次make,终于成功了。 四 生成rpm包 在源码编译成功后,表明环境可以正式进行rpm打包了。 进入ceph目录,make dist-bzip2 执行完成后,生成对应的.tar.bz2文件。 准备rpmbuild工作目录
mkdir ~/rpmbuild/ ~/rpmbuild/BUILD ~/rpmbuild/BUILDROOT ~/rpmbuild/RPMS ~/rpmbuild/SOURCES ~/rpmbuild/SPECS ~/rpmbuild/SRPMS 准备构建文件
cp ceph.tar.bz2 ~/rpmbuild/SOURCES cp ceph/rpm/init-ceph.in-fedora.patch ~/rpmbuild/SOURCES cp ceph/ceph.spec ~/rpmbuild/SPECS 生成rpm包
rpmbuild -bb ~/rpmbuild/SPECS/ceph.spec 生成rpm包提示会有很多依赖,其中boost库的已经安装,只需要在ceph.spec里面将其注释掉,另外注释掉policyhelp就可以打包了

你可能感兴趣的:(ceph,storage)