Como alterar a ordem das placas de rede (eth1 - eth0) no linux

20

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

A minha nova Debian 6.0 instala a placa de rede PCI atribuída como " eth0 " e placas-mãe como " eth1 " como 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 ok 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, iftop agora tenta usar " eth1 " como o dispositivo padrão que usava " eth0 " antes da troca.

Isso é puramente um problema de software, já que os aplicativos estão tentando usar o primeiro dispositivo encontrado como um dispositivo padrão, apesar de sua nomenclatura de interface ou há alguma maneira de corrigir isso configurando o SO?

edit: Eu 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.

editar: eu encontrei um thread sobre o mesmo problema e eu tentei tudo o que eles sugeriram e nenhuma das soluções está funcionando, exceto para trocar os nomes "virtualmente".

    
por Athabaska Dick 28.03.2011 / 23:06

6 respostas

17

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

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

Primeiro método (força bruta):

Então, o primeiro método que eu criei foi simples para "bruteforce" o driver recarregar com o script init.d.

O seguinte script de inicialização é feito sob medida para o Debian 6.0, mas o mesmo princípio deve funcionar em quase 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 adequado. Isto 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 encontrei uma maneira um pouco mais elegante (pelo menos para os sistemas Debian e Ubuntu).

Primeiro, certifique-se de que o kernel não carregue automaticamente os drivers da NIC. Isso pode ser feito criando um arquivo de lista negra em /etc/modprobe.d/ . Eu criei um arquivo chamado " disable-nics.conf ". Observe que os arquivos em /etc/modprobe.d/ devem ter .conf suffix. Também nomear módulos em /etc/modprobe.d/blacklist.conf não afeta o carregamento automático de módulos pelo kernel, então você tem que 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 em 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:

por 30.03.2011 / 01:46
2

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

    
por 29.03.2011 / 06:29
1

É provável que você precise entrar em cada arquivo de configuração de programas 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 atualmente detectadas.

Eu uso o Linux como um roteador e tive esse problema ao usar scripts. Agora tenho um bom fragmento de script chamado netconf que eu forneço para qualquer outro script sempre que preciso usar nomes de NIC, esse arquivo me fornece um local central para especificá-los (por exemplo, LAN_IFACE=eth0 , WAN_IFACE=eth1 , etc.)

    
por 29.03.2011 / 15:55
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_nameindex e usam o primeiro elemento na matriz retornada por padrão . O if_nameindex do GNU libc no Linux é um wrapper fino em torno do SIOCGIFCONF ioctl . Isso retorna 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 quiser passar -i para iftop e programas similares, você pode fazer um pequeno wrapper em torno de if_nameindex que reordena os elementos na lista retornada, com LD_PRELOAD . Eu chamaria isso de muito mais problemas do que vale a pena.

    
por 29.03.2011 / 22:40
1

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

alias eth0 driver1
alias eth1 driver2

Isso é um conhecimento bastante antigo, mas pode ajudar.

    
por 10.07.2011 / 03:09
-1

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

Alguns exemplos da página man:

   # 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
    
por 03.04.2015 / 13:11