UDHCPの前にインターフェイスが表示されるのを待ちます。

UDHCPの前にインターフェイスが表示されるのを待ちます。

私はbusyboxユーティリティで組み込みLinuxディストリビューションを使用しています。システム起動時に起動スクリプトで DHCP を介してインターフェイスを設定します。

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

これで問題は、私のインターフェイスリンクが一定時間(例えば3〜4秒)後に表示されますが、インターフェイスが表示された後(リンクが実際に表示される前)、ifupはudhcpを呼び出してDHCPからIPアドレスを取得しますが、最終的には次のように失敗します。です。 this 今はインターフェイスは呼び出されません。

S40ネットワークの直後にネットワークコンテンツを利用する独自のスクリプト/アプリケーションの1つを実行していましたが、この時点でインターフェイスがまだ表示されておらず、IPがないためアプリも失敗しました。

私の質問は、リンクが実際に開始されるまでS40ネットワークを一時停止する方法、またはインターフェイスが実際のリンクを開始するのになぜそれほど時間がかかるのかです。 S40networkingのifup -aの後にスリープ5が機能しますが、これを避けたいと思います。カーネルコマンドラインに ip::::::eth0:off を送信します。

アイデア?

ありがとう、Farooq Arshad。

ベストアンサー1

わかりました、私は自分自身の解決策を見つけました。これが最も最適な解決策であるかどうかはわかりませんが、これが私の理由です。

1) ip=dhcp または ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}: eth0 を避けるためにカーネル起動時にイーサネットモジュールを起動したくありません。オフ、エンドユーザー設定が何であるかよくわからないからです。

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は、カーネルがイーサネットインターフェイスに割り当てたデバイス名を検索します。 (これを行うには、インターフェイスが1つだけ必要です。)

動的_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。

おすすめ記事