Как вы гарантируете, что физические сетевые интерфейсы всегда получают одно и то же имя интерфейса при перезагрузке во встроенной системе Linux?

13

Для встроенной системы Linux, если у меня есть два или более сетевых интерфейса, как я могу гарантировать, что они всегда получают одинаковые имена интерфейсов при каждой загрузке

Другими словами, я хочу, чтобы eth0 всегда отображался на один физический порт Ethernet, eth1 на другой и т. Д.

Мой Linux-дистрибутив самодельный, и я использую devtmpfs для заполнения / dev. Я использую busybox для инициализации (и большинство всего остального), а также пользовательские скрипты инициализации для запуска и завершения работы системы.

Мне не нужны средства горячего подключения mdev или udev - я имею в виду «фиксированные» порты Ethernet.

Патрик
источник
Я предполагал, что будет какой-то способ указать это в файле devicetree, но я не смог выяснить как.

Ответы:

7

Это работает для меня с Linux 3.9.0 на архитектуре x86_64.

#!/bin/sh

# This assumes the interfaces come up with default names of eth*.
# The interface names may not be correct at this point, however.
# This is just a way to get the PCI addresses of all the active
# interfaces.
PCIADDRLIST=
for dir in /sys/class/net/eth* ; do
  [ -e $dir/device ] && {
    PCIADDRLIST="`readlink -f $dir/device` ${PCIADDRLIST}"
  }
done

# Now assign the interface names from an ordered list that maps
# to the PCI addresses of each interface.

# IFNAMES could come from some config file.  "dummy" is needed because of
# my limited tr- and awk-fu.
IFNAMES="eth0 eth1 eth2 dummy"

for dir in `echo ${PCIADDRLIST} | tr " " "\n" | sort` ; do
  [ -e $dir/net/*/address ] && {
    MACADDR=`cat $dir/net/*/address`
    IFNAME=`echo $IFNAMES | awk '{print $1}'`
    IFNAMES=`echo $IFNAMES | awk '{ for (i=2; i<=NF; i++) printf "%s ", $i; }'`
    echo -n "$IFNAME "
    nameif $IFNAME mac=$MACADDR
  }
done
Патрик
источник
2
От man nameif: «Эта программа устарела. Для проверки замены ip link Также обратите внимание, что если используемая вами система действительно используется udev, ваша стратегия будет подвержена сбоям, так как /sys/class/net/eth[whatever]может не существовать.
2

Вы упомянули, что вам не нужен udev, но если вы не против его установки, вы можете рассмотреть возможность использования biosdevname . Существует большая вики - странице на freedesktop.org , что этот вопрос обсуждается. Как отмечалось на этой странице, если вы используете udev версии 197 или выше, вам даже не нужно biosdevname, потому что udev уже сделает то, что вам нужно.

Олек Войнар
источник