
저는 세 가지 이더넷 인터페이스를 갖춘 맞춤형 임베디드 보드를 작업하고 있습니다.
- 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 eth2
IP 주소가 자동으로 올바르게 할당됩니다.
나는 몇 가지 것들을 해킹해 보았고 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
결국 udev
내 local.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 eth2
ifup
ip
/sbin/
udev
ifup