Wie kann ich sicherstellen, dass eth1 seine fe80-IPv6-Adresse sofort beim Start erhält, auch wenn keine physische Verbindung besteht?

Wie kann ich sicherstellen, dass eth1 seine fe80-IPv6-Adresse sofort beim Start erhält, auch wenn keine physische Verbindung besteht?

Ich arbeite an einem Embedded-x86-Linux-Gerät, auf dem Debian (Linux 3.8.13) läuft. Dieses Gerät hat zwei Ethernet-Ports, eth0 und eth1.

Wenn ich dieses Gerät hochfahre, wobei nur eth0 an einen Switch angeschlossen ist, mich per SSH damit anmelde und ein „ifconfig“ ausführe, erhalte ich Folgendes:

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

Beachten Sie, dass eth0 eine „inet6-Adresse“ zugewiesen ist, eth1 jedoch nicht.

Wenn ich eth1 an einen Netzwerk-Switch anschließe, erscheint in der Ausgabe von ifconfig eine Zeile „inet6 addr“ (und diese bleibt auch dann vorhanden, wenn ich das Ethernet-Kabel wieder von eth1 abziehe).

Es scheint also, dass Linux sich nicht die Mühe macht, einem Ethernet-Gerät seine IPv6-Adresse zuzuordnen, bis das Ethernet-Gerät zum ersten Mal tatsächlich mit etwas verbunden wird.

Das funktioniert einigermaßen, aber ich habe einige Programme, die ständig IPv6-Multicast-Pakete über beide Ports senden sollen, und sie können das nicht auf einem Port tun, dem keine IPv6-Adresse zugewiesen ist.

Ich würde also gerne einen Weg finden, Linux dazu zu zwingen, die selbst zugewiesene IPv6-Adresse des Geräts (also fe80::blah, wobei blah von der MAC-Adresse auf dem Ethernet-Chip abgeleitet ist) beim Start zuzuordnen, anstatt zu warten, bis der Ethernet-Port tatsächlich verbunden ist. Gibt es eine Möglichkeit, das zu tun?

(Der Vorteil wäre, dass meine Programme beim Start einfach die Liste der Netzwerkgeräte scannen und verwenden könnten – derzeit müssen sie einen AF_NETLINK-Socket einrichten, um über Änderungen der Netzwerkkonfiguration benachrichtigt zu werden, was einigermaßen funktioniert, aber komplizierter ist, als ich es gerne hätte, und auch etwas langsam reagiert.)

Antwort1

ifconfigzeigt Ihnen hier nicht genügend Informationen. Der allgemeine Schlüssel ist, ob dieVerknüpfungist aktiv. iproute2's ip addrzeigt den Status der unteren Ebene sowie ggf. die Lebensdauer der Adressen an.

Link-Local-Adressen sollten nur vorhanden sein, wenn der Link selbst aktiv ist. Kein Link, keine Adresse. Es gibt auch eine Reihe anderer Fälle, in denen sie nicht erscheinen, wie z. B. Subschnittstellen in verbundenen Sets (Gruppe/Team/Master usw., je nachdem, welche Wortwahl Sie verwenden möchten).

Das von Ihnen beobachtete Verhalten einer Link-Local-Adresse, die nach dem Entfernen eines Kabels nicht entfernt wurde, ist meiner Ansicht nach ein Fehler. Sie hätte entfernt werden sollen, als sie nichts anderes verwendete und der Lebensdauerzähler ablief. Ich vermute, dass dies in neueren Kerneln behoben wurde (ich bin gerade nicht in der Lage, dies zu testen).

Ist es Ihnen darüber hinaus wichtig, ob die Adresse vom Kernel oder vom Userspace erstellt wird fe80::? Wenn das keine Rolle spielt, können Sie sie vom Userspace aus erstellen und der Kernel wird sie nicht entfernen.

Antwort2

Wie sind die Schnittstellen in konfiguriert /etc/network/interfaces? Ich nehme an, sie sind auf eingestellt, allow-hotplugwodurch die Schnittstelle aktiviert wird, wenn ein Link erkannt wird. Versuchen Sie, es autoso zu ändern, dass Ihre Konfiguration folgendermaßen aussieht:

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

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

verwandte Informationen