Як ви забезпечуєте, щоб фізичні мережеві інтерфейси завжди отримували однакове ім'я інтерфейсу через перезавантаження вбудованої системи Linux?


13

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

Іншими словами, я хочу, наприклад, eth0 завжди відображати один фізичний порт Ethernet, eth1 - наступний тощо.

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

Мені не потрібні засоби гарячої підключення 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 вже зробить те, що вам потрібно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.