【无标题】
·
前言
在工作中遇到需要在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 解决
四、相关学习连接
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐


所有评论(0)