Батист Даруссен (Baptiste Daroussin), член FreeBSD Core Team и автор пакетного менеджера pkg, развивает новый системный менеджер для FreeBSD - rcd. Системный менеджер rcd вызывается init-процессом вместо /etc/rc, читает файлы конфигурации сервисов (/etc/rcd.d/*.ucl), строит дерево зависимостей и запускает сервисы по возможности параллельно друг с другом, после чего отслеживает работу сервисов и при необходимости их перезапускает.
Управление фоновым процессом и операции с сервисами может осуществляться через прямую передачу команд в UNIX-сокет или при помощи утилиты командной строки rctl. Unit-файлы с параметрами сервисов оформляются в формате UCL, который напоминает формат файлов конфигурации nginx и bind с элементами для упрощения автоматизированной обработки, заимствованными из JSON. Предоставляется возможность создания шаблонов типовых unit-файлов и написания встроенных обработчиков на языке Lua. Пример unit-файла для запуска nginx:
name = "nginx";
description = "Nginx HTTP Server";
type = "simple";
command = "/usr/local/sbin/nginx";
command_args = "-g 'daemon off;'";
provides = ["nginx", "http"];
requires = ["NETWORKING", "sshd"];
restart {
policy = "always";
max_retries = 10;
delay = 2000;
backoff = "linear";
}
process {
user = "www";
group = "www";
cpuset = "0-3";
}
rctl {
memoryuse = { action = "deny"; amount = "2g"; };
pcpu = { action = "throttle"; amount = "80"; };
}
Вместо работы с PID-файлами отслеживание активности запущенных процессов осуществляется с использованием дескрипторов, возвращаемых системным вызовом pdfork(). Имеется поддержка активации сервисов только при обращении к сетевому сокету и возможность защиты важных сервисов от принудительного завершения в случае нехватки памяти в системе. Возможно обновление версии фонового процесса rcd на лету без потери состояния.
Для ограничения доступных сервису ресурсов применяется rctl, а для полной изоляции сервисов поддерживается их запуск в jail-окружениях. Возможна настройка доступа к управляющему UNIX-сокету в привязке к отдельным сервисам. Поддерживается переход в спящий режим.
Системный менеджер полностью обратно совместим с существующей системой последовательного запуска сервисов rc.d и может работать без изменения имеющихся rc.d-скриптов и файлов конфигурации. Достаточно установить rcd на работающую систему и после перезапуска всё продолжит функционировать как раньше, за исключением сокращения времени загрузки за счёт распаралелливания запуска сервисов. Подобная совместимость упростит миграцию систем на rcd и даст возможность постепенно переводить в формат unit-файлов имеющиеся rc.d-скрипты.
Для совместимости с rc.d поддерживается специальный тип 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".
Источник: https://www.opennet.ru/opennews/art.shtml?num=66245




