組み込みLinuxシステムでの再起動後、物理ネットワークインターフェイスが常に同じインターフェイス名を取得するようにするにはどうすればよいですか?


13

組み込みLinuxシステムの場合、2つ以上のネットワークインターフェイスがある場合、起動するたびに常に同じインターフェイス名を取得するようにするにはどうすればよいですか

言い換えれば、たとえば、eth0を常に1つの物理イーサネットポートにマップし、eth1を次の物理イーサネットポートにマップするなどです。

私のLinuxの「ディストリビューション」は自家製であり、/ devを作成するためにdevtmpfsを使用しています。init(および他のほとんどすべて)にbusyboxを使用し、システムの起動とシャットダウンにカスタムinitスクリプトを使用します。

mdevやudevのホットプラグ機能は必要ありません。「固定」イーサネットポートを指します。


devicetreeファイルでこれを指定する方法があると想定していましたが、その方法を見つけることができませんでした。

回答:


7

これは、x86_64アーキテクチャ上のLinux 3.9.0で機能します。

#!/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
From man nameif「このプログラムは廃止されました。置換チェックのためip link。」 また、あなたがオンになっているシステムがあればそのノート行い使用することをudevとして、あなたの戦略が故障しやすいだろう/sys/class/net/eth[whatever]が存在しない場合があります。

2

あなたはudevを必要としないと言いましたが、それをインストールすることに反対しなければ、biosdevnameの使用を検討したいかもしれません。freedesktop.orgには、この問題について説明したすばらしいwikiページがあります。そのページで述べたように、バージョン197以降のudevを使用している場合、udesはすでに必要なことを行うため、biosdevnameも必要ありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.