Linux

在嵌入式 Linux 系統上,如何確保物理網路介面在重新啟動時始終獲得相同的介面名稱?

  • June 9, 2014

對於嵌入式 Linux 系統,如果我有兩個或多個網路介面,我如何確保它們每次啟動時始終獲得相同的介面名稱

換句話說,例如,我希望 eth0 始終映射到一個物理乙太網埠,eth1 映射到下一個,等等。

我的 Linux “發行版”是本土開發的,我使用 devtmpfs 來填充 /dev。我使用busybox 進行初始化(以及大多數其他內容),以及用於系統啟動和關閉的自定義初始化腳本。

我不需要 mdev 或 udev 的熱插拔功能——我指的是“固定”乙太網埠。

這適用於 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

引用自:https://unix.stackexchange.com/questions/136282