如何确保物理网络接口在嵌入式Linux系统上重新启动时始终获得相同的接口名称?


13

对于嵌入式Linux系统,如果我有两个或更多网络接口,我如何确保每次启动时始终获得相同的接口名称

换句话说,我希望,例如,eth0始终映射到一个物理以太网端口,eth1映射到下一个,等等。

我的Linux“发行版”是本土的,我使用devtmpfs来填充/ dev。我使用busybox for init(以及其他大部分内容),以及用于系统启动和关闭的自定义init脚本。

我不需要mdev或udev的hotplug设施 - 我指的是“固定”以太网端口。


我假设有一些方法可以在devicetree文件中指定它,但我还没有找到方法。

Answers:


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
man nameif “这个程序已经过时了。对于更换检查 ip link“。 另请注意,如果您使用的是系统 使用 udev,你的战略很容易失败 /sys/class/net/eth[whatever] 可能不存在。

2

你提到你没有 需要 udev,但如果你不反对安装它,那么你可能想考虑使用 biosdevname 。有一个很棒的 维基页面 freedesktop.org 讨论这个问题。如该页面所述,如果您使用的是udev版本197或更高版本,那么您甚至不需要biosdevname,因为udev已经可以满足您的需求。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.