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包类似的方法进行尝试。有问题欢迎交流。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Angel老豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值