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

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

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

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

我的 Linux“发行版”是自行开发的,我使用 devtmpfs 来填充 /dev。我使用 busybox 进行初始化(以及大多数其他操作),并使用自定义初始化脚本进行系统启动和关闭。

我不需要 mdev 或 udev 的热插拔功能——我指的是“固定”以太网端口。

答案1

这适用于 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

相关内容