Ceph luminous 编译

编译 Ceph luminous版本,luminous的改动还是蛮大的,而且改变了原有的configure为cmake。

编译环境

armv7l (Odroid XU4)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ lsb_release -a
LSB Version: 1.4
Distributor ID: Arch
Description: Arch Linux
Release: rolling
Codename: n/a
$ uname -a
Linux HomeCenter 4.14.29-1-ARCH #1 SMP PREEMPT Fri Mar 23 02:57:06 UTC 2018 armv7l GNU/Linux
$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/armv7l-unknown-linux-gnueabihf/7.2.1/lto-wrapper
Target: armv7l-unknown-linux-gnueabihf
Configured with: /build/gcc/src/gcc/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://github.com/archlinuxarm/PKGBUILDs/issues --enable-languages=c,c++,fortran,go,lto,objc,obj-c++ --enable-shared --enable-threads=posix --with-system-zlib --with-isl --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch --disable-libssp --enable-gnu-unique-object --enable-linker-build-id --enable-lto --enable-plugin --enable-install-libiberty --with-linker-hash-style=gnu --enable-gnu-indirect-function --disable-multilib --disable-werror --enable-checking=release --enable-default-pie --enable-default-ssp --host=armv7l-unknown-linux-gnueabihf --build=armv7l-unknown-linux-gnueabihf --with-arch=armv7-a --with-float=hard --with-fpu=vfpv3-d16
Thread model: posix
gcc version 7.2.1 20180116 (GCC)

编译

按照官方的文档,编译总共分为4步。

  1. 安装编译需要的依赖包 ./install-deps.sh
  2. 使用cmake生成Makefile ./do_cmake.sh
  3. 使用Makefile编译源代码
  4. 安装包制作

由于本人使用的是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
2
3
4
5
6
7
8
9
Scanning dependencies of target ceph-dencoder
[ 0%] Building CXX object src/CMakeFiles/ceph-dencoder.dir/test/encoding/ceph_dencoder.cc.o
c++: internal compiler error: Killed (program cc1plus)
Please submit a full bug report,
with preprocessed source if appropriate.
See <https://github.com/archlinuxarm/PKGBUILDs/issues> for instructions.
make[2]: *** [src/CMakeFiles/ceph-dencoder.dir/build.make:64: src/CMakeFiles/ceph-dencoder.dir/test/encoding/ceph_dencoder.cc.o] Error 4
make[1]: *** [CMakeFiles/Makefile2:1609: src/CMakeFiles/ceph-dencoder.dir/all] Error 2
make: *** [Makefile:141: all] Error 2

由于我使用的是嵌入式设备,内存只有2g大小,并且没有配置swap,在编译过程中会遇到g++: internal compiler error: Killed (program cc1plus)错误,这种错误都是由于内存不足导致的。对于我的环境而言,只能通过增加swap来解决(关于增加swap的方法)。

问题解决了,就一路make下去吧。

参考&鸣谢