Estou trabalhando em um dispositivo Linux x86 incorporado que executa Debian (Linux 3.8.13). Este dispositivo possui duas portas Ethernet, eth0 e eth1.
Se eu inicializar este dispositivo com apenas eth0 conectado a um switch, fazer ssh nele e fazer um 'ifconfig', recebo o seguinte:
root@msli-DCP-11234772:~# ifconfig
eth0 Link encap:Ethernet HWaddr 00:1c:ab:00:0a:60
inet6 addr: fe80::21c:abff:fe00:a60/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:5659 errors:0 dropped:4102 overruns:0 frame:0
TX packets:1071 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1313254 (1.2 MiB) TX bytes:224889 (219.6 KiB)
Interrupt:16 Memory:fc500000-fc520000
eth1 Link encap:Ethernet HWaddr 00:1c:ab:00:0a:61
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Interrupt:17 Memory:fc520000-fc540000
Observe que eth0 possui um "endereço inet6" atribuído a ela, enquanto eth1 não.
Se/quando eu conectar a eth1 em um switch de rede, uma linha "inet6 addr" aparecerá na saída do ifconfig naquele momento (e permanecerá presente mesmo se eu desconectar o cabo Ethernet da eth1 novamente).
Portanto, parece que o Linux não se preocupa em associar um dispositivo Ethernet ao seu endereço IPv6 até a primeira vez que o dispositivo Ethernet está realmente conectado a alguma coisa.
Isso funciona, mas eu tenho alguns programas que deveriam enviar pacotes multicast IPv6 de ambas as portas o tempo todo, e eles não podem fazer isso em uma porta que não tenha um endereço IPv6 atribuído a ela.
Então, o que eu gostaria de fazer é encontrar uma maneira de forçar o Linux a associar o endereço IPv6 auto-atribuído do dispositivo (ou seja, fe80::blah, onde blá é derivado do endereço MAC no chip Ethernet) durante a inicialização, em vez de esperar até que a porta Ethernet esteja realmente conectada. Existe uma maneira de fazer isso?
(A vantagem seria que meus programas poderiam apenas escanear a lista de dispositivos de rede durante a inicialização e usá-los - atualmente eles precisam configurar um soquete AF_NETLINK para serem notificados sobre alterações na configuração da rede, o que funciona, mas é mais complicado do que eu gostaria, e também um pouco lento para reagir)
Responder1
ifconfig
não mostra informações suficientes aqui. A chave geral é se olinké acima. iproute2
mostrará ip addr
o status de nível inferior, bem como o tempo de vida dos endereços, conforme aplicável.
Os endereços locais de link só devem estar presentes se o próprio link estiver ativo. Sem link, sem endereço. Há também vários outros casos em que ele não aparecerá, como subinterfaces em conjunto vinculado (grupo/equipe/mestre etc., dependendo da escolha de palavras que você deseja usar)
O comportamento que você observou de um endereço local de link não sendo removido após a remoção de um cabo, acho que é um erro, ele deveria ter sido removido quando nada mais o estava usando e o contador de vida útil expira, e suspeito que tenha sido corrigido em kernels mais recentes (Não estou em condições de testar agora).
Além disso, você se importa se é o kernel ou o espaço do usuário que cria o fe80::
endereço? Se isso não importa, você pode criá-lo a partir do espaço do usuário e o kernel não o removerá.
Responder2
Como as interfaces são configuradas /etc/network/interfaces
? Presumo que eles estejam configurados para allow-hotplug
ativar a interface quando um link é detectado. Tente alterá-lo para auto
que sua configuração fique assim:
auto eth0
iface eth0 ....
....
auto eth1
iface eth1 ....
....