一.背景
由于某地项目需要需要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就可以打包了 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。