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

1142
sonicwave

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

3
У тебя есть `udev`? MariusMatutiae 8 лет назад 0
@MariusMatutiae Да, я делаю. Я только использовал это для установки пользовательского имени для usbpendrive все же. Будет ли это полезно для установки IP-адреса? sonicwave 8 лет назад 0
`udev` может запустить скрипт, когда устройство появляется. Ваш скрипт может затем назначить IP. LawrenceC 8 лет назад 0
@LawrenceC Сегодня я попытался немного поэкспериментировать с `udev` - я думаю, что настроил рабочее правило, но я не смог заставить его запустить` / sbin / ifup eth2` (либо это, либо просто `ifup`) не завершено успешно). Я продолжу пробовать вещи, когда вернусь в офис в понедельник. sonicwave 8 лет назад 0
Кроме того, так как кажется, что вы работаете в Debian, вы можете просто добавить `sleep 10; ifup eth2` в ваш `/ etc / rc.local`, и это может сработать. LawrenceC 8 лет назад 0
@LawrenceC Я работал с `udev` - оказалось, что BusyBox требовал правильного рабочего каталога для его` ifup`, или что был задан путь (именно поэтому `ifup` изначально не работал с` udev` ) - см. мой собственный ответ для деталей. sonicwave 8 лет назад 0

2 ответа на вопрос

2
sonicwave

I ended up adding the following udev rule to my local.rules file:

KERNEL=="eth2", SUBSYSTEM=="net", SUBSYSTEMS=="usb", DRIVERS=="smsc95xx", RUN+="/home/bin/enableeth2.sh" 

The script (/home/bin/enableeth2.sh) contains the following (and is set to be executable):

#!/bin/bash cd /sbin/ ifup eth2 

Note the change of directory to /sbin/ before calling ifup, instead of just calling /sbin/ifup eth2. This is necessary since the BusyBox ifup calls ip (located in /sbin/) internally, and since the path apparently isn't set up when the udev rule runs, ifup will give an error when trying to do the actual adapter set up.

1
MariusMatutiae

Лучше всего ускорить работу над интерфейсом. Это получается путем добавления allow-hotplug eth2сразу после auto eth2в строфе /etc/network/interfaces.

Согласно руководству Debian ,

«авто» интерфейс запуска при запуске системы

"разрешить авто",,

интерфейс запуска allow-hotplug, когда ядро ​​обнаруживает событие 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=="Yoyodyne", ATTRS=="XYZ42", ATTRS=="123465789", RUN+="/path/to/my/script" 

поместив его в файл в /etc/udev/rules.d. Это для объекта USB, Vendor и Model должны быть установлены в вашем случае, файл /path/to/my/scriptпредставляет собой исполняемый файл, содержащий

#!/bin/bash ifup InterfaceName 

Это должно сделать это.

Спасибо за предложение, но это не помогает. С `allow-hotplug eth2` вместо` auto eth2`, eth2 вообще не вызывается во время загрузки. Для справки, `ifup eth2` все еще работает (и назначает указанный ip) после загрузки, и я также больше не получаю сообщение" ip: not find device 'eth2' ". sonicwave 8 лет назад 0
@ sonicwave Я сделал ошибку, пожалуйста, посмотрите мой отредактированный ответ MariusMatutiae 8 лет назад 0
Хм - я почти уверен, что уже пробовал это - и что он жаловался на то, что `allow-hotplug`" неуместен ", если он был помещен после строки` auto eth2`, - а затем просто полностью отклонил файл. Я попробую еще раз в понедельник, когда вернусь в офис, чтобы убедиться. Спасибо в любом случае, хотя! sonicwave 8 лет назад 0
@sonicwave Видите ли, вышесказанное - это то, что предлагает руководство Debian, дословно. Если это не работает, значит, есть проблема. Мы можем попробовать использовать специальное правило udev, но это опять-таки хак, потому что оно должно работать так, как я описал выше, без необходимости дальнейшего вмешательства. MariusMatutiae 8 лет назад 0
Хм - я быстро взглянул на код Busybox, и он, кажется, не поддерживает `allow-hotplug` - что, я думаю, объясняет, почему он не работает ... sonicwave 8 лет назад 0
@sonicwave Мммм, я немного удивлен: я помню, что busybox имел поддержку hotplug. Поиск в Google `busybox allow-hotplug` возвращает модификации кода начиная с 2005-2007. MariusMatutiae 8 лет назад 0
@ sonicwave Пожалуйста, прочитайте мой Edit. MariusMatutiae 8 лет назад 0
Я также обнаружил небольшой патч, пытающийся добавить поддержку `allow-hotplug`, но, очевидно, он так и не был объединен. У текущего дерева, кажется, нет никаких признаков этого по крайней мере. В любом случае, я начал работать после игры с `udev` и вызываемым скриптом. Спасибо за вклад! sonicwave 8 лет назад 0