UDHCP 전에 인터페이스가 나타날 때까지 기다립니다.

UDHCP 전에 인터페이스가 나타날 때까지 기다립니다.

나는 busybox 유틸리티와 함께 ​​임베디드 Linux 배포판을 사용하고 있습니다. 시스템 시작 중에 시작 스크립트에서 DHCP를 통해 인터페이스를 구성합니다.

/etc/rcS.d/S40networking |---------> ifup -a

이제 문제는 내 인터페이스 링크가 일정 시간(예: 3~4초) 후에 표시되지만 인터페이스가 표시된 후(링크가 실제로 표시되기 전) ifup이 udhcp를 호출하여 DHCP에서 IP 주소를 가져오지만 결국 아래와 같이 실패한다는 것입니다. this 지금은 인터페이스가 호출되지 않습니다.

S40 네트워크 직후에 네트워크 콘텐츠를 활용하는 자체 스크립트/애플리케이션 중 하나를 실행하고 있었는데 이 시점에서 인터페이스가 여전히 나타나지 않았고 IP가 없어서 앱도 실패했습니다.

제 질문은 링크가 실제로 시작될 때까지 S40 네트워크를 일시 중지하는 방법이나 인터페이스가 실제 링크를 시작하는 데 왜 그렇게 오래 걸리는지입니다. S40networking의 ifup -a 후 sleep 5가 작동하지만 이를 피하고 싶습니다. 커널 명령줄에 ip::::::eth0:off를 보냅니다.

아이디어?

감사합니다, Farooq Arshad.

답변1

좋아요 나는 나 자신에 대한 해결책을 찾았습니다. 이것이 가장 최적의 솔루션인지 확실하지 않지만 이것이 내 이유입니다.

1) ip=dhcp 또는 ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}: eth0을 피하기 위해 커널 부팅 시 이더넷 모듈을 시작하고 싶지 않습니다. off, 최종 사용자 설정이 무엇인지 잘 모르기 때문입니다.

2) 아래와 같이 네트워크 인터페이스를 여는 네트워크 구성 스크립트를 직접 작성했습니다.

link_up_waittime=60
interface=""
tmpfile="/tmp/cspnetwork"
linkups="Link is Up"

function error_out
{
    exit -1
}
function search_ifc_dev()
{
    for iface in `awk '{print $1}' /proc/net/dev | cut -f1 -d":"`; do
        if [[ ${iface} == eth* ]]; then
            interface=${iface}
        fi
    done
    if [[ ${interface} == "" ]]; then
        echo "Unable to find network interface. Can not continue"
        error_out
    fi
}

function wait_for_link_up()
{
    startsec=`date +%s` 
    endsec=`expr ${startsec} + ${link_up_waittime}`
    while [[ ${startsec} -lt ${endsec} ]]; do
        found=`dmesg | grep "${linkups}"`   
        if [[ ! -z ${found} ]]; then
            break;  
        fi
        # Increment current time
        startsec=`date +%s`
    done

    # We will not continue if interface can not be brought up..."
    if [[ -z ${found} ]]; then
        echo "Unable to bring up interface. Can not continue"
        error_out
    fi
}

function dynamic_ip_assign()
{
    ifconfig ${interface} 0.0.0.0
    wait_for_link_up
    udhcpc -D -s /usr/share/udhcpc/default.script
}

이 스크립트를 살펴보겠습니다. search_ifc_dev는 커널이 이더넷 인터페이스에 할당한 장치 이름을 검색합니다. (이 작업을 수행하려면 인터페이스가 하나만 있어야 합니다.)

동적_ip_할당은 IP 주소를 동적으로 할당합니다. ifup -a 대신 ifconfig를 사용합니다. 왜냐하면 ifup -a는 인터페이스가 실제로 우수해질 때까지 기다리지 않고 udhcpc 또는 dhcpclient 유틸리티(/etc/network/interface에서 iface를 dhcp로 구성한 경우)를 자동으로 호출(man 인터페이스 참조)하기 때문입니다. . 인터페이스가 실제로 시작되기 전에 네트워크 스크립트가 종료되고 인터페이스가 시작되는 동안 자체 응용 프로그램 시작 스크립트가 시작되기 때문에 DHCP 서버의 응답 속도가 느린 경우(대부분의 경우) 문제가 발생할 수 있습니다. 위에서는 종료 스크립트를 진행하기 전에 UP의 링크를 기다리고 있다는 것을 볼 수 있습니다. 따라서 시작 시 내 앱을 시작할 때마다 인터페이스가 실제로 시작된다고 확신합니다. 그렇지 않으면 error_out에서 그렇게 할 수 있습니다. 좋은 기능.

커널 명령줄에서 ip=dhcp를 사용하면 인터페이스가 실제로 작동할 때까지 이더넷 드라이버가 계속 작동하지 않으므로 응용 프로그램 시작 스크립트를 호출할 때마다 인터페이스가 부팅될 것이라고 확신할 수 있습니다. 커널 명령줄에 ip 매개변수를 제공하고 싶지 않다고 언급한 것을 보았습니다.

이 문제에 대한 간단한 해결책이 있다면 누구든지 피드백을 제공해 주세요. 또한 이것은 사용자 정의 내장 배포이므로 busybox 이외의 네트워킹 유틸리티가 누락되었습니다. 데스크탑 배포에 사용되는 것과 같은 다른 유틸리티를 사용하면 컴팩트한 솔루션이 제공될 수 있습니다.

감사합니다, Farooq Arshad.

관련 정보