Я работаю над встроенным устройством 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 ....
....