如何确保 eth1 在启动时立即获得其 fe80 IPv6 地址,即使它没有物理连接?

如何确保 eth1 在启动时立即获得其 fe80 IPv6 地址,即使它没有物理连接?

我正在开发运行 Debian (Linux 3.8.13) 的嵌入式 x86 Linux 设备。该设备有两个以太网端口:eth0 和 eth1。

如果我仅使用连接到交换机的 eth0 来启动此设备,然后通过 ssh 进入该设备并执行“ifconfig”,我会得到以下结果:

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

请注意,eth0 分配有“inet6 addr”,而 eth1 则没有。

如果/当我将 eth1 插入网络交换机时,此时 ifconfig 的输出中将出现“inet6 addr”行(即使我再次从 eth1 拔下以太网电缆,该行仍会存在)。

因此,Linux 似乎不会费心将以太网设备与其 IPv6 地址关联起来,直到以太网设备第一次实际连接到某物。

这种方法可行,但我有一些程序应该始终从两个端口发送 IPv6 多播数据包,但它们无法在未分配 IPv6 地址的端口上执行此操作。

所以我想做的是找到一种方法来强制Linux在启动期间关联设备自分配的IPv6地址(即fe80::blah,其中blah源自以太网芯片上的MAC地址),而不是等待直至以太网端口真正连接。有没有办法做到这一点?

(优点是我的程序可以在启动期间扫描网络设备列表并使用它们——目前它们必须设置一个 AF_NETLINK 套接字才能收到网络配置更改的通知,这可以工作,但更复杂比我想要的,反应也有点慢)

答案1

ifconfig此处没有向您显示足够的信息。一般关键是如果关联起来了。iproute2'sip addr将显示较低级别的状态以及适用的地址的生命周期。

仅当链路本身已启动时,链路本地地址才应该存在。没有链接,没有地址。还有很多其他情况不会出现,例如绑定集中的子接口(组/团队/主控等,具体取决于您要使用的单词选择)

您观察到的在电缆被移除后链路本地地址未被移除的行为我认为是错误的,当没有其他东西使用它并且生命周期计数器到期时它应该被删除,并且我怀疑它已在较新的内核中修复(我现在无法进行测试)。

除此之外,您是否关心是内核还是用户空间创建了fe80::地址?如果没关系,你可以从用户空间创建它,内核不会删除它。

答案2

接口是如何配置的/etc/network/interfaces?我假设它们被设置为allow-hotplug在检测到链接时启用接口。尝试将其更改为auto使您的配置看起来像:

auto eth0
iface eth0 ....
    ....

auto eth1
iface eth1 ....
    ....

相关内容