segunda-feira, 23 de agosto de 2010

Quando o Linux não levanta a interface de rede

Certa vez tive um problema quando tentei instalar uma terceira placa de rede e não deu certo. Até então havia utilizado no máximo duas placas de rede, mapeadas em eth0 e eth1 e nunca uma terceira placa. Com duas o Linux mapeou certinho, podendo levantá-las ou baixá-las com ifconfig, mas com 3 placas, apesar de conhecer a terceira, não foi possível utilizar sua interface (eth2, eth3, …) com ifconfig.
Através do comando
lspci, observei que as três placas foram reconhecidas normalmente, sendo 2 onboard (placa ASUS) e uma offboard (3COM), como mostra a saída do comando abaixo:

$ lspci | grep Ethernet

02:00.0 Ethernet controller: Marvell Technology Group Ltd. 88E8056 PCI-E Gigabit Ethernet Controller (rev 12)
05:00.0 Ethernet controller: 3Com Corporation 3c905B 100BaseTX [Cyclone] (rev 30)
05:02.0 Ethernet controller: Marvell Technology Group Ltd. 88E8001 Gigabit Ethernet Controller (rev 14)
Pesquisando na internet, descobri que as informações persistentes sobre rede (as placas) são guardadas no arquivo /etc/udev/rules.d/70-persistent-net.rules. Talvez mude em uma versão posterior ou em outra distribuição, mas é fácil descobrir qual o arquivo:

$ cd /etc/udev/rules.d
$ ls *net.rules*

O comando mostra o arquivo utilizado.
Nesse arquivo estão mapeadas todas as placas de rede reconhecidas pelo Linux, inclusive firewire. Conteúdo do arquivo:

$ cat 0-persistent-net.rules
# PCI device 0x11ab:0x4364 (sky2)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:24:8c:a4:04:72", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

# PCI device 0x11ab:0x4320 (skge)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:24:8c:a4:03:dc", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

# Firewire device  (nodemgr)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:1e:8c:00:01:e1:cc:91", ATTR{type}=="24", KERNEL=="eth*", NAME="eth2"

# PCI device 0x10b7:0x9055 (3c59x)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:50:04:22:62:16", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"
No arquivo acima estão, em ordem:


1 –> a primeira placa de rede onboard, mapeado como eth0;

2 –> a segunda placa de rede onboard, mapeado como eth1;

3 –> uma placa firewire onboard, mapeado como eth2;

4 –> a terceira placa de rede offboard, mapeado como eth1.



Esse arquivo é atualizado automaticamente pelo Linux quando uma nova placa de rede é inserida no micro. O erro que ocorreu foi que a partir da terceira, ele sempre atribui a interface eth1!!
Para corrigir isso, basta atribuir manualmente a interface correta, que nesse caso eu coloquei
eth3:
# PCI device 0x11ab:0x4364 (sky2)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:24:8c:a4:04:72", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

# PCI device 0x11ab:0x4320 (skge)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:24:8c:a4:03:dc", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

# Firewire device  (nodemgr)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:1e:8c:00:01:e1:cc:91", ATTR{type}=="24", KERNEL=="eth*", NAME="eth2"

# PCI device 0x10b7:0x9055 (3c59x)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:50:04:22:62:16", ATTR{type}=="1", KERNEL=="eth*", NAME="eth3"
Isso também pode ser utilizado para trocar a interface de rede entre as placas, mudando de eth0 para eth1, ou vice-versa, entre as placas de rede instaladas.
Foi preciso reiniciar a máquina para que as alterações tenham efeito. 

Nenhum comentário:

Postar um comentário