Herramienta de gestión de red de compilación cruzada iproute2
El comando ip integrado en busybox no es compatible con netns y bridge, así que trasplanté uno por mí mismo consultando la guía de documentos web.
Referencia: https://blog.csdn.net/u013401853/article/details/71126645
Lanzamiento: 03 de mayo de 2017 17:04:58 Constante de Planck
-
1) Descarga el código fuente
-
Página web oficial:
- https://www.kernel.org/pub/linux/utils/net/iproute2/ desde la versión 3.1.0
- iproute2-3.1.0.tar.bz2 23 de noviembre de 2011 19:11 395K
- iproute2-3.19.0.tar.xz 10 de febrero de 2015 23:15 444K
- iproute2-4.11.0.tar.xz 01-mayo-2017 16:33 642K
- iproute2-4.13.0.tar.xz 05-Sep-2017 16:41 655K
- iproute2-4.19.0.tar.gz 23-Oct-2018 17:19 939K
- iproute2-4.20.0.tar.xz 07-ene-2019 18:28 690K
-
Versión inferior
-
-
2) Descomprime y modifica Makefile
- Modificar CC en Makefille como un compilador cruzado
CC = /usr/arm/toolchain/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-gcc
- Constantes de Planck / PS : como solo necesito el comando ip, modifique la línea 38 para compilar solo la herramienta ip SUBDIRS = ip
- Acerca de la versión 4.19.0
// 修改 Makefile --- 交叉编译器 CC = /usr/arm/toolchain/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-gcc // 修改config.mk --- 交叉编译器 AR:=/usr/arm/toolchain/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-ar CC:=/usr/arm/toolchain/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-gcc // 修改config.mk --- 去除对SELinux和CAP的支持 HAVE_SELINUX:= #LDLIBS += -lselinux #CFLAGS += -DHAVE_SELINUX CFLAGS += -DNEED_STRLCPY HAVE_CAP:= #CFLAGS += -DHAVE_LIBCAP #LDLIBS += -lcap
- Modificar CC en Makefille como un compilador cruzado
-
3) hacer
make LDFLAGS=-static ## 静态连接,否则,运行时报缺少.so文件
PD :
- El proceso de creación no será completamente exitoso, pero la ip requerida ha sido compilada, y la ip en el directorio ip es el programa ejecutable de ip requerido.
- La versión descargada 4.19 requiere que el compilador tenga selinux.h y capacidad.h (gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabi no es compatible), así que descargué la versión 4.13 y la compilé
-
4) Compilar la resolución de errores
- Debido al compilador gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabi, la función establece conflictos de declaración, de la siguiente manera:
Solución: Edite ./include/namespace.hy use la declaración de bits / sched.hIn file included from utils.c:36:0: ../include/namespace.h:35:19: error: static declaration of ‘setns’ follows non-static declaration static inline int setns(int fd, int nstype) ^~~~~ In file included from /usr/arm/toolchain/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabi/arm-linux-gnueabi/libc/usr/include/sched.h:43:0, from ../include/namespace.h:4, from utils.c:36: /usr/arm/toolchain/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabi/arm-linux-gnueabi/libc/usr/include/bits/sched.h:91:12: note: previous declaration of ‘setns’ was here extern int setns (int __fd, int __nstype) __THROW;
#ifndef HAVE_SETNS extern int setns (int __fd, int __nstype) __THROW; /* static inline int setns(int fd, int nstype) { ... } */ #endif /* HAVE_SETNS */
-
libmnl requerido para soporte de errores
lib ## 编译 iproute2-4.19/lib目录 libnetlink.c:120:2: warning: #warning "libmnl required for error support" [-Wcpp] #warning "libmnl required for error support"
Compruebe el código fuente de lib / libnetlink.c. Si la macro HAVE_LIBMNL no está definida, aparecerá la advertencia anterior. Puede descargar libmnl del sitio web oficial http://ftp.netfilter.org/pub/libmnl/ y compilarlo. Esta prueba no se hace aquí.
-
Cuando está vinculado estáticamente, la ejecución
ip link add veth0a type veth peer name veth0b
falla# 在 CentOS 7 中静态链接,出现同样问题,侧面佐证静态链接不可行; # 在 ./ip/iplink.c 中加入跟踪代码,发现问题出在 dlh = BODY = dlopen(NULL, RTLD_LAZY) 时为(明显地,必须是动态链接)
Compile dinámicamente, copie libdl.so.2.23 en la máquina de destino y ln -s como libdl.so.2, ejecute ldd, de la siguiente manera:
/root # ldd ./ip linux-vdso.so.1 (0x7ee1e000) libdl.so.2 => /lib/libdl.so.2 (0x76fa0000) libc.so.6 => /lib/libc.so.6 (0x76eb3000) /lib/ld-linux.so.3 (0x76fb3000)
Entonces, la ejecución es
ip link add veth0a type veth peer name veth0b
exitosa.
- Debido al compilador gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabi, la función establece conflictos de declaración, de la siguiente manera:
-
5) Coloque el programa ip en el directorio ip de la placa para ver si se puede ejecutar
Puede correr directamente
Constantes de Planck / PS : Solía pensar que la versión de iproute2 correspondiente al kernel debe descargarse para que funcione normalmente, pero compilé la última versión de iiproute y la puse en la placa para que se ejecutara.
# 动态链接时,报告缺少.so文件 /root # ./ip --help ./ip: error while loading shared libraries: libdl.so.2: cannot open shared object file: No such file or directory
-
referencia: