Directorio de artículos
Entorno del sistema
Sistema operativo: Win10
Software de máquina virtual: VMware Workstation 16
Sistema de máquina virtual: Ubuntu22.04, número de CPU 8, memoria 4 G, número de tarjetas de red 4
Versión de DPDK para instalar: 22.07
Compilar e instalar DPDK
Primero instale algunos paquetes dependientes:
apt-get install meson
apt install python3-pyelftools
apt-get install pkg-config
Luego compila e instala DPDK:
wget https://fast.dpdk.org/rel/dpdk-22.07.tar.xz
tar xf dpdk-22.07.tar.xz
cd dpdk-22.07
meson build
cd build
ninja
ninja install
Después de ejecutar , todas las bibliotecas se instalarán en el directorio /usr/local/lib/x86_64-linux-gnu/
.
Los programas ejecutables y scripts se instalan en el directorio /usr/local/bin/
.
Para desinstalar, simplemente ejecute ninja uninstall
.
Compilación y confección
Al compilar de forma predeterminada, se compilarán controladores innecesarios de forma predeterminada, lo que hará que la compilación sea muy lenta. Como estamos en una máquina virtual, no se necesitan muchos controladores, por lo que podemos recortarlos. Específicamente, antes de ejecutar meson build,
-
Modifique el archivo
drivers/meson.build
y mantenga solo 'bus', 'mempool' y 'net' en los subdirectorios. -
Modificar el archivo
drivers/bus/meson.build
, mantener solo 'pci' y 'vdev' en los controladores. -
Modificar
drivers/mempool/meson.build
archivo, mantener solo 'anillo' y 'apilar' en los controladores. -
Modifique el archivo
drivers/net/meson.build
y mantenga solo 'e1000' en los controladores [porque la tarjeta de red de la máquina virtual usa el controlador e1000].
Luego ejecuta meson build
y verás la siguiente información:
Message:
===============
Drivers Enabled
===============
bus:
pci, vdev,
mempool:
ring, stack,
net:
e1000,
La compilación es muy rápida después de eso.
Compilar el controlador igb uio
git clone http://dpdk.org/git/dpdk-kmods
cd dpdk-kmods/linux/igb_uio
make
Compile igb_uio.ko.
Verifique que el entorno esté bien
Para verificar que nuestro entorno esté bien, primero compilamos el programa l2fwd:
cd examples/l2fwd
make
Luego cargue el controlador igb_uio:
cd dpdk-kmods/linux/igb_uio
modprobe uio
insmod igb_uio.ko intr_mode=legacy
Nota: Debe traer parámetros al cargar el controladorintr_mode=legacy
. Si no agrega parámetros, ¡habrá problemas!
Asigne algo de memoria de página grande [1G aquí]:
echo 512 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
Vincule dos tarjetas de red [la máquina virtual tiene 4 tarjetas de red, las dos últimas tarjetas de red las utiliza DPDK]:
ifconfig ens34 down
ifconfig ens35 down
dpdk-devbind.py -b igb_uio ens34 ens35
Ejecute el programa l2fwd:
cd examples/l2fwd/build/
./l2fwd -l 0-1 -- -p 0x3 -T 1
Si ve la siguiente información, significa que no hay ningún problema con el entorno DPDK.
EAL: Detected CPU lcores: 8
EAL: Detected NUMA nodes: 1
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: VFIO support initialized
EAL: Probe PCI driver: net_e1000_em (8086:100f) device: 0000:02:02.0 (socket 0)
EAL: Error reading from file descriptor 20: Input/output error
EAL: Probe PCI driver: net_e1000_em (8086:100f) device: 0000:02:03.0 (socket 0)
EAL: Error reading from file descriptor 6: Input/output error
TELEMETRY: No legacy callbacks, legacy socket not created
MAC updating enabled
Lcore 0: RX port 0 TX port 1
Lcore 1: RX port 1 TX port 0
Initializing port 0... EAL: Error enabling interrupts for fd 20 (Input/output error)
done:
Port 0, MAC address: 00:0C:29:0C:53:91
Initializing port 1... EAL: Error enabling interrupts for fd 6 (Input/output error)
done:
Port 1, MAC address: 00:0C:29:0C:53:9B
Checking link statusdone
Port 0 Link up at 1 Gbps FDX Autoneg
Port 1 Link up at 1 Gbps FDX Autoneg
L2FWD: entering main loop on lcore 1
L2FWD: -- lcoreid=1 portid=1
L2FWD: entering main loop on lcore 0
L2FWD: -- lcoreid=0 portid=0
Port statistics ====================================
Statistics for port 0 ------------------------------
Packets sent: 0
Packets received: 0
Packets dropped: 0
Statistics for port 1 ------------------------------
Packets sent: 0
Packets received: 0
Packets dropped: 0
Aggregate statistics ===============================
Total packets sent: 0
Total packets received: 0
Total packets dropped: 0
====================================================
^C
Signal 2 received, preparing to exit...
EAL: Error disabling interrupts for fd 20 (Input/output error)
Closing port 0... Done
EAL: Error disabling interrupts for fd 6 (Input/output error)
Closing port 1... Done
Bye...
Errores como EAL: Error al habilitar interrupciones para fd 20 (error de entrada/salida) se pueden ignorar.
Desvincular la tarjeta de red
Después de que DPDK ocupa las dos tarjetas de red ens34 y ens35, no están disponibles en ifconfig. Para restaurarlas, realice las siguientes operaciones.
Primero verifique los números de dispositivo PCI de las dos tarjetas de red:
root@ubuntu2204:~# lspci | grep Eth
02:00.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 01)
02:01.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 01)
02:02.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 01)
02:03.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 01)
Puede ver que los dos últimos números de dispositivo de la tarjeta de red son 02:02.0 y 02.03.0.
Luego desvincule los controladores igb_uio de las dos tarjetas de red y vincule el controlador e1000:
dpdk-devbind.py -u 02:02.0 02:03.0
dpdk-devbind.py -b e1000 02:02.0 02:03.0
Finalmente, abra la tarjeta de red:
ifconfig ens34 up
ifconfig ens35 up