机密虚机需要在云上支持OVS+DPDK,以实现网络加速功能。该功能基于openEuler-24.03-LTS-SP1完成开发调测。当前支持的网卡类型为:板载网卡-NIC 1 (SF221Q) 和1822网卡-SP580。
由于openEuler 24.03暂未适配MLNX_OFED驱动,故当前暂不支持DPDK接管cx4、cx5和cx6等Mellanox系列网卡。
yum install python3-pyelftools kernel-devel kernel-headers groff autoconf automake libtool -y
cd /home wget http://fast.dpdk.org/rel/dpdk-23.11.1.tar.xz tar -xvf dpdk-23.11.1.tar.xz
cd /home/dpdk-stable-23.11.1 meson --prefix=/usr --libdir=/usr/lib64 --bindir=/usr/bin --sbindir=/usr/sbin --includedir=/usr/include/dpdk -Dc_args="-O0 -g -fstack-protector-strong" -Dc_link_args="-g -Wl,-z,relro,-z,now,-z,noexecstack" -Denable_kmods=true -Dplatform=generic build
ninja -C build && ninja -C build install && ldconfig
pkg-config --modversion libdpdk
cd /home wget https://www.openvswitch.org/releases/openvswitch-3.2.1.tar.gz tar -zxvf openvswitch-3.2.1.tar.gz
cd /home/openvswitch-3.2.1 ./boot.sh ./configure CFLAGS="-march=armv8-a+lse+crc -fstack-protector-all -fstack-protector-strong " --prefix=/usr --sysconfdir=/etc --localstatedir=/var --libdir=/lib64 --enable-ssl --enable-shared --with-dpdk=shared
make -j`nproc`
make -j`nproc` install
ovs-vswitchd --version
cd /home/openvswitch-3.2.1 ovsdb-tool create /etc/openvswitch/conf.db cd rhel/ cp etc_init.d_openvswitch /etc/init.d/openvswitch chmod 755 /etc/init.d/openvswitch mkdir -p /var/log/openvswitch/ mkdir /var/run/openvswitch/ service openvswitch restart
OVS服务已启动。
vim /boot/efi/EFI/openEuler/grub.cfg
cat /proc/meminfo |grep -i huge
modprobe uio_pci_generic
ip a
ethtool -i enp151s0f0v0
dpdk-devbind.py -b uio_pci_generic --force 0000:97:00.2 dpdk-devbind.py -s
网卡已接管成功。
numactl -H
查询到Host上有4个NUMA节点。
service openvswitch start ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true other_config:dpdk-socket-mem="4096,4096,4096,4096" other_config:dpdk-lcore-mask="0x1F" other_config:pmd-cpu-mask="0x1E" other_config:dpdk-pmd-driver=/lib64/librte_pmd_hinic.so other_config:vhost-iommu-support=true service openvswitch restart
other_config:dpdk-socket-mem中4096的配置个数取决于Host上的NUMA节点数量。
cd /home vi ife_topology.sh
新建脚本中添加以下内容,根据实际修改下述内容中的BDF号。
#!/bin/bash tap_num=2 # 设置网络 set_normal(){ ovs-vsctl add-br br-int -- set bridge br-int datapath_type=netdev ovs-vsctl add-port br-int p-tap-dpdk -- set Interface p-tap-dpdk type=patch options:peer=p-tap-dpdk-int for i in `seq 1 $tap_num` do ovs-vsctl add-br br-ply$i -- set bridge br-ply$i datapath_type=netdev ovs-vsctl add-port br-ply$i tap$i -- set Interface tap$i type=dpdkvhostuserclient options:vhost-server-path="/tmp/tap$i" ovs-vsctl add-port br-ply$i p-tap$i-int -- set Interface p-tap$i-int type=patch options:peer=p-tap$i ovs-vsctl add-port br-int p-tap$i -- set Interface p-tap$i type=patch options:peer=p-tap$i-int done ovs-vsctl add-br br-dpdk -- set bridge br-dpdk datapath_type=netdev # 0000:97:00.0 即当前的BDF号 ovs-vsctl add-port br-dpdk p0 -- set Interface p0 type=dpdk options:dpdk-devargs=0000:97:00.0 options:n_rxq=10 ovs-vsctl add-port br-dpdk p-tap-dpdk-int -- set Interface p-tap-dpdk-int type=patch options:peer=p-tap-dpdk } # 清除网络 clean(){ for i in `ovs-vsctl list-br` do ovs-vsctl del-br $i done } case $1 in clean) clean ;; normal) set_normal ;; esac
支持以下两种方式运行脚本。
sh ife_topology.sh normal # 设置网络 sh ife_topology.sh clean # 清除网络
journalctl -xe
ovs-vsctl --no-wait set Open_vSwitch . other_config:iova-mode="PA"
sh ife_topology.sh normal
<cpu mode='host-passthrough'> <topology sockets='1' cores='2' threads='1'/> <numa> <cell id='0' cpus='0-1' memory='4' unit='GiB' memAccess='shared'/> </numa> </cpu>
<interface type='vhostuser'> <driver name='vhost' queues='4' iommu='on'/> <source type='unix' path='/tmp/tap1' mode='server'/> <target dev='tap1'/> <model type='virtio'/> </interface>
cd /home git clone https://gitee.com/openeuler/qemu.git -b qemu-8.2.0 cd qemu mkdir build && cd build ../configure --target-list=aarch64-softmmu make -j`nproc`
虚拟机配置文件中配置QEMU的路径为:“/home/qemu/build/qemu-system-aarch64”。
ip a