Отсрочка назначения IP-адреса до тех пор, пока сетевой адаптер не станет доступен

Отсрочка назначения IP-адреса до тех пор, пока сетевой адаптер не станет доступен

Я работаю над индивидуальной встраиваемой платой с тремя интерфейсами 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возникнет ошибка при попытке выполнить фактическую настройку адаптера.

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