在 UDHCP 之前等待接口启动

在 UDHCP 之前等待接口启动

我正在使用带有 busybox 实用程序的嵌入式 Linux 发行版。在系统启动期间,我在启动脚本中通过 DHCP 配置我的接口。

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

现在的问题是我的接口链接在一段时间后(即 3 - 4 秒)启动,但在启动接口后(在链接实际启动之前),ifup 调用 udhcp 从 DHCP 获取 IP 地址,最终失败,如下所示此时界面未调出。

就在 S40networking 之后,我正在运行我自己的脚本/应用程序之一,该脚本/应用程序利用网络内容,此时界面仍然没有启动,而且我没有 IP,所以我的应用程序也失败了。

我的问题是如何暂停 S40networking,直到我的链接实际启动为止,或者为什么我的界面需要很长时间才能启动实际链接。 S40networking 中的 ifup -a 之后 sleep 5 确实有效,但我想避免它。我在内核命令行中发送 ip::::::eth0:off 。

想法?

问候,法鲁克·阿尔沙德。

答案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 将搜索内核分配给以太网接口的设备名称。 (您必须只有一个界面才能使其工作)。

dynamic_ip_assign将动态分配IP地址。我使用 ifconfig 而不是 ifup -a 因为 ifup -a 自动调用(请参阅 man 接口)udhcpc 或 dhcpclient 实用程序(如果您已在 /etc/network/interface 中将 iface 配置为 dhcp),而无需等待接口启动实际上。当您的 DHCP 服务器响应(大多数情况下)缓慢时,这会导致问题,因为您的网络脚本将在接口实际启动之前退出,并且您自己的应用程序启动脚本将启动,而您的接口仍未启动。您可以在上面看到,在继续退出脚本之前,我正在等待 UP 的链接,因此每当我在启动中启动自己的应用程序时,我确信该界面实际上已启动,否则我可以在 error_out 中做一些不错的事情功能。

请注意,如果您在内核命令行中使用 ip=dhcp,则您的以太网驱动程序将不会继续,直到您的接口实际启动,因此每当您调用应用程序启动脚本时,您都确定接口已经启动,但正如我所见提到我不想在内核命令行中提供 ip 参数。

如果您有解决此问题的紧凑解决方案,请任何人提供反馈。另请注意,这是一个自定义的嵌入式发行版,因此我缺少除 busybox 之外的网络实用程序。使用其他一些实用程序(如桌面发行版中使用的)可能会给我一个紧凑的解决方案。

问候,法鲁克·阿尔沙德。

相关内容