재부팅 후 임베디드 Linux 시스템의 물리적 네트워크 인터페이스가 항상 동일한 인터페이스 이름을 갖도록 하려면 어떻게 해야 합니까?

재부팅 후 임베디드 Linux 시스템의 물리적 네트워크 인터페이스가 항상 동일한 인터페이스 이름을 갖도록 하려면 어떻게 해야 합니까?

임베디드 Linux 시스템의 경우 두 개 이상의 네트워크 인터페이스가 있는 경우 시작할 때마다 항상 동일한 인터페이스 이름을 갖도록 하려면 어떻게 해야 합니까?

즉, 예를 들어 eth0은 항상 하나의 물리적 이더넷 포트에 매핑되고, eth1은 항상 다음 물리적 이더넷 포트에 매핑되기를 원합니다.

내 Linux "distro"는 자체 개발되었으며 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

관련 정보