前言

在工作中遇到需要在openeuler 系统上编译ovs-dpdk。需要创建docker镜像,在宿主机X86上运行 arm64的docker 容器。

一、openuler是什么?

openEuler(欧拉) 是xxx主导、开源社区维护的 企业级 Linux 发行版,类似:
CentOS / RHEL(定位接近)
Debian/Ubuntu(面向服务器)
但更偏 国产化、云基座、ARM 服务器
它由 openEuler 开源社区开发,系统内核、工具链、软件包都在社区维护,目标是:
让它成为中国服务器、云计算、数据库、网络虚拟化的标准操作系统平台。

二、docker 镜像

1.下载docker 镜像

#获取openeuler 的docker 镜像
wget https://repo.openeuler.org/openEuler-22.03-LTS-SP4/docker_img/aarch64/openEuler-docker.aarch64.tar.xz
docker load -i openEuler-docker.aarch64.tar.xz
docker tag XXX hub.xxxxx.com/npl_nad/openeuler-22.03-lts-sp4:latest

2.添加qemu-aarch64-static用户态指令翻译二进制文件

代码如下(示例):

cat > openeuler-x86_64-aarch64.dockerfile << _EOF_
FROM hub.xxxxxx.com/npl_nad/qemu-user-static:x86_64-aarch64 AS qemu
FROM hub.xxxxxx.com/npl_nad/openeuler-22.03-lts-sp4:latest
COPY --from=qemu /usr/bin/qemu-aarch64-static /usr/bin
_EOF_

docker build . -f openeuler-x86_64-aarch64.dockerfile -t hub.xxxxxxxxxx.com/npl_nad/openeuler-22.03-lts-sp4:qemu-static-aarch64
docker push hub.xxxxxxx.com/npl_nad/openeuler-22.03-lts-sp4:qemu-static-aarch64

3.编译环境Host/Gitlab Runer注册binfmt_misc,支持跨架构用户态指令翻译 (在宿主机器上执行)

Linux 内核的 binfmt_misc 机制允许系统识别非本机架构的二进制文件(如 x86_64 主机上的 arm 程序),并自动调用 qemu-user-static 进行模拟执行。

docker run --privileged hub.xxxxx.com/npl_nad/qemu-user-static:register --reset

到此之后,在X86上可以运行dcoker 中arm6的环境。qemu-user-static:x86_64-aarch64 等镜像文件,可以根据自己的需求搞一下。

三、编写docker file 文件

根据自己项目需要,基于aarch64 openEuler基础镜像,安装必要依赖。我这里编译dpdk-22.11.2.

# FROM 获取基础镜像,docker镜像是一层层叠加的
FROM hub.xxxxxx.com/npl_nad/openeuler-22.03-lts-sp4:qemu-static-aarch64

RUN dnf clean all && dnf makecache && \
    dnf install -y \
        cmake make automake pkgconfig git rpm-build \
	libtool autoconf automake \
        scl-utils scl-utils-build gcc-toolset-12-gcc gcc-toolset-12-gcc-c++ \
        libhugetlbfs numactl numactl-devel \
        libpcap-devel zlib-devel libnl3-devel rdma-core-devel \
        python3 python3-pip \
        meson ninja-build \
	libarchive-devel libbsd-devel jansson-devel openssl-devel && \
    pip3 install pyelftools && \
    dnf clean all && rm -rf /var/cache/dnf/*


ENV PATH=/opt/openEuler/gcc-toolset-12/root/usr/bin/:$PATH \
    LD_LIBRARY_PATH=/opt/openEuler/gcc-toolset-12/root/usr/lib64/:$LD_LIBRARY_PATH \
    PKG_CONFIG_PATH=/usr/lib64/pkgconfig/:$PKG_CONFIG_PATH

WORKDIR /usr/local/src
COPY dpdk-stable-22.11.2.tar.xz .

RUN tar xf dpdk-stable-22.11.2.tar.xz && \
    rm dpdk-stable-22.11.2.tar.xz

WORKDIR /usr/local/src/dpdk-stable-22.11.2

# 设置环境变量,指定架构,避免 CPU 自动探测失败
ENV RTE_ARCH=arm64
ENV RTE_MACHINE=generic

RUN meson -Ddisable_drivers="net/sfc,common/sfc_efx,vdpa/sfc" \ 
          -Dbuildtype=release \ 
          -Dmachine=generic \
          build  && \
    ninja -C build install && \
    export PKG_CONFIG_PATH=/usr/lib64/pkgconfig && \
    mkdir -p /usr/lib64/pkgconfig && \
    cp -rf /usr/local/lib64/pkgconfig/*.pc /usr/lib64/pkgconfig && \
    rm -rf /usr/local/src/dpdk-stable-22.11.2

WORKDIR /root
CMD ["/bin/bash"]

创建docker 容器:

docker build . -f aarch64-openeuler-builder.dockerfile -t hub.xxxxxx.com/npl_nad/dpdk-22.11.2:aarch64-openeuler-v3

查看docker 镜像文件
在这里插入图片描述
运行一个docker 容器

 docker run --name full-dpdk22.11.2-builder     -v /home/zhangyu/git/docker-bulid-ovs/ovs-dpdk-gw:/work/ovs-dpdk-gw     -it hub.xxxxxxxxx.com/npl_nad/dpdk-22.11.2:aarch64-openeuler-v3     /bin/bash

查看docker 容器

docker container ls

在这里插入图片描述
进入docker 容器

dcoker exec -it full-dpdk22.11.2-builder bash

三、编译ovs-2.17.1

进入docker 容器在docker 容器编译ovs,编译rpm包。

1 ovs 编译依赖安装

dnf install -y     python3-sphinx     checkpolicy     desktop-file-utils     gcc-c++     graphviz     groff     python3-devel     selinux-policy-devel     unbound     unbound-devel
dnf install -y libcap-ng-devel

2 ovs 开始编译

./boot.sh
./configure --prefix=/usr --localstatedir=/var --sysconfdir=/etc --with-dpdk=static  CFLAGS="-D__in6_u=in6_u  -D__u6_addr32=u6_addr32"
make -j$(nproc)
make install

3 ovs 编译 rpm 包

 make rpm-fedora   RPMBUILD_OPT="--with dpdk --without check --without debugsource"   CFLAGS='-fPIC -D__in6_u=in6_u -D__u6_addr32=u6_addr32'   CXXFLAGS='-fPIC -D__in6_u=in6_u -D__u6_addr32=u6_addr32'   LDFLAGS='-fPIC'   -j$(nproc)

4 编译 遇到问题

# 1 dpdk静态连接和ovs动态连接问题
	增加 -fPIC 标价解决
# 2 in6_u u6_addr32 定义问题
		-D__in6_u=in6_u -D__u6_addr32=u6_addr32 解决
# 3 编译rpm 
    在 openvswitch-fedora.spec.in 
    增加 %undefine _enable_debug_packages 解决

四、相关学习连接

docker学习
rpm学习

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐