¿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".
fuente
Respuestas:
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.
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.conf
sufijo. Además, nombrar módulos en/etc/modprobe.d/blacklist.conf
no afecta la carga automática de módulos por el núcleo, por lo que debe crear su propio archivo.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 .
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):
Algunos enlaces útiles que encontré mientras buscaba la solución:
fuente
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
fuente
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.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
netconf
esa 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 decirLAN_IFACE=eth0
,WAN_IFACE=eth1
, etc.)fuente
No puede cambiar qué interfaz se usa por defecto en aplicaciones como
iftop
. Llaman a la función de biblioteca Cif_nameindex
y usan el primer elemento en la matriz devuelta por defecto. GNU libc'sif_nameindex
en Linux es una delgada envoltura alrededor delSIOCGIFCONF
ioctl . 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
-i
aiftop
programas similares, puede crear un pequeño contenedorif_nameindex
que reordene los elementos en la lista devuelta, conLD_PRELOAD
. Llamaría a eso muchos más problemas de lo que vale.fuente
if_nameindex
funció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 kernelnetdev=irq=22,name=eth0
no funciona. Pensé que debería ser posible cambiar el orden de NIC al inicio del kernel.for_each_netdev
macro), 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.Si tienen controladores diferentes, al menos en el día anterior podría incluir uno de los archivos de configuración del módulo:
Eso es un conocimiento bastante antiguo, pero puede ayudar.
fuente
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:
fuente