网络启动后启动服务时出现“客户端关键接口 eth0/2 已关闭或没有任何链路本地地址”

网络启动后启动服务时出现“客户端关键接口 eth0/2 已关闭或没有任何链路本地地址”

确保网络接口已启动后,我尝试启动一项新贵工作。

这就是我现在所拥有的:

start on started network-interface INTERFACE=eth0
stop on runlevel [!2345]

pre-start script
    test -x /usr/sbin/dibbler-client || { stop; exit 0; }
    test -c /dev/null || { stop; exit 0; }

end script

exec /usr/sbin/dibbler-client start 2>&1 > /dev/null

问题是 dibbler 显然启动得太早了,因为我得到了有 Client Critical Interface eth0/2 is down or doesn't have any link-local address. 没有一种简单的方法可以通过事件解决这个问题,或者我必须在 中完成它pre-start?我只使用 /etc/networking/interfaces 和网络脚本进行配置。所以没有网络管理器。

答案1

您的作业在接口启动时运行,但尚未配置。此作业承载 NetworkManager。而 NetworkManager 不会发出 upstart 事件。这就是问题所在。

我认为最干净的方法是NetworkManager 的调度脚本

/etc/NetworkManager/dispatcher.d/创建一个包含以下内容的文件:

#!/bin/bash
# NetworkManager sets those parameters
INTERFACE=$1
ACTION=$2

if [ "$INTERFACE" == "eth0" ] && [ "$ACTION" == "up" ]; then
  # some tests before starting...
  /usr/sbin/dibbler-client start 2>&1 > /dev/null
elif [ "$INTERFACE" == "eth0" ] && [ "$ACTION" == "down" ]; then
  # maybe stop the client...
fi

答案2

主要问题是即使接口已启动,ipv6 也没有启动。

进行一些浏览后,有人建议通过编辑在启动期间启动 ipv6 模块/etc/modules

另一个解决方案据说是inactive-mode在 dibbler 配置中启用/etc/dibbler/client.conf

我只想在 upstart 脚本中完成此操作,因此这里是.conf我测试过的并且似乎可以正常工作的文件:

# dibbler-client
#
# The dibbler dhcpv6 client

description     "dibbler-client"

start on (started network-interface
          or started network-manager
          or started networking)
stop on runlevel [!2345]

pre-start script
    test -x /usr/sbin/dibbler-client || { stop; exit 0; }
    test -c /dev/null || { stop; exit 0; }

    TIMEOUT=50 #5 second timeout - eatch iteration sleeps for 1/10th of a second
    LOG_FILE=/tmp/dibbler_upstart.log

    until [ $TIMEOUT -eq 0 ]; do
        if ip addr show dev eth0 | grep -e 'inet6.*link.$'; then
                echo "Detected inet6 link-local, exiting" >> $LOG_FILE
                ip addr show dev eth0 >> $LOG_FILE
                exit 0;
        fi
        TIMEOUT=$((TIMEOUT-1))
        sleep .1
    done

    echo "Timeout waiting for IP address" >> $LOG_FILE
    exit 1;

end script

exec /usr/sbin/dibbler-client start 2>&1 > /dev/null

如果有人知道如何通过事件检测 IPv6 状态,这将是一个更清晰的解决方案。

答案3

也许你需要从以下开始:

start on net-device-up IFACE=eth0 ADDRFAM=inet6

或者,您可以使用 static-network-up 等待所有接口启动。

相关内容