Я пытаюсь начать работу после запуска, убедившись, что сетевые интерфейсы работают.
Это то, что у меня есть сейчас:
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
Проблема в том, что Дибблер, очевидно, запущен слишком рано, так как я получаю Client Critical Interface eth0/2 is down or doesn't have any link-local address.
Есть ли простой способ решить это с помощью событий или я? Должен ли я сделать это в pre-start
? Я использую только / etc / network / interfaces и сетевой скрипт для настройки. Так что нет сетевого менеджера.
Ваши прогоны задания, когда интерфейс подходит, но он еще не настроен. Это задание несет NetworkManager. И NetworkManager не испускает новомодные события. Это - проблема.
я думаю, что самый чистый путь был бы сценарий диспетчера для 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
Основная проблема состояла в том, что ipv6 не был запущен даже при том, что интерфейс произошел.
Выполнение некоторого просмотра было предложение для запуска ipv6 модуля прямо во время начальной загрузки путем редактирования /etc/modules
.
Другое решение состоит в том, чтобы, предположительно, включить inactive-mode
в dibbler конфигурации /etc/dibbler/client.conf
, я хотел сделать это просто в новомодном сценарии, таким образом, вот .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. , Если кто-то знает, как обнаружить ipv6 состояние с событиями, которые были бы более чистым решением.
; 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 состояние с событиями, которые были бы более чистым решением.
Возможно, Вам нужно следующее, запускаются на:
start on net-device-up IFACE=eth0 ADDRFAM=inet6
альтернативно, можно использовать static-network-up для ожидания всех интерфейсов, чтобы произойти.