如何確保 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 ....
    ....

相關內容