Я работаю над собственной встроенной платой с тремя интерфейсами Ethernet:
- eth0 и eth1 встроены в процессор (TI AM3356)
- eth2 сделан с помощью встроенного чипа LAN9512 (с использованием драйвера smsc95xx), подключенного через USB
При загрузке я хочу вызвать eth0 и eth1 без IP-адреса (они используются для промышленного Ethernet), и вызвать eth2 с IP-адресом (он используется для стандартной сетевой связи).
Мой /etc/network/interfaces
изначально выглядел так:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet manual
pre-up ifconfig $IFACE up
post-down ifconfig $IFACE down
auto eth1
iface eth1 inet manual
pre-up ifconfig $IFACE up
post-down ifconfig $IFACE down
auto eth2
iface eth2 inet static
address 10.1.1.10
netmask 255.255.255.0
gateway 10.1.1.20
Это вызывает все три сетевых интерфейса (и адаптер обратной связи), но не назначает указанный IP-адрес eth2.
Глядя в bootlog я получаю сообщение
ip: не могу найти устройство 'eth2'
... и сразу после этого сообщение от драйвера smsc95xx о том, что он зарегистрировал eth2. Поэтому я предполагаю, что это потому, что eth2 недоступен, когда скрипт init пытается присвоить ему IP-адрес (а вместо этого появляется сразу после).
Если я сделаю ifup eth2
после запуска платы, IP-адрес будет назначен автоматически.
Я попытался взломать некоторые вещи pre-up
, и следующее, кажется, работает просто отлично:
auto eth2
iface eth2 inet static
address 10.1.1.10
netmask 255.255.255.0
gateway 10.1.1.20
pre-up while [ ! -e /sys/class/net/eth2 ]; do sleep 1; done;
Но это просто слишком похоже на взлом (и также зависнет система, если eth2 никогда не появится).
Есть ли "правильный" способ заставить IP-назначение ждать, пока интерфейс фактически не появится? - или мне придется сделать собственный сценарий для достижения этой цели?
Обратите внимание, что я работаю над встроенным Linux (ядро 3.18.9-rt5, построенное с PTXDist), работающим под управлением BusyBox, поэтому у меня может не быть доступа ко всем модным доступным инструментам.