Nautilus
编译环境
硬件
采用KVM虚拟机编译Ceph源码,具体配置如下:
1 | lscpu |
1 | free -g |
软件
OS:
1 | cat /etc/redhat-release |
kernel:
1 | uname -a |
gcc:
1 | gcc -v |
编译
pre-compile
执行install-deps.sh
,安装编译ceph依赖的软件包。
cmake
安装官方文档的步骤可以正常编译,但默认的编译是含有调试信息的。所以编译后的bin文件比较大。
- 生成makefile文件
使用do_cmake.sh
脚本在build
目录下生成Makefile
文件 - 编译
使用make
命令编译,此过程时间较长。 - 瘦身
编译后的binary文件包含有debug信息,所以文件较大。需要使用strip对其debug信息进行裁剪。裁剪有两个工具可以用一个是objcopy
;另一个是strip
eg:`objcopy --strip-debug ./radosgw` `strip --strip-debug --strip-unneeded ./radosgw`
rpmbuild
- 生成
rpmbuild
目录树
使用rpmdev-setuptree
命令创建rpmbuild
目录树,该目录树会在$home
目录下生成。可根据自己的需要将rpmbuild
copy到指定的目录,但后续build过程需要指定这个目录。本人将rpmbuild
目录移动到/root/src
目录下。 - 获取源码tar包到
rpmbuild/SOURCES
目录
获取源码tar包可以到https://download.ceph.com/tarballs/ceph-14.2.3.tar.gz
去下载。也可以将修改好的代码直接做成tar包。然后将tar包copy到rpmbuild/SOURCES
目录下。 - 提取tar包中的
ceph.spec
从源码tar包中提取ceph.spec
文件到rpmbuild/SPECS
目录,用于后续rpmbuild使用。eg:tar --strip-components=1 -C /root/src/rpmbuild/SPECS/ --no-anchored -xvzf /root/src/rpmbuild/SOURCES/ceph-14.2.3.tar.gz "ceph.spec"
- build rpms
rpmbuild具体使用-bb
还是-ba
根据个人需要而定吧。本人这里使用-bb
只制作binary。eg:rpmbuild -D "_smp_mflags 4" -D "_topdir /root/src/rpmbuild" -bb /root/src/rpmbuild/SPECS/ceph.spec
。
由于本人将rpmbuild
移动到了/root/src
目录下,所以需要使用-D "_topdir /root/src/rpmbuild"
去指定rpmbuild
目录。
本人不希望rpmbuild自动推算使用几个核心去编译,需要指定4个核心编译需要指定-D "_smp_mflags 4"
此时,可以静静等待编译完成。
编译的过程中可能会遇到BuildArch:noarch
错误
1 | error: Arch dependent binaries in noarch package |
可以通过在spec
文件中增加%define _binaries_in_noarch_packages_terminate_build 0
来解决此问题。
Luminous
编译 Ceph luminous版本,luminous的改动还是蛮大的,而且改变了原有的configure为cmake。
编译环境
硬件
armv7l (Odroid XU4)
软件
1 | lsb_release -a |
编译
按照官方的文档,编译总共分为4步。
- 安装编译需要的依赖包
./install-deps.sh
- 使用cmake生成Makefile
./do_cmake.sh
- 使用Makefile编译源代码
- 安装包制作
由于本人使用的是archlinux,简单查看了一下install-deps.sh
这个脚本,发现没有与我使用os相匹配的处理;所以本人决定跳过第一步,并且我也不打算制作安装包,所以第四部也省略了。
接下来就只剩下第2、3步了,那么ceph编译依赖的其他软件包怎么解决,就只能放倒编译过程中出现报错再去究其原因了。闲言少叙,我们开始编译。
cmake过程
从github上clone下来ceph代码,不需要取得submodule的代码,因为在do_cmake.sh
中首先会做。执行do_cmake.sh
后,先取submodule代码,然后创建build目录,并在build目录中执行cmake,生成Makefile。
在获取submodule这个过程由于网络问题会出现不只一次的中断,这个时候需要先删除build
目录,然后在重新执行do_cmake.sh
。
make过程
ceph编译需要用到boost包,之前的版本都是需要用户手动安装,L版改为取源码自行编译了。可以先执行make Boost
或直接执行make
操作,我在编译boost的时候遇到了找不到pyconfig.h
的编译错误,此时需要根据错误提示的文件及行数,找到对应的cxxflags
并增加-I/usr/include/python2.7/
这样再次执行make
操作boost就能正常编译了。
1 | Scanning dependencies of target ceph-dencoder |
由于我使用的是嵌入式设备,内存只有2g大小,并且没有配置swap,在编译过程中会遇到g++: internal compiler error: Killed (program cc1plus)
错误,这种错误都是由于内存不足导致的。对于我的环境而言,只能通过增加swap来解决(关于增加swap的方法)。
问题解决了,就一路make下去吧。