SPDK在CentOS7上制作rpm包
在SPDK的官网介绍了SPDK制作rpm包的流程SPDK RPM。本文实际操作一下通过SPDK源码制作rpm包,以spdk-20.10版本为例介绍spdk的rpm包制作流程。20.10版本和最新版本有些差别,但也大同小异。本文的流程和官网略有不同,都是自己踩坑试出来的,以下省去踩坑过程直接上干货。
*开发环境
系统:Centos7.8,内核:3.10.0-1127.el7.x86_64;安装rpm-build工具。
1.下载所需的软件包
制作SPDK的rpm需要准备一些软件包,包括以下几个:
可以使用wget下载:
[root@localhost root]# wget https://github.com/spdk/spdk/archive/v20.10.tar.gz
[root@localhost root]# wget https://vault.centos.org/8.5.2111/AppStream/Source/SPackages/dpdk-20.11-3.el8.src.rpm
[root@localhost root]# wget https://github.com/ninja-build/ninja/archive/v1.8.2.tar.gz#/ninja-build-1.8.2.tar.gz
[root@localhost root]# wget https://github.com/mesonbuild/meson/releases/download/0.49.2/meson-0.49.2.tar.gz
记得改下ninja包的名字:
[root@localhost root]# mv v1.8.2.tar.gz ninja-build-1.8.2.tar.gz
2.编译和安装DPDK的rpm包
SPDK依赖DPDK,CentOS7自带的版本是dpdk-18.11.8-1版本,这个版本和要编译的spdk-20.10版本不匹配。可以在官网上查询到spdk-20.10对应的DPDK需要大于20.08版本。SPDK v20.10 Release
所以我们需要一个版本大于dpdk-20.08的rpm包,通过搜索发现在CentOS8上默认带的是DPDK-20.11。虽然CentOS8上带了DPDK-20.11
版本的rpm包,但是这个包在CentOS 7
上是不能直接安装的,所以要将这个的源码包拿到CentOS 7上重新制作成CentOS 7的rpm包。
准备DPDK编译依赖包
- 先安装dpdk-20.11-3.el8.src.rpm:
[root@localhost root]# rpm -ivh dpdk-20.11-3.el8.src.rpm
[root@localhost root]# cd /root/rpmbuild/SPECS/
[root@localhost SPECS]# ls
dpdk.spec
安装后,DPDK的源码就在rpmbuild目录下了。
- 将ninja和meson包拷贝到
/root/rpmbuild/SOURCES
:
[root@localhost SPECS]# cp /root/ninja-build-1.8.2.tar.gz /root/rpmbuild/SOURCES
[root@localhost SPECS]# cp /root/meson-0.49.2.tar.gz /root/rpmbuild/SOURCES
- 修改dpdk.spec文件
这里有两个地方需要修改,一个是编译中会出现一个dpdk文档的错误,所以这里将编译文档的配置去掉,将dpdk.spec中的“-Denable_docs
”配置改为“false
”。同时添加gcc-c++的依赖。
[root@localhost SPECS]# vi dpdk.spec
...
BuildRequires: gcc, kernel-headers, zlib-devel, numactl-devel, gcc-c++
...
%meson --includedir=include/dpdk \
--default-library=shared \
-Ddisable_drivers="$disable_drivers" \
-Ddrivers_install_subdir=dpdk-pmds \
-Denable_docs=false \
-Dmachine=default \
-Dmax_ethports=32 \
-Dmax_numa_nodes=8 \
-Dtests=false
%meson_build
...
- 执行rpmbuild -bp检查依赖包
[root@localhost SPECS]# rpmbuild -bp dpdk.spec
error: Failed build dependencies:
gcc is needed by dpdk-20.11-3.el7.x86_64
gcc-c++ is needed by dpdk-20.11-3.el7.x86_64
kernel-headers is needed by dpdk-20.11-3.el7.x86_64
zlib-devel is needed by dpdk-20.11-3.el7.x86_64
numactl-devel is needed by dpdk-20.11-3.el7.x86_64
doxygen is needed by dpdk-20.11-3.el7.x86_64
python-devel is needed by dpdk-20.11-3.el7.x86_64
python-sphinx is needed by dpdk-20.11-3.el7.x86_64
python3-devel is needed by dpdk-20.11-3.el7.x86_64
rdma-core-devel >= 15 is needed by dpdk-20.11-3.el7.x86_64
- 使用yum安装缺少的依赖包
请注意,根据你的编译环境不同,可能缺的包是不一样的。所以安装你的环境缺的包即可,不一定和我的一样。
[root@localhost SPECS]# yum install -y gcc gcc-c++ kernel-headers zlib-devel numactl-devel doxygen python-devel python-sphinx python3-devel rdma-core-devel
制作DPDK的rpm
执行打包命令:
[root@localhost SPECS]# rpmbuild -ba dpdk.spec
执行成功后会在/root/rpmbuild/RPMS
目录生成对应的rpm包:
[root@localhost SPECS]# cd ../RPMS
[root@localhost SPECS]# ls
noarch x86_64
[root@localhost RPMS]# cd x86_64/
[root@localhost x86_64]# ls
dpdk-20.11-3.el7.x86_64.rpm dpdk-debuginfo-20.11-3.el7.x86_64.rpm dpdk-devel-20.11-3.el7.x86_64.rpm dpdk-tools-20.11-3.el7.x86_64.rpm
安装DPDK-20.11
[root@localhost x86_64]# rpm -ivh dpdk-20.11-3.el7.x86_64.rpm dpdk-devel-20.11-3.el7.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:dpdk-20.11-3.el7 ################################# [ 25%]
2:dpdk-devel-20.11-3.el7 ################################# [ 50%]
Cleaning up / removing...
3:dpdk-devel-18.11.8-1.el7_8 ################################# [ 75%]
4:dpdk-18.11.8-1.el7_8 ################################# [100%]
添加dpdk依赖目录
spdk编译时要找dpdk的依赖目录,dpdk-20.11版本中,这个目录没有了,所以要自己重新创建。
[root@localhost SPECS]# mkdir -p /usr/share/dpdk/x86_64-default-linuxapp-gcc
[root@localhost SPECS]# cd /usr/share/dpdk/x86_64-default-linuxapp-gcc
[root@localhost x86_64-default-linuxapp-gcc]# ln -s ../../../include/dpdk include
[root@localhost x86_64-default-linuxapp-gcc]# ln -s ../../../lib64 lib
[root@localhost x86_64-default-linuxapp-gcc]# cd /root/rpmbuild/SPECS/
安装了dpdk-20.11,可以开始编译spdk了。
3.制作SPDK的rpm包
准备spdk的源码文件
在spdk-20.10版本的源码中pkg
目录下可以找到一个spdk.spec
文件,这个就是SPDK用于制作rpm包的spec文件。
[root@localhost root]# tar zxf v20.10.tar.gz
[root@localhost root]# ls
spdk-20.10
[root@builder root]# cd spdk-20.10
[root@builder spdk-20.10]# ls
app autorun.sh CONFIG dpdk include isalbuild mk README.md
autobuild.sh autotest.sh configure dpdkbuild intel-ipsec-mb lib module scripts
autopackage.sh build CONTRIBUTING.md examples ipsecbuild LICENSE ocf shared_lib
autorun_post.py CHANGELOG.md doc go isa-l Makefile pkg test
[root@builder spdk-20.10]# ls pkg
spdk.spec
将spdk.spec
文件拷贝到SPECS
目录,将上面下载的v20.10.tar.gz
文件拷贝到SOURCES
目录。
[root@localhost root]# cp spdk-20.10/pkg/spdk.spec /root/rpmbuild/SPECS
[root@localhost root]# cp v20.10.tar.gz /root/rpmbuild/SOURCES
修改spdk的spec文件
这里有3个地方要改:
- 添加一行配置,取消python文件预处理;
- 缺少python3和ncurses-devel依赖包,添加一行加到spec文件中;
- 将–with-iscsi-initiator编译配置修改为–without-iscsi-initiator;
[root@localhost SPECS]# cd /root/rpmbuild/SPECS
[root@localhost SPECS]# vi spdk.spec
...
%global __os_install_post %(echo '%{__os_install_post}' | sed -e 's!/usr/lib[^[:space:]]*/brp-python-bytecompile[[:space:]].*$!!g')
...
BuildRequires: python3, ncurses-devel
...
%build
./configure --prefix=%{_usr} \
--disable-tests \
--disable-unit-tests \
--without-crypto \
--with-dpdk=/usr/share/dpdk/x86_64-default-linuxapp-gcc \
--without-fio \
--with-vhost \
--without-pmdk \
--without-rbd \
--with-rdma \
--with-shared \
--without-iscsi-initiator \
--without-vtune
...
检查并安装依赖包
和上面dpdk编译一样,在编译spdk之前要先安装一系列的依赖包,我们可以先用rpmbuild的准备阶段来检查需要那些依赖包,并逐一安装。
[root@localhost root]# cd /root/rpmbuild/SPECS
[root@localhost SPECS]# rpmbuild -bp ./spdk.spec
error: Failed build dependencies:
libiscsi-devel is needed by spdk-0:20.10-0.el7.x86_64
libaio-devel is needed by spdk-0:20.10-0.el7.x86_64
openssl-devel is needed by spdk-0:20.10-0.el7.x86_64
libuuid-devel is needed by spdk-0:20.10-0.el7.x86_64
ncurses-devel is needed by spdk-0:20.10-0.el7.x86_64
这里就不详述安装过程了。
打包rpm
直接执行rpmbuild -ba
[root@localhost SPECS]# rpmbuild -ba ./spdk.spec
成功后在/root/RPMS
目录中就可以看到编译出来的rpm包了。
[root@builder SPECS]# cd ../RPMS/
[root@builder RPMS]# ls
noarch x86_64
[root@builder RPMS]# cd x86_64/
[root@builder x86_64]# ls
spdk-devel-20.10-0.el7.x86_64.rpm spdk-20.10-0.el7.x86_64.rpm spdk-debuginfo-20.10-0.el7.x86_64.rpm
[root@builder x86_64]# cd ../noarch/
[root@builder noarch]# ls
spdk-tools-20.10-0.el7.noarch.rpm
至此spdk和dpdk的CentOS 7上的rpm包就制作完成了。在使用时一定要将dpdk和spdk这两个包同时安装,因为spdk对dpdk有版本依赖。
4.优化建议
在上面的编译过程中,采用了默认的配置,还裁剪了一些配置,如:“iscsi-initiator
”,这是因为CentOS7上的依赖包版本问题,就和DPDK在CentOS7上的版本问题是一样的。所以,如果你需要添加一些配置,通过调整spec文件的配置来重新制作符合自己需求的rpm包。可能也会遇到依赖包的版本问题,可以参考本文中提到的重编DPDK的rpm包类似的方法进行尝试。有问题欢迎交流。