Для FreeBSD развивают новый системный менеджер rcd - QubStore

Для FreeBSD развивают новый системный менеджер rcd

Батист Даруссен, участник FreeBSD Core Team и создатель пакетного менеджера pkg, работает над новым системным менеджером rcd.

Новый инструмент перехватывает функции /etc/rc: его вызывает init, после чего rcd читает конфигурации сервисов из каталога /etc/rcd.d/*.ucl, выстраивает граф зависимостей и старается запускать службы параллельно, где это возможно. После старта менеджер продолжает следить за процессами и перезапускает их при сбоях.

Управлять сервисами и фоновым процессом можно двумя способами — отправляя команды напрямую в UNIX-сокет или через утилиту командной строки rctl. Описание сервисов ведётся в формате UCL — он напоминает конфиги nginx и bind, но дополнен элементами из JSON, что упрощает автоматическую обработку. Разработчик предусмотрел шаблоны для типовых unit-файлов и возможность писать встроенные обработчики на Lua.

Для примера unit для nginx задаёт имя и описание, тип «simple», команду запуска с аргументами, declares provides и requires, политику перезапуска (always, до 10 попыток, задержка 2000 мс, линейный backoff), параметры процесса (пользователь и группа www, cpuset 0-3) и ограничения rctl — запрет на потребление памяти свыше 2 ГБ и throttling CPU на 80%.

Вместо стандартных PID-файлов rcd отслеживает процессы через дескрипторы, которые возвращает системный вызов pdfork(). Поддерживаются активация сервиса только при подключении к сетевому сокету, защита критичных служб от принудительного завершения при нехватке памяти и обновление самого rcd на лету без потери состояния. Ресурсы ограничиваются через rctl, а для полной изоляции сервисы можно запускать в jail. Доступ к управляющему UNIX-сокету настраивается отдельно для каждого сервиса. Есть и поддержка перехода в спящий режим.

Ключевая особенность — полная обратная совместимость с существующей схемой rc.d. Rcd можно поставить на работающую систему: после перезагрузки всё продолжит работать как раньше, только загрузка ускорится за счёт параллельного старта служб. Это упрощает миграцию и позволяет постепенно переводить старые скрипты в unit-файлы. Для совместимости введён специальный тип «legacy»: rcd сканирует /etc/rc.d/ и /usr/local/etc/rc.d/, разбирает заголовки PROVIDE/REQUIRE/BEFORE/KEYWORD, читает rc.conf и превращает каждый скрипт в виртуальный legacy unit. Команды rcctl для таких unit-ов транслируются в старый формат — например, «rcctl reload sshd» приведёт к вызову «/etc/rc.d/sshd reload».

Ссылка на основную публикацию