记录一次龙芯移植,当初花了我很多时间,移植ceph推荐使用新一点的系统,不然会缺少很多依赖包。我使用的系统是银河麒麟v10服务器版(龙芯),所以打包出来的是rpm包。
打rpm包较为简单的方法是找到srpm源码包,这样在别人spec文件的基础上进行修改,然后使用命令rpmbuild -ba xxx.spec就能方便的打出包了。
rpmbuild -ba xxx.spec
我喜欢在fedora koji上找srpm包,他们的包还是比较全的(毕竟我是小菜鸡,写不了spec文件),这个网站百度直接搜就能找到,还是挺靠前的,搜索框输入ceph*,找到对应的版本,把他的src.rpm下载下来就好。下面也有已经打好的rpm包,显然没有龙芯的,安心移植就行。
下载下来之后使用命令 rpm -ivh xxx.src.rpm安装
rpm -ivh xxx.src.rpm
说是安装其实进行的是解压的操作,解压到~/rpmbuild文件夹下,所以普通用户执行这个会解压在/home/用户名下,root用户解压会在/root下,因为我这是一次性系统,装完系统干完移植后就装别的了,所以直接用的root用户移植。
进入SPEC目录,先不急着rpmbuild,进入SPEC目录,先对spec文件进行前期的修改,一般来说主要是看那些if判断,首先是架构相关的,这是他支持的cpu架构
ExclusiveArch: x86_64 aarch64 ppc64 ppc64le
因为我移植的是龙芯,反正看见x86,aarch64之类,在他们后面加个mips,是否加el看具体cpu,3A4000是mips64el。
ExclusiveArch: x86_64 aarch64 ppc64 ppc64le mips64el
然后是一些系统相关的,他会用一些宏来判断是什么系统
%if 0%{?fedora} || 0%{?rhel}
麒麟也不在里面,得给他加上
%if 0%{?fedora} || 0%{?rhel} || 0%{?kylin}
把两千多行spec都过一遍,把这些if判断都改了,顺便提一句如果是判断rhel大于等于8的,也能把kylin加上,v10的内核版本能大致对上rhel8
然后就能rpmbuild的了,正常的话会报一堆依赖缺失,把他们都一个个yum install了,经过非常机械化的劳动之后(新时代民工是这样的),会有几个yum源里没有包,这时候可以去龙芯ftp上看看,他们的网址是这个Index of /os/loongnix/1.0/oshttp://ftp.loongnix.cn/os/loongnix/1.0/os/或者也能在repo里把他加入baseurl,这样就能直接yum安装了,如果这样还是没有,那就需要你再移植依赖了,恭喜恭喜。。。
反正一通安装完依赖后总算开编了,由于龙芯性能非常的拉跨,编译过程非常久,编了四五个小时在55%的时候报错了,因为使用rpmbuild会把build目录删除,然后重新解压编译,所以非常耗时,为了缩短时间,需要修改下spec文件,搜索一下%build找到build过程,往下翻,发现是使用cmake构建的
mkdir build
cd build
%if 0%{?rhel} == 7
%global cmake cmake3
%endif
%{cmake} .. \
build过程中test是非常耗时的,使用这个宏把它关掉-DWITH_TESTS=OFF
%{cmake} .. \
-DWITH_TESTS=OFF \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
这样编起来就快多了,大约节约了一半时间,(现在想想完全可以进入报错的子模块调用makefile单独make,只能说当初太年轻了,笨比的每次改完重新rpmbuild)
然后回头看一下报错
cd /root/rpmbuild/BUILD/ceph-15.2.13/build/src/test && /usr/bin/cmake -E cmake_link_script CMakeFiles/unittest_log.dir/link.txt --verbose=1
/usr/bin/c++ -O2 -g -mabi=64 -march=loongson3a -fno-delete-null-pointer-checks -Wall -fno-strict-aliasing -fsigned-char -Wtype-limits -Wignored-qualifiers -Wpointer-arith -Werror=format-security -Winit-self -Wno-unknown-pragmas -rdynamic -O2 -g -mabi=64 -march=loongson3a -fno-delete-null-pointer-checks -Wno-unknown-pragmas -Wnon-virtual-dtor -Wno-ignored-qualifiers -ftemplate-depth-1024 -Wstrict-null-sentinel -Woverloaded-virtual -fno-new-ttp-matching -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fstack-protector-strong -fdiagnostics-color=auto -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free -O2 -g -DNDEBUG -latomic -pie CMakeFiles/unittest_log.dir/__/log/test.cc.o -o ../../bin/unittest_log -Wl,-rpath,/root/rpmbuild/BUILD/ceph-15.2.13/build/lib ../../lib/libgmock_main.so ../../lib/libgmock.so ../../lib/libgtest.so -lpthread /usr/lib64/libldap.so /usr/lib64/liblber.so -ldl ../../lib/libglobal.a ../../lib/libgmock.so ../../lib/libgtest.so ../../lib/libceph-common.so.2 ../../lib/libjson_spirit.a ../../lib/libcommon_utf8.a ../../lib/liberasure_code.a ../../lib/libcrc32.a ../../lib/libarch.a /usr/lib64/libboost_thread.so /usr/lib64/libboost_chrono.so /usr/lib64/libboost_atomic.so /usr/lib64/libboost_system.so /usr/lib64/libboost_random.so /usr/lib64/libboost_program_options.so /usr/lib64/libboost_date_time.so /usr/lib64/libboost_iostreams.so /usr/lib64/libboost_regex.so -lstdc++fs ../../lib/libfmt.so.5.3.1 -Wl,--as-neede