Cómo cambiar el orden de las tarjetas de red (eth1 <-> eth0) en linux

20

¿Hay alguna forma de intercambiar interfaces de red ( eth1 <-> eth0 ) después de la instalación del sistema?

Mi nueva tarjeta Debian 6.0 instala la tarjeta de red PCI asignada como " eth0 " y las placas base integran el dispositivo de red como " eth1 " por defecto. El problema es que quiero usar el dispositivo integrado como interfaz de red predeterminada ( eth0 ).

Ya edité:

/etc/udev/rules.d/70-persistent-net.rules

para intercambiar los nombres y todo parece estar bien y la red funciona, pero los programas todavía están tratando de usar la tarjeta de red PCI (que ahora es " eth1 ") como la interfaz predeterminada. Por ejemplo, iftop ahora intenta usar " eth1 " como dispositivo predeterminado, ya que usó " eth0 " antes del intercambio.

¿Es esto puramente un problema de software ya que las aplicaciones están tratando de usar el primer dispositivo encontrado como dispositivo predeterminado a pesar de su nombre de interfaz o hay alguna forma de solucionarlo configurando el sistema operativo?


editar: escribí una pequeña aplicación para imprimir iflist y el dispositivo PCI ( eth1 ) apareció antes de " eth0 ". Alguna idea de cómo cambiar el orden del dispositivo.


editar: Encontré un hilo sobre el mismo problema e intenté todo lo que sugirieron y ninguna de las soluciones funciona, excepto para intercambiar los nombres "virtualmente".

Athabaska Dick
fuente
Solo para tener en cuenta, editar /etc/udev/rules.d/70-persistent-net.rules y un reinicio hicieron el trabajo por mí
Xosofox

Respuestas:

18

Estoy respondiendo a mi propia pregunta ahora porque finalmente encontré una solución para este problema.

Descubrí que es posible reordenar los dispositivos descargando los controladores y luego cargándolos en el orden correcto.

Primer método (fuerza bruta):

Entonces, el primer método que se me ocurrió fue simple: fuerza bruta, la recarga del controlador con el script init.d.

El siguiente guión de inicio está diseñado para Debian 6.0, pero el mismo principio debería funcionar en casi cualquier distribución usando los guiones de inicio adecuados.

#!/bin/sh -e

### BEGIN INIT INFO
# Provides:          reorder-nics
# Required-Start:
# Required-Stop:
# Default-Start:     S
# Default-Stop:
# Short-Description: Reloads the nics in correct order
### END INIT INFO

#
# This script should reload the nic drivers in corrected order.
# Basically it just unloads and then loads the drivers in different order.
#

echo "Reloading NICs!"

# unload the drivers
modprobe -r driver_0        # eth0 nic interface
modprobe -r driver_1        # eth1 nic interface

# load the drivers in corrected order
modprobe driver_1
modprobe driver_0

#EOF

Luego, el script debe agregarse al directorio de nivel de ejecución adecuado. Esto se puede hacer fácilmente en Debian con el comando " update-rc.d ". Por ejemplo:update-rc.d reorder-nics start S


Segundo método (mejor creo):

También encontré una forma un poco más elegante (al menos para los sistemas Debian y Ubuntu).

Primero, asegúrese de que el núcleo no cargue automáticamente los controladores NIC. Esto se puede hacer creando un archivo de lista negra en /etc/modprobe.d/. Creé un archivo llamado " disable-nics.conf". Tenga en cuenta que los archivos /etc/modprobe.d/deben tener .confsufijo. Además, nombrar módulos en /etc/modprobe.d/blacklist.confno afecta la carga automática de módulos por el núcleo, por lo que debe crear su propio archivo.

# Disable automatic loading of kernel driver modules
# Disable NIC drivers

blacklist driver_0     # eth0 by default
blacklist driver_1     # eth1 by default

Luego ejecute ' depmod -ae ' como root

Recrea tu initrd con ' update-initramfs -u '

Y finalmente agregue los nombres de los controladores en orden corregido en el archivo / etc / modules .

# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
# Parameters can be specified after the module name.

# drivers in wanted order
driver_1    # this one should be loaded as eth0
driver_0    # this one should be loaded as eth1

Los cambios deben entrar en vigencia después del próximo arranque.

Sin embargo, no es necesario reiniciar; Es fácil cambiar los dispositivos con el siguiente comando (como root, por supuesto):

modprobe -r driver_0; modprobe -r driver_1; modprobe driver_1; modprobe driver_0

Algunos enlaces útiles que encontré mientras buscaba la solución:

Athabaska Dick
fuente
2
+1 Definitivamente mereces más de un voto para eso.
bahamat
Tengo un problema similar: tengo una NIC integrada y, a veces, ejecuto un programa VPN que crea otra interfaz. La interfaz VPN siempre parece tener prioridad, pero no sé por qué. Solo quiero que se use en circunstancias muy raras (quiero que la aplicación que lo usa tenga que especificar la interfaz VPN). ¿Algunas ideas? ^ _ ^ Probablemente publicaré una nueva pregunta muy pronto de todos modos.
Expiación limitada el
2

Puede usar el netdev=parámetro de línea de comando del kernel (debe pasarlo al kernel en grub) para indicar al kernel que vincule una irq dada a una interfaz dada, por ejemplo:netdev=irq=2,name=eth0

Frederik Deweerdt
fuente
1
Arranqué mi caja con las modificaciones de configuración de grub y todavía obtengo eth1 como dispositivo predeterminado en muchas aplicaciones. Comprobé el dmesg para obtener información de la red y Y dice que el NIC integrado tiene todavía ' eth1 ' como ifname: forcedeth 0000:00:04.0: ifname eth1, PHY OUI 0x57d @ 1, addr 40:40:00:40:40:40. Este no es un problema demasiado serio, pero realmente me molesta porque la tarjeta integrada es de 1 gb y debería ser el dispositivo predeterminado.
Athabaska Dick
1
Ahora he tratado de usar nameif para cambiar los nombres de la interfaz de red, pero parece que hace lo mismo que udev. Sin cambios en el orden "real" de la NIC. También intenté cambiar la ubicación física de las PCI NIC pero tampoco me ayudó. El NIC integrado tiene IRQ 22 y el PCI NIC tiene IRQ 17, por lo que parece que el núcleo los está ordenando por IRQ y el usuario no puede cambiar ese hecho de ninguna manera. ¿Alguna idea nueva?
Athabaska Dick
1

Es probable que deba acceder a los archivos de configuración de cada programa afectado y cambiar 'eth1' a 'eth0'. Estos programas predeterminados se configuran cuando se instalan o se ejecutan por primera vez con las NIC detectadas actualmente.

Utilizo Linux como enrutador y tuve este problema al usar scripts. Ahora tengo un fragmento buen guión llamado netconfesa fuente para que en cualquier otro script cada vez que necesito utilizar nombres de NIC, este archivo me da una ubicación central para especificarlos (es decir LAN_IFACE=eth0, WAN_IFACE=eth1, etc.)

LawrenceC
fuente
2
Parece que muchos programas solo dependen de la función if_nameindex () del encabezado <net / if.h> . Simplemente usan el primer dispositivo que encuentran e ignoran totalmente los nombres de las interfaces. Puedo ver por qué se hace así, es mucho más fácil usar el primer dispositivo encontrado que ordenar los nombres.
Athabaska Dick
1

No puede cambiar qué interfaz se usa por defecto en aplicaciones como iftop. Llaman a la función de biblioteca C if_nameindexy usan el primer elemento en la matriz devuelta por defecto. GNU libc's if_nameindexen Linux es una delgada envoltura alrededor del SIOCGIFCONFioctl . Eso devuelve las interfaces en un orden fijo, según el orden en que se inicializaron los controladores de red y el orden en que cada controlador detectó cada dispositivo.

Si realmente no desea tener que pasar -ia iftopprogramas similares, puede crear un pequeño contenedor if_nameindexque reordene los elementos en la lista devuelta, con LD_PRELOAD. Llamaría a eso muchos más problemas de lo que vale.

Gilles 'SO- deja de ser malvado'
fuente
También logré identificar el "problema" en if_nameindexfunción. Quizás solo lo deje por ahora. Afortunadamente, algunas aplicaciones realmente comprueban el nombre de la interfaz. Por otro lado, algunas aplicaciones ni siquiera tienen opciones de configuración predeterminadas, así que solo tengo que usar la opción -i. Me preguntaba por qué la opción de carga del kernel netdev=irq=22,name=eth0no funciona. Pensé que debería ser posible cambiar el orden de NIC al inicio del kernel.
Athabaska Dick
De un vistazo rápido a la fuente del núcleo (la for_each_netdevmacro), las interfaces se enumeran en el orden en que se cargan los controladores (aproximadamente). Es probable que sus interfaces utilicen controladores diferentes, por lo que tendrá que organizar la carga de los controladores en el orden que desee. Esperaría que esto sea difícil, especialmente si desea que su ajuste funcione en una actualización del kernel.
Gilles 'SO- deja de ser malvado'
1

Si tienen controladores diferentes, al menos en el día anterior podría incluir uno de los archivos de configuración del módulo:

alias eth0 driver1
alias eth1 driver2

Eso es un conocimiento bastante antiguo, pero puede ayudar.

Aaron D. Marasco
fuente
-1

Eche un vistazo al paquete 'ifrename'. Esto le permite cambiar el nombre de los nombres de la interfaz en función de una variedad de información, como la dirección MAC de la interfaz, el controlador, la interrupción ..., configurada en un archivo / etc / iftab.

Algunos ejemplos de la página del manual:

   # This is a comment
   eth2      mac 08:00:09:DE:82:0E
   eth3      driver wavelan interrupt 15 baseaddress 0x390
   eth4      driver pcnet32 businfo 0000:02:05.0
   air*      mac 00:07:0E:* arp 1
   myvpn     SYSFS{address} 00:10:83:* SYSFS{type} 1
   bcm*      SYSFS{device} 0000:03:00.0 SYSFS{device/driver} bcm43xx
   bcm*      SYSFS{..} 0000:03:00.0 SYSFS{../driver} bcm43xx
Ben White
fuente
Bienvenido a U&L, ¿puede proporcionarnos una respuesta completa, no solo sugerencias? No debe publicar con algo como "hay una página de manual ...".
Archemar