네트워크 어댑터 장치를 사용할 수 있을 때까지 IP 주소 할당 지연

네트워크 어댑터 장치를 사용할 수 있을 때까지 IP 주소 할당 지연

저는 세 가지 이더넷 인터페이스를 갖춘 맞춤형 임베디드 보드를 작업하고 있습니다.

  • eth0 및 eth1은 CPU(TI AM3356)에 내장되어 있습니다.
  • eth2는 USB를 통해 연결된 온보드 LAN9512 칩(smsc95xx 드라이버 사용)으로 만들어졌습니다.

부팅 시 eth0과 eth1을 불러오고 싶습니다.없이IP 주소(산업용 이더넷에 사용됨)를 입력하고 eth2를 불러옵니다.~와 함께IP 주소(표준 네트워크 통신에 사용됨)

/etc/network/interfaces원래 모습은 이렇습니다.

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual
    pre-up ifconfig $IFACE up
    post-down ifconfig $IFACE down

auto eth1
iface eth1 inet manual
    pre-up ifconfig $IFACE up
    post-down ifconfig $IFACE down

auto eth2
iface eth2 inet static                                                                                              
    address 10.1.1.10                                                                                           
    netmask 255.255.255.0                                                                                           
    gateway 10.1.1.20                                                                                           

그러면 세 가지 네트워크 인터페이스(및 루프백 어댑터)가 모두 표시되지만 지정된 IP 주소가 eth2에 할당되지 않습니다.

부트로그를 보면 메시지가 뜹니다

ip: 'eth2' 장치를 찾을 수 없습니다

...그리고 바로 뒤에 smsc95xx 드라이버에서 eth2를 등록했다는 메시지가 표시됩니다. 따라서 init 스크립트가 IP 주소를 할당하려고 할 때 eth2를 사용할 수 없기 때문이라고 가정합니다(대신 바로 뒤에 나타납니다).

보드가 시작 되면 ifup eth2IP 주소가 자동으로 올바르게 할당됩니다.

나는 몇 가지 것들을 해킹해 보았고 pre-up다음은 잘 작동하는 것 같습니다.

auto eth2
iface eth2 inet static                                                                                              
    address 10.1.1.10                                                                                           
    netmask 255.255.255.0                                                                                           
    gateway 10.1.1.20                                                                                           
    pre-up while [ ! -e /sys/class/net/eth2 ]; do sleep 1; done;

하지만 너무 해킹처럼 느껴집니다(eth2가 전혀 표시되지 않으면 시스템이 중단될 수도 있습니다).

인터페이스가 실제로 존재할 때까지 IP 할당을 기다리게 하는 "올바른" 방법이 있습니까? - 아니면 이를 달성하려면 사용자 정의 스크립트를 만들어야 합니까?

나는 BusyBox를 실행하는 임베디드 Linux(PTXDist로 구축된 커널 3.18.9-rt5)에서 작업하고 있으므로 사용 가능한 모든 멋진 도구에 액세스하지 못할 수도 있습니다.

답변1

가장 좋은 점은 인터페이스 불러오기 속도를 높이는 것입니다. 이는 의 스탠자 allow-hotplug eth2바로 뒤에 추가하여 얻습니다 .auto eth2/etc/network/interfaces

에 따르면데비안 매뉴얼,

시스템 시작 시 "자동" 시작 인터페이스

"자동 허용" , ,

커널이 인터페이스에서 핫플러그 이벤트를 감지하면 "allow-hotplug" 인터페이스가 시작됩니다.

따라서 다음과 같아야 합니다.

auto eth2
allow-hotplug eth2
iface eth2 inet static                                                                                              
address 10.1.1.10                                                                                           
netmask 255.255.255.0                                                                                           
gateway 10.1.1.20 

편집하다

udev가 인터페이스를 감지하면 인터페이스 udev에 대한 규칙이 필요할 수도 있습니다 . ifup다음과 같은 규칙을 사용할 수 있습니다.

KERNEL=="sd*", ATTRS{vendor}=="Yoyodyne", ATTRS{model}=="XYZ42", ATTRS{serial}=="123465789", RUN+="/path/to/my/script"   

의 파일에 배치하여 /etc/udev/rules.d. 이는 USB 개체용이므로 공급업체와 모델을 케이스에 맞게 수정해야 합니다. 파일 /path/to/my/script실행 가능다음을 포함하는 파일

#!/bin/bash
ifup InterfaceName

이렇게 하면 됩니다.

답변2

결국 udevlocal.rules파일에 다음 규칙을 추가했습니다.

KERNEL=="eth2", SUBSYSTEM=="net", SUBSYSTEMS=="usb", DRIVERS=="smsc95xx", RUN+="/home/bin/enableeth2.sh"

스크립트( /home/bin/enableeth2.sh)에는 다음이 포함되어 있으며 실행 가능하도록 설정되어 있습니다.

#!/bin/bash
cd /sbin/
ifup eth2

을 호출하는 대신 을 /sbin/호출하기 전에 디렉토리가 변경되었음을 참고하세요 . 내부적으로 BusyBox 호출 ( 에 있음 )이 필요하고 규칙이 실행될 때 경로가 분명히 설정되지 않기 때문에 실제 어댑터 설정을 시도할 때 오류가 발생합니다.ifup/sbin/ifup eth2ifupip/sbin/udevifup

관련 정보