Como mudar a ordem das placas de rede (eth1 <-> eth0) no linux

20

Existe alguma maneira de trocar as interfaces de rede ( eth1 <-> eth0 ) após a instalação do sistema.

Minha novíssima Debian 6.0 instala a placa de rede PCI atribuída como " eth0 " e o dispositivo de rede integrado às placas-mãe como " eth1 " por padrão. O problema é que eu quero usar o dispositivo integrado como interface de rede padrão ( eth0 ).

Eu já editei:

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

para trocar os nomes e tudo parece estar correto e a rede está funcionando, mas os programas ainda estão tentando usar a placa de rede PCI (que agora é " eth1 ") como a interface padrão. Por exemplo, o iftop agora tenta usar " eth1 " como dispositivo padrão, pois usou " eth0 " antes da troca.

Isso é um problema puramente de software, pois os aplicativos estão tentando usar o primeiro dispositivo encontrado como dispositivo padrão, apesar da nomenclatura da interface ou existe alguma maneira de corrigir isso configurando o sistema operacional?


edit: escrevi um pequeno aplicativo para imprimir iflist e o dispositivo PCI ( eth1 ) surgiu antes de " eth0 ". Alguma idéia de como trocar a ordem do dispositivo.


edit: Encontrei um tópico sobre o mesmo problema e tentei tudo o que eles sugeriram e nenhuma das soluções está funcionando, exceto pela troca dos nomes "virtualmente".

Athabaska Dick
fonte
Apenas a nota, edição /etc/udev/rules.d/70-persistent-net.rules e uma reinicialização fez o trabalho para mim
Xosofox

Respostas:

18

Estou respondendo à minha própria pergunta agora porque finalmente encontrei uma solução alternativa para esse problema.

Descobri que é possível reordenar os dispositivos descarregando os drivers e carregando-os na ordem correta.

Primeiro método (força bruta):

Portanto, o primeiro método que criei foi simples: forçar o recarregamento do driver com o script init.d.

O script init a seguir foi feito sob medida para o Debian 6.0, mas o mesmo princípio deve funcionar em praticamente qualquer distribuição usando scripts init.d apropriados.

#!/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

Em seguida, o script deve ser adicionado ao diretório de nível de execução apropriado. Isso pode ser feito facilmente no Debian com o comando " update-rc.d ". Por exemplo:update-rc.d reorder-nics start S


Segundo método (melhor eu acho):

Eu também achei uma maneira um pouco mais elegante (pelo menos para os sistemas Debian e Ubuntu).

Primeiro Verifique se o kernel não carrega automaticamente os drivers da NIC. Isso pode ser feito criando um arquivo de lista negra no /etc/modprobe.d/. Eu criei um arquivo chamado " disable-nics.conf". Observe que os arquivos em /etc/modprobe.d/devem ter .confsufixo. A nomeação de módulos /etc/modprobe.d/blacklist.conftambém não afeta o carregamento automático de módulos pelo kernel, portanto você precisa criar seu próprio arquivo.

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

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

Em seguida, execute ' depmod -ae ' como root

Recrie seu initrd com ' update-initramfs -u '

E, finalmente, adicione os nomes dos drivers na ordem corrigida no arquivo / 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

As alterações devem entrar em vigor após a próxima inicialização.

A reinicialização não é necessária; é fácil alternar os dispositivos com o seguinte comando (como root, é claro):

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

Alguns links úteis que encontrei ao pesquisar a solução:

Athabaska Dick
fonte
2
+1 Você definitivamente merece mais do que apenas um voto positivo para isso.
bahamat
Tenho um problema semelhante: tenho uma NIC integrada e, às vezes, executo um programa VPN que cria outra interface. A interface da VPN sempre parece ter precedência, mas não sei por quê. Eu só quero que ele seja usado em circunstâncias muito raras (quero que o aplicativo que o usa tenha que especificar a interface da VPN). Alguma ideia? ^ _ ^ Provavelmente postarei uma nova pergunta em breve.
Expiação limitada
2

Você pode usar o netdev=parâmetro de linha de comando do kernel (você precisa passá-lo para o kernel no grub) para instruir o kernel a vincular um dado irq a uma determinada interface, por exemplo:netdev=irq=2,name=eth0

Frederik Deweerdt
fonte
11
Inicializei minha caixa com as modificações de configuração do grub e ainda estou recebendo o eth1 como o dispositivo padrão em muitos aplicativos. Eu verifiquei o dmesg para informações de rede e e diz que o NIC integrado ainda tem ' eth1 ' como ifname: forcedeth 0000:00:04.0: ifname eth1, PHY OUI 0x57d @ 1, addr 40:40:00:40:40:40. Este não é um problema muito sério, mas realmente atrapalha minhas engrenagens, porque o cartão integrado é de 1GB e deve ser o dispositivo padrão.
Athabaska Dick
11
Agora tentei usar o nameif para alterar os nomes da interface de rede, mas parece que ele faz o mesmo que o udev. Nenhuma alteração na ordem da NIC "real". Também tentei alterar a localização física das PCI NICs, mas também não ajudou. A NIC integrada possui IRQ 22 e a PCI NIC possui IRQ 17, portanto, parece que o kernel está solicitando-as pelo IRQ e o usuário não pode mudar esse fato de forma alguma. Alguma idéia nova?
Athabaska Dick 29/03
1

É provável que você precise acessar os arquivos de configuração de cada programa afetado e alterar 'eth1' para 'eth0.' Os padrões desses programas são configurados quando são instalados ou executados pela primeira vez com as NICs detectadas no momento.

Eu uso o Linux como roteador e tive esse problema ao usar scripts. Agora tenho um fragmento de script agradável chamada netconfessa fonte I no para qualquer outro script sempre que eu precisar usar nomes NIC, este arquivo me dá uma localização central para especificá-los (ou seja LAN_IFACE=eth0, WAN_IFACE=eth1, etc.)

LawrenceC
fonte
2
Parece que muitos programas dependem apenas da função if_nameindex () do cabeçalho <net / if.h> . Eles apenas usam o primeiro dispositivo encontrado e ignoram totalmente os nomes da interface. Eu posso ver por que isso é feito assim, é muito mais fácil usar o primeiro dispositivo encontrado do que classificar os nomes.
Athabaska Dick
1

Você não pode alterar qual interface é usada por padrão em aplicativos como iftop. Eles chamam a função de biblioteca C if_nameindexe usam o primeiro elemento na matriz retornada por padrão. GNU libc's if_nameindexno Linux é um invólucro fino em torno do SIOCGIFCONFioctl . Isso retorna as interfaces em uma ordem fixa, com base na ordem em que os drivers de rede foram inicializados e na ordem em que cada driver detectou cada dispositivo.

Se você realmente não deseja passar -ipara iftopprogramas semelhantes, é possível criar um pequeno invólucro if_nameindexque reordene os elementos na lista retornada, com LD_PRELOAD. Eu chamaria isso de muito mais problemas do que vale a pena.

Gilles 'SO- parar de ser mau'
fonte
Eu também consegui identificar o "problema" em if_nameindexfunção. Talvez eu apenas deixe por agora. Felizmente, alguns aplicativos realmente verificam o nome da interface. Por outro lado, alguns aplicativos nem têm opções de configuração padrão, então apenas tenho que usar a opção -i. Eu só estava me perguntando por que a opção de carregamento do kernel netdev=irq=22,name=eth0não funciona? Eu pensei que deveria ser possível alterar a ordem da NIC na inicialização do kernel.
Athabaska Dick 29/03
De uma rápida olhada na fonte do kernel (a for_each_netdevmacro), as interfaces são enumeradas na ordem em que os drivers são carregados (aproximadamente). Suas interfaces provavelmente usam drivers diferentes; portanto, é necessário organizar o carregamento dos drivers na ordem desejada. Eu esperaria que isso fosse difícil, especialmente se você quiser que seu tweak funcione em uma atualização do kernel.
Gilles 'SO- stop be evil'
1

Se eles tiverem drivers diferentes, pelo menos no dia em que você poderia colocar em um dos arquivos de configuração do módulo:

alias eth0 driver1
alias eth1 driver2

Esse é um conhecimento bastante antigo, mas pode ajudar.

Aaron D. Marasco
fonte
-1

Dê uma olhada no pacote 'ifrename'. Isso permite renomear os nomes de interface com base em uma variedade de informações, como endereço MAC da interface, driver, interrupção ..., configurado em um arquivo / etc / iftab.

Alguns exemplos da página do 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
fonte
Bem-vindo à U&L, você pode nos fornecer uma resposta completa, não meras dicas? Você não deve postar algo como "existe uma página de manual ...".
Archemar