
Я работаю над индивидуальной встраиваемой платой с тремя интерфейсами 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.
Глядя в бутлог я получаю сообщение
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, поэтому у меня может не быть доступа ко всем доступным инструментам.
решение1
Лучше всего ускорить запуск интерфейса. Это достигается добавлением allow-hotplug eth2
сразу после auto eth2
в строфе /etc/network/interfaces
.
В соответствии сРуководство Debian,
"автоматический" запуск интерфейса при запуске системы
"разрешить-авто" , ,
"allow-hotplug" запускает интерфейс, когда ядро обнаруживает событие горячего подключения из интерфейса
Итак, должно быть так:
auto eth2
allow-hotplug eth2
iface eth2 inet static
address 10.1.1.10
netmask 255.255.255.0
gateway 10.1.1.20
Редактировать
Возможно, вам нужно udev
правило для ifup
интерфейса, когда udev его обнаруживает. Вы могли бы использовать правило типа:
KERNEL=="sd*", ATTRS{vendor}=="Yoyodyne", ATTRS{model}=="XYZ42", ATTRS{serial}=="123465789", RUN+="/path/to/my/script"
поместив его в файл в /etc/udev/rules.d
. Это для объекта USB, Поставщик и Модель должны быть исправлены для вашего случая, файл /path/to/my/script
являетсяисполняемыйфайл, содержащий
#!/bin/bash
ifup InterfaceName
Этого должно хватить.
решение2
udev
В итоге я добавил в свой файл следующее правило local.rules
:
KERNEL=="eth2", SUBSYSTEM=="net", SUBSYSTEMS=="usb", DRIVERS=="smsc95xx", RUN+="/home/bin/enableeth2.sh"
Скрипт ( /home/bin/enableeth2.sh
) содержит следующее (и настроен как исполняемый):
#!/bin/bash
cd /sbin/
ifup eth2
Обратите внимание на изменение каталога на /sbin/
до вызова ifup
, вместо простого вызова /sbin/ifup eth2
. Это необходимо, поскольку BusyBox ifup
вызывает ip
(расположенный в /sbin/
) внутренне, и поскольку путь, по-видимому, не установлен при udev
запуске правила, ifup
возникнет ошибка при попытке выполнить фактическую настройку адаптера.