LINUX.ORG.RU
ФорумAdmin

Ожидание готовности сети при старте Демона

 , ,


1

1

Уповаю на Вашу помощь, уважаемые гуру!

Помогите грамотно настроить старт демона с ожиданием инициализации сети. Может быть ему как-то можно прописать зависимости или сделать его старт в фоновом режиме ... пусть тогда себе спокойно спит 30 ctreyl пока сеть поднимется, а система при этом будет уже в состоянии готовности.

Подробности: Есть демон (MediaTomb), который запускается последним, перед запросом логина и пароля. Проблема в том, что ему для нормального старта требуется не просто наличие соединения, но и наличие IP адреса, инициализация и назначение IP адреса роутером занимает некоторое время. В результате демон благополучно рапортует об ошибке и не стартует. Если войти пользователем и запустить его вручную, то он работает и не капризничает. Более того раскопал скрипт инициализации демона в \etc\init.d\mediatomb и добавив в него простой «sleep 30» получил благополучно стартующий демон ... но это костыль, который к тому же делает загрузку компьютера существенно более долгой (вся система стартует за сопоставимое время а потом просто столько же времени тупо стоит иждет демона). Попробовал другой подход, написал скрипт который циклично запускает ifconfig и если в нем присутствует нужный IP, то переходит к инициализации демона иначе включает «sleep 1» и снова проверка ... но тут меня подстерегала засада, прописывать в скрипте фиксированный IP неправильно а при помощи grep проверить имя интерфейся и наличие IP по маске не получается - они на разных строчках, а grep оперирует только одной строкой (во всяком случае мне его не удалось заставить искать регулярное выражение включающее перевод строки)

Подозреваю, что должно быть более изящный способ решения данного вопроса.

Увы сам демон не в состоянии запуститься и ожидать готовности сети (во всяком случае мне не удалось найти соответствующих настроек).

P.S. Поиск пользовал, но видимо искал не то или не там. Если ответ очевиден, то просто подскажите что искать, правильный термин или что-то, что более менее точно выведет на решение.

Укажите в LSB-заголовке init-cкрипта:
# Required-Start: networking
# Required-Stop: networking

И запустите insserv, чтобы переопределить зависимости.

У Вас же сеть настроена через /etc/network/interfaces, да?

AITap ★★★★★ ()
Ответ на: комментарий от AITap

Если судить по наличию указанного файла, то да, он есть. В нем всего 4 строчки: две на loopback и две на сетевую карту.

Ставил Debian v6.0.6 amd64 в режиме expert, но по сути дефолтный без каких либо программных пакетов. Так сказать минимальная инсталляция.

Сейчас у демона прописано: # Required-Start: $local_fs $network $remote_fs # Required-Stop: $local_fs $network $remote_fs

Возникает вопрос а как правильно должны быть прописаны зависимости ... тоже изначально пытался копать в эту сторону (и самое ведь обидное, по Дебиану документация супер), не смог найти нужную информацию.

Пробую рекоменованный параметр

P.S. Спасибо за оперативный ответ!

Tanatos ()
Ответ на: комментарий от Tanatos

# Required-Start: $local_fs $network $remote_fs
# Required-Stop: $local_fs $network $remote_fs

Этого должно быть достаточно. Как добавляли скрипт в автозагрузку?

AITap ★★★★★ ()
Ответ на: комментарий от AITap

никак, он был создан автоматом при установки соответствующего пакета. Сейчас проверил, с предложенным вариантом зависимостей ... результат - демон отвалился как и раньше. В логах ничего подозрительного не нашел. Сеть то поднимается нормально и сам демон работает (если запускать после инициализации сети)

Tanatos ()
Ответ на: комментарий от Tanatos

Попробуйте загрузиться в recovery mode и провести опыт:
ifdown eth0
ifup -v eth0
Сеть появится сразу же после завершения ifup, или система будет в фоне ещё получать IP-адрес?

AITap ★★★★★ ()
Ответ на: комментарий от AITap

Может быть проблема в том что на низком уровне сеть инициализируется, т.е. eth0 существует, но IP еще не выделен ... проверял вызовом ifconfig в момент старта скрипта

Tanatos ()
Ответ на: комментарий от AITap

ifup отработал примерно за 5-6 секунд.

содержимое /etc/network/interfaces (опуская комментарии): auto lo iface lo inet loopback allow-hotplug eth0 iface eth0 inet dhcp

Tanatos ()
Ответ на: комментарий от Tanatos

Так вот, сразу после ifup связь с сетью есть? Имеет ли eth0 правильный адрес (ip addr show dev eth0), записан ли правильный default route (ip route), DNS-сервер (cat /etc/resolv.conf)?

AITap ★★★★★ ()
Ответ на: комментарий от AITap

да, проверял по ifconfig, все поля корректные. Но в момент старта скрипта инициализации демона IP еще нет.

В скрипт прописал:

ifconfig

sleep 30

ifconfig

Так вот вывод до и после спячки отличается. До спячки eth0 есть, но нет IP, Bcast, Mask. А соответственно после они уже есть.

Tanatos ()
Ответ на: комментарий от AITap

Попробуйте запустить insserv -v mediatomb.

Уже делал. Выше вы же писали про эту команду. По ману запускал именно с этим ключем. Правда сейчас стоит networking, попробую еще вернуть старый вариант и презапустить.

Содержимое:

README

S02cron

S02openbsd-inetd

S04mediatomb

S04stop-bootlogd

S01rsyslog

S02dbus

S02pure-ftpd

S04rc.local

S02acpid

S02gpm

S03bootlogs

S04rmnologin

Tanatos ()
Ответ на: комментарий от Tanatos

Так, а networking вообще запускается на runlevel S. Очень странно.

Попробуйте дописать VERBOSE=yes в /etc/default/networking и убедиться, что на этапе «Configuring network interfaces» интерфейс поднимается и получает адрес.

AITap ★★★★★ ()
Ответ на: комментарий от Tanatos

Сорри, туплю. Второй файл это совсем не то ... попутал с /network/interfaces. Но указанного Вами файла у меня нет. Попробую создать

Tanatos ()
Ответ на: комментарий от AITap

В логах следующие записи (выборочно) из syslog

00:09:48 Server acpid: starting up with netlink and the input layer

00:09:48 Server dhclient: бла бла бла

далее несколько записей о том как шел процесс и заключительные

00:09:52 Server dhclient: DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 6

00:09:52 Server dhclient: DHCPOFFER from 192.168.1.1

00:09:52 Server dhclient: DHCPREQUEST on eth0 to 255.255.255.255 port 67

00:09:52 Server dhclient: DHCPACK from 192.168.1.1

00:09:52 Server dhclient: bound to 192.168.1.179 — renewal in 36490 seconds

Если я правильно понял, то адрес благополучно получен ... однако ifconfig в скрипте демона упорно сообщает об отсутствии IP адреса.

eth0 Link encap: Ethernet HWaddr ...................

UP BROADCAST MULTICAST MTU:1500 Metric:1

всякие RX TX опустим

Interrupt:27 Base address:0x8000

Tanatos ()
Ответ на: комментарий от Tanatos

Забавно. Получилось, что кто-то опускает интерфейс, но потом снова поднимает. Ведь не NetworkManager же?

Попробуйте заставить init-скрипт писать в syslog при помощи logger. Так можно будет отследить время его работы.

AITap ★★★★★ ()
Ответ на: комментарий от AITap

Сейчас попробую. В файле dmesg нашел любопытные записи:

[10.692431] r8169 0000:03:00.0: eth0: link down

[10.692460] r8169 0000:03:00.0: eth0: link down

[10.692817] ADDRCONF(NETDEV_UP): eth0: link is not ready

Tanatos ()
Ответ на: комментарий от AITap

Прошу прощения, а можно поподробней про logger ... кажестя я как-то не так его заюзал, система подвисла при загрузке, буду вырезать теперь

Tanatos ()
Ответ на: комментарий от AITap

Все, разобрался. Судя по записям демон стартует в процессе инициализации соединения. В логе присутствует запись о начале обмена данными с dhcp, затем запись, что стартует демон, затем через пару секунд ответ от DHCP с назначением адресов.

Tanatos ()
Ответ на: комментарий от AITap

Покапался в каталогах и еще нашел следующие ссылки на скрипт инициализации:

/etc/rc0.d/K01mediatomb

/etc/rc1.d/K01mediatomb

/etc/rc2.d/S04mediatomb

/etc/rc3.d/S04mediatomb

/etc/rc4.d/S04mediatomb

/etc/rc5.d/S04mediatomb

/etc/rc6.d/K01mediatomb

Если мне память не изменяет это типы инициализации системы и стартует только один из .... или все таки какой-то из этих скриптов стартует раньше?

Tanatos ()
Ответ на: комментарий от Tanatos

default runlevel по умолчанию в Debian равен 2. На нём четвёртым по порядку запускается mediatomb, как и на 3..5. На 0 (выключение), 1 (single-user mode) и 6 (перезагрузка) mediatomb первым останавливается.

Это очень странно, что mediatomb запускается параллельно с networking, от которого зависит. Или...
Попробуйте:
# Should-Start: $network
И снова запустить insserv.

AITap ★★★★★ ()
Ответ на: комментарий от AITap

там вообще было прописано «$all». Попробовал как вы сказали, ничего не поменялось. Вернул обратно. Судя по тому, что менялось S04... -> S01... -> S04... при последних изменениях зависимости обрабатываются ... но как-то криво. Самое интересное, что система то чистая. Только MediaTomb и поставил ... да еще pure-ftpd, но он точно непричем, т.к. до него все было тоже самое. попробую еще паралельно на виртуалке тоже самое поднять

Tanatos ()
Ответ на: комментарий от AITap

На виртуалке с чистой системой ровно тоже самое с точностью до долей секунд.

Tanatos ()
Ответ на: комментарий от Tanatos

Мне кажется, это повод отправить багрепорт. Система не должна запускать init-скрипты следующего уровня, пока не достигнут предыдущий. init-скрипт сети не должен завершаться, пока интерфейсы не подняты. Благо, проблема легко воспроизводится.

В качестве временного решения могу предложить # X-Interactive: true для networking и mediatomb (чтобы они не выполнялись параллельно; может не сработать), или даже вовсе отключить параллелизм (touch /etc/init.d/.legacy-bootordering).

AITap ★★★★★ ()
Ответ на: комментарий от AITap

Пока в качестве решения можно и sleep попользовать ... благо судя по нашим с Вами разбирательствам ему должно хватить и 10 секунд.

Спасибо за помощь и оперативный отклик! Пополнил багаж знаний. Буду писать рапорт.

Tanatos ()

Если городить костыли, то лучше уж поставить upstart. Он умеет сам запускать конфиги по готовности сети.

xpahos ★★★★★ ()
Ответ на: комментарий от xpahos

но тогда надо удалять sysvinit ... честно говоря мне не хочется разбираться с еще одним пакетом ... голова и так кругом идет, а в преди еще тьма приложений которе необходимо подобрать и настроить для домашнего сервака. Но все равно спасибо за совет. Если костыль будет стоять долго, то может и перееду на upstart

Tanatos ()
Ответ на: комментарий от xpahos

Если и могут, то как то не очевидно, поскольку aptitude требует снести sysvinit и вариантов разрешения конфликтов не предлагает (кроме оставить все как есть и не ставить upstart) ... в любом случае я пока морально не готов к таким глобальным заменам.

В любом случае спасибо за совет, приму к сведению. Может позже к нему вернусь.

Tanatos ()

Решение вопроса!!!

Правильным оказалось сделать следующее:

  • в /etc/networking/if-up.d создаем скрипт следующего содержания:
    #! /bin/sh
    /etc/init.d/<имя демона> start
  • задаем права для скрипта chmod +x /etc/networking/if-up.d/<имя скрипта>
  • удаляем все упоминания из папок вида /etc/rc1.d/<имя демона> соответственно rc2 ... rc6
  • перезагружаемся и радуемся жизни

Решение со слов человека проффесионально занимающегося поддержкой серверов на Debian.

Tanatos ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.