确保网络接口已启动后,我尝试启动一项新贵工作。
这就是我现在所拥有的:
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 等待所有接口启动。