Как сделать так, чтобы eth1 сразу же получил свой IPv6-адрес fe80 при запуске, даже если он физически не подключен?

Как сделать так, чтобы eth1 сразу же получил свой IPv6-адрес fe80 при запуске, даже если он физически не подключен?

Я работаю над встроенным устройством Linux x86, работающим под управлением Debian (Linux 3.8.13). Это устройство имеет два порта Ethernet, 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» (и она останется там, даже если я снова отключу кабель Ethernet от eth1).

Таким образом, похоже, Linux не утруждает себя связыванием устройства Ethernet с его адресом IPv6 до тех пор, пока это устройство Ethernet не будет к чему-либо подключено в первый раз.

Это вроде как работает, но у меня есть несколько программ, которые должны постоянно отправлять многоадресные пакеты IPv6 из обоих портов, и они не могут этого сделать на порту, которому не назначен адрес IPv6.

Поэтому я хотел бы найти способ заставить Linux ассоциировать самоназначенный адрес IPv6 устройства (то есть fe80::blah, где blah выводится из MAC-адреса на чипе Ethernet) во время запуска, а не ждать, пока порт Ethernet будет фактически подключен. Есть ли способ сделать это?

(Преимущество было бы в том, что мои программы могли бы просто сканировать список сетевых устройств во время запуска и использовать их — в настоящее время им приходится настраивать сокет AF_NETLINK, чтобы получать уведомления об изменениях конфигурации сети, что в принципе работает, но сложнее, чем мне бы хотелось, и также немного медленно реагирует)

решение1

ifconfigне показывает вам достаточно информации здесь. Общий ключ - еслисвязьis up. iproute2's ip addrпокажет статус более низкого уровня, а также время жизни адресов, если применимо.

Локальные адреса ссылок должны присутствовать только в том случае, если сама ссылка активна. Нет ссылки — нет адреса. Есть также куча других случаев, когда он не будет отображаться, например, подинтерфейсы в связанном наборе (группа/команда/главный и т. д., в зависимости от того, какой выбор слов вы хотите использовать)

Я думаю, что наблюдаемое вами поведение, когда адрес локальной ссылки не удаляется после отключения кабеля, является ошибкой. Его следовало удалить, когда его больше никто не использует, а счетчик времени жизни истекает. Подозреваю, что это было исправлено в новых ядрах (сейчас я не могу это проверить).

А дальше, вам все равно, ядро ​​или пространство пользователя создает адрес fe80::? Если это неважно, вы можете создать его из пространства пользователя, и ядро ​​его не удалит.

решение2

Как настроены интерфейсы в /etc/network/interfaces? Я предполагаю, что они установлены на allow-hotplug, который включает интерфейс при обнаружении ссылки. Попробуйте изменить его на , autoчтобы ваша конфигурация выглядела так:

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

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

Связанный контент