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


13

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

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

내 Linux "배포"는 자체 개발 한 것이며 / dev를 채우는 데 devtmpfs를 사용합니다. 시스템 시작 및 종료를위한 사용자 정의 init 스크립트와 함께 busyit 및 init (및 기타 모든 것)에 busybox를 사용합니다.

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 에는이 문제를 다루는 훌륭한 위키 페이지 가 있습니다. 해당 페이지에서 언급했듯이 udev 버전 197 이상을 사용하는 경우 udev가 이미 필요한 작업을 수행하므로 biosdevname이 필요하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.