一.背景
由于某地项目需要需要ceph支持redhat6.4,因此需要在redhat6.4 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
可以从ceph 官网下载打包好的
http://download.ceph.com/tarballs/
三 编译源码
在生成rpm包之前,我们需要保证源码编译环境正常,因此我们先编译ceph源码,这里获取的是10.2.5的代码。
执行
./autogen.sh
按照提示对libtool进行安装
yum install libtool
执行
./configure –with-radosgw
按照提示安装gcc-c++
yum install gcc-c++
再次执行configure,我们发现提示如下错误
这里写图片描述
很明显,jewel版本的代码要求支持c++11特性,因此我们升级gcc。
获取gcc-4.8.1
wget http://ftp.gnu.org/gnu/gcc/gcc-4.8.1/gcc-4.8.1.tar.gz
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/pub/epel/epel-release-latest-6.noarch.rpm
wget https://rhel6.iuscommunity.org/ius-release.rpm
安装源
rpm -Uvh epel-release-latest-6.noarch.rpm ius-release.rpm
重新执行configure还会报比较多的包缺失,这里不一一赘述。在我的系统中,安装以下安装包:
yum install snappy-devel leveldb-devel libblkid-devel libudeve-dev expat-devel keyutils-libs-devel cryptopp cryptopp-devel cryptopp fuse-devel fuse-libs libuuid-devel libedit-devel libatomic_ops-devel libatomic libaio-devel xfsprogs-devel openldap-devel fuse-python libudev libudev-devel boost boost-devel openssl openssl-devel libcurl libidn-devel curl fcgi-devel fcgi libcurl-devel
在这里,需要注意的是boost的版本应该是1.53:
默认boost-random安装完后 生成的so名字为 libboost_random-mt.so.1.46.0,但是configure扫描环境变量扫描文件名为libboost_random-mt.so,因此需要生成软链接。
ln -s /usr/lib64/libboost_random.so.1.53.0 /usr/lib64/libboost_random-mt.so
ln -s /usr/lib64/libboost_random.so.1.53.0 /usr/lib64/libboost_random.so
boost安装完成后,重新编译ceph
重新configure –with-radosgw再make源码,在这之前需要修改rbd-nbd,在redhat6.4版本上内核不支持nbd,如果需要编译rbd-nbd需要对内核进行升级到3.10以上。
rpm -Uvh kernel-3.10.105-1.el6.x86_64.rpm
然而,这次又出错了,报 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 --enable-shared
如果要生成共享库libpython2.7.so、libpython2.7.so.1.0、libpython2.7.a(.so为动态库,.a为静态库),加上--enable-shared
修改 Modules/Setup 文件
vi Modules/Setup
# Socket module helper for SSL support; you must comment out the other
# socket line above, and possibly edit the SSL variable:
#SSL=/usr/local/ssl
_ssl _ssl.c \
-DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
-L$(SSL)/lib -lssl -lcrypto
默认这块是注释的,放开注释即开。这块功能是开启SSL模块,不然会出现安装完毕后,提示找不到ssl模块的错误。
make 添加-j4使用多核加速.
make -j4
make install
用软连接进行2.6 2.7版本转换
ln -sf /usr/local/python2.7/bin/python /usr/bin/python
ln -sf /usr/local/python2.7/lib/libpython2.7.so /usr/lib64/libpython2.7.so
ln -sf /usr/local/python2.7/lib/libpython2.7.so.1.0 /usr/lib64/libpython2.7.so.1.0
添加python2.7的环境变量:
vi /etc/profile
export PYTHON_HOME=/usr/local/python2.7/bin;
export PATH=$PATH: