Как я могу запустить DHCP3-сервер позже, чтобы он ожидал инициализации интерфейса моста перед загрузкой?

8

У меня есть сервер Ubuntu 10.04, в настоящее время настроенный с dhcp3-сервером, а также мостовой интерфейс (br0) для использования с виртуальными машинами. У меня проблема в том, что когда сервер перезагружается, dhcp3-сервер не загружается из-за дополнительной задержки, вызванной подключением мостового интерфейса.

По существу, br0 не имеет IP-адреса для использования с DHCP3-сервером до конца цикла загрузки, а также после того, как DHCP3-сервер попытался загрузить.

После загрузки сервера я могу без проблем запустить /etc/init.d/dhcp3-server start.

Можно ли как-нибудь: - заставить dhcp3-сервер подождать, пока загрузится интерфейс, прежде чем пытаться загрузить? - запустить dhcp3-сервер после загрузки всего остального?

user2009
источник

Ответы:

9

Одним из решений является указание dhcp-серверу не запускаться автоматически, а затем добавьте в /etc/network/interfacesфайл следующие две строки для определения моста.

post-up /etc/init.d/dhcp3-server start
pre-down /etc/init.d/dhcp3-server stop

Так что в итоге это будет выглядеть так

iface br0 inet static
    bridge_ports eth0 eth1
    address 192.168.1.2
    broadcast 192.168.1.255
    netmask 255.255.255.0
    gateway 192.168.1.1
    post-up /etc/init.d/dhcp3-server start
    pre-down /etc/init.d/dhcp3-server stop

Таким образом, управление сетью (ifup / ifdown, НЕ network-manager) запустит DHCP-сервер после установки моста и выключит его перед удалением моста.

LassePoulsen
источник
Я проверил оба ответа, и это решение для пост-up / pre-down намного чище и удобнее в обновлении. Спасибо огромное за отличные предложения! Я искал все выше и ниже простое решение, подобное этому
user2009
Мое удовольствие;) Его всегда приятно ценить.
LassePoulsen
2

Вы можете изменить /etc/init.d/dhcp3-serverсценарий запуска, чтобы дождаться появления IP-адреса br0. Например: (Предупреждение: непроверенный код!)

# wait 5 secs between br0-ready tests
wait_time_between_probes=5
# maximum number of attempts (i.e., timeout)
max_attempts=10

log_progress_msg "Waiting for br0 to get an IP address"
for n in $(seq 1 $max_attempts); do
  if /sbin/ifconfig br0 | egrep -q "inet addr:" ; then
    # IP address ready on br0, exit loop
    break
  else
    sleep $wait_time_between_probes
  fi
done
if [ "$n" = "$max_attempts" ]; then
    log_warning_msg "Maximum number of attempts reached, but br0 has no IP address yet" 
    log_warning_msg "Continuing anyway but DHCP3 server might not start correctly"
fi 

Фрагмент должен войти в сценарий запуска, внутри case ... start)части, перед запуском демона DHCP3. Конечно, вы должны настроить время ожидания и количество попыток в соответствии с вашей средой (сколько времени займет максимум br0, чтобы получить IP-адрес?)

Риккардо Мурри
источник
Это определенно на правильном пути. Я поместил это сразу после "case" $ 1 "в начале)" в "/etc/init.d/dhcp3-server", однако условие "/ sbin / ifconfig br0 | fgrep -q" addr: "", похоже, успешно, даже без интерфейс моста онлайн. Ввод "/ sbin / ifconfig br0 | fgrep -q" addr: "" для терминала не дает вывода.
user2009
Также, хотя и тривиально, два log_warning_msg в конце скрипта будут отображаться независимо от успеха и неудачи. они будут лучше внутри журнала с оператором стиля if (max_attempts = n), чтобы правильно показывать эти сообщения при сбое?
user2009
Кроме того, для установления мостового интерфейса обычно требуется еще 5–10 секунд после загрузки интерфейсов, достаточно долго, чтобы dhcp3-сервер мог выйти из строя.
user2009
@ user2009 По поводу grep -qлинии: 1. Я думаю, что совпадение не удается, потому что мост получает адрес IPv6, как только он работает. Если вас интересует только адрес IPv4, просто замените grepстроку на grep -q 'inet addr:'(уже сделано выше); в противном случае необходимо найти более сложное регулярное выражение, которое соответствует всем возможным конечным IP-адресам вашего моста. 2. -qОпция подавляет вывод (точно так же > /dev/null)
Риккардо Мурри
@ user2009 спасибо за комментарий log_warning_msg; Я думаю, что я исправил это по вашему предложению
Риккардо Мурри