все что связано с моей работой
Главная » Unix » Порядок загрузки сервисов в FreeBSD.

Порядок загрузки сервисов в FreeBSD.

Предыстория. Игрался с OpenVPN, все получилось, все хорошо. Как оказалось до первой перезагрузки, после рестарта, PF отказывается загружать свои правила. Методом проб и ошибок выяснилось, что правила он пытается загрузить но там синтаксическая ошибка поэтому он их не грузит. Но при этом если после того как загрузилась система сделать

pfctl –f /etc/pf.conf

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

История. Почитав хендбук (как первое средство) наткнулся на то что загрузкой управляют несколько “тегов” описанных как комментарии вначале стартовых скриптов, а именно:

  • REQUIRE:
  • BEFORE:

Первый содержит список ОТ КОГО зависит сервис, второй КТО ОТ него зависит. Очень толковое описание процесса загрузки и управления им нашел в статье “Настройка локального cvsup (cvsupd) сервера”, вот кусок описывающий интересующий момент:

В FreeBSD 5.X появилась система rc.d с помощью этой системы я и буду наводить красоту. rc.d используется для старта системы. Кратко по этой системе можно почитать здесь.
Для того чтобы навести красоту мне также понадобиться поверхностное понимание работы утилиты "rc". Утилита "rc" это командный скрипт, который контролирует автоматическую загрузку процессов вызываемый init-ом. Этот скрипт "стартует"/"останавливает" демоны. В нескольких словах его работа выглядит так:

из /etc/rc.subr загружаются разные, нужные shell функции.
затем вызывает rcorder который "упорядочевает" файлы из /etc/rc.d пропуская файлы, имеющие ключевое слово "nostart" после этого созданный список файлов записывается в переменную.
затем в порядке созданным с помощью утилиты rcorder из /etc/rc.d вызывается каждый скрипт используя функцию run_rc_script() с параметром $1 равным "start".
И так резюмирую:
каталог /etc/rc.d предназначен для скриптов загрузки основных сервисов FreeBSD
управление загрузкой криптов из папки /etc/rc.d осуществляется с помощью основного системного конфигурационного файла "rc.conf", утилиты "rc".
порядок последовательности загрузки "демонов" и их зависимостей определяет утилита rcorder которая вызывается из "rc" скрипта, далее для загрузки каждого отдельного скрипта, "rc" использует функцию run_rc_script() определенную в файле rc.subr.
Каждый скрипт из /etc/rc.d для утилиты rcorder должен содержать специальные строчки, особенно строчку с словом "PROVIDE:" обязательную строчку "# KEYWORD: FreeBSD" и если необходимо, то строчки со словами "REQUIRE:" и "BEFORE:". Строчки должны располагаться в виде блока (одна за другой). Формат строчек строго заданный. Каждая специальная строчка должна начинаться с символа ‘#’ за которым следует один символ ‘пробел’ далее одно из слов PROVIDE:, REQUIRE:, BEFORE:, KEYWORD:, затем снова символ ‘пробел’ и заканчивается все "обстоятельствами" (conditions).

PROVIDE: Задает имя сервиса (демона), которое обслуживает этот скрипт.
REQUIRE: Список сервисов (демонов|обстоятельств), необходимых этому скрипту для запуска своего демона (сервиса).
BEFORE: Список сервисов (демонов|обстоятельств), зависящих от демона запускаемого этим скриптом.
KEYWORD: FreeBSD или NetBSD, также в этой строчке можно написать волшебное слово "nostart" тогда rcorder исключит этот скрипт из своего списка.

Обстоятельства (conditions) могут иметь специальные обозначения:
NETWORKING
SERVERS
DAEMON
LOGIN

NETWORKING: гарантирует запуск основных сетевых служб, за которые отвечают скрипты (network1, network2, network3).
SERVERS: гарантирует запуск основных сервисов таких как (NETWORKING, ppp-user, syslogd, and isdnd) которые должны стартовать раньше чем, например named. Ранний запуск служб SERVERS требуется для тех кто определен как DAEMON.
DAEMON: контрольная точка перед общими демонами, такими как lpd, ntpd.
LOGIN: контрольная точка перед "user login" службами (inetd, sshd).

Специальные “обстоятельства” (NETWORKING и тд) в системе существуют в виде файлов в /etc/rc.d/ которые состоят только из строк PROVIDE:, REQUIRE: и тд. Если копнуть PF то в нем обозначена загрузка после NETWORKING, в который можно добавить OpenVPN. Еще как вариант можно указать PF-у грузиться после OpenVPN или в OpenVPN добавить что от него зависит PF. Но т.к. OpenVPN зависит от DAEMON, а он в свою очередь от NETWORKING, то  самый простой способ это добавить в PF.

Комментариев нет

No comments yet.

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.