LINUX.ORG.RU

Первый публичный выпуск минималистичной системы инициализации Nitro

 , nitro,


0

6

Состоялся первый публичный выпуск нового проекта Nitro, развивающего минималистичную систему инициализации c функциями контроля над выполнением процессов. Проект развивает Лия Нойкирхен (Leah Neukirchen), одна из сопровождающих пакеты в дистрибутиве Void Linux. Код написан на языке Си и распространяется под лицензией 0BSD.

Nitro может применяться как в качестве init-процесса (pid 1), так и в форме непривилегированного процесса, контролирующего бесперебойное выполнение приложений в пространстве пользователя и перезапускающего задачи в случае сбоев. Поддерживается работа в Linux и FreeBSD, возможно применение в окружениях на базе стандартной Си-библиотеки Musl. В качестве областей применения упоминаются встраиваемые системы, образы ram-дисков (initramfs), контейнеры (Docker/Podman/LXC/Kubernetes), а также рабочие станции и серверные системы. Для управления работой сервисов и взаимодействия с init-процессом поставляется утилита командной строки nitroctl.

Вместо составных скриптов инициализации в Nitro применяется модель на основе выноса каждой функции в отдельный скрипт. Для каждого сервиса в иерархии /etc/nitro создаётся подкаталог, в котором могут размещаться следующие скрипты: setup - содержит команды, выполняемые до запуска сервиса; run - определяет сценарий запуска сервиса; finish - включает команды, выполняемые после завершения сервиса. Для организации ведения лога применяется символическая ссылка с именем log, указывающая на другой сервис, которому будет перенаправлен вывод. Для отключения автозапуска сервиса достаточно создать в его каталоге файл с именем «down», а для игнорирования сервиса следует добавить символ «@» к имени каталога.

Автором проекта отмечаются следующие достоинства Nitro по сравнению с другими системами инициализации:

  • Всё состояние хранится в ОЗУ, что упрощает работу в окружениях c дисковыми разделами в режиме только для чтения.
  • Архитектура на основе обработки событий, не использующая опрос в режиме полинга (polling).
  • Отсутствие операций выделения памяти во время работы (все буферы выделяются при запуске).
  • Ограниченное использование файловых дескрипторов во время работы.
  • Поставка в форме одного самодостаточного исполняемого файла и утилиты для управления системой.
  • Отсутствие стадий компиляции конфигурации - работу сервиса определяют простые скрипты в связанном с сервисом каталоге.
  • Наличие функции перезапуска сервисов после сбоя.
  • Наличие механизма ведения логов, которые могут включаться как по умолчанию, так и выборочно для отдельных сервисов.
  • Возможность построения цепочки обработки лога, охватывающей несколько сервисов.
  • Работа не зависит от точности выставления системных часов.
  • Поддержка запуска во FreeBSD через /etc/ttys.
  • Возможность сборки в форме миниатюрного статически скомпилированного исполняемого файла при использовании musl libc.

>>> Подробности на opennet

★★★★

Проверено: cetjs2 ()
Последнее исправление: dataman (всего исправлений: 4)
Ответ на: комментарий от zurg

Именно чтобы не было холостой долбёжки проца

Проц долбится всегда.

Вот проверять в цикле

Так inotify так и делает, лол.

можешь просто ещё и пропустить событие

Google: inotify missing events

Че ты доигрался до файла. Да пох: создание файла, прилет сигнала на шину d-bus, появление данных на последовательном порту - без разницы. Везде «мониторинг» реализован одинаково - блокирующим while.

И да, реализации вышеупомянутых «watch'ей» наверное юзают\рекомендуют юзать многопоточность, чтобы проц не долбить :))

- Папа, покажи мне многозадачность виндовса.

- Ща сына, только флоппи-диск отформатируется.

windows10 ★★★★★
()

полезла в репы посмотреть, что там за код. а там из кода всего два сишных файлика. выглядит заманчиво! надо будет потыкать палочкой на досуге.

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

спокойно! есть eudev. до появления ненужно-д всё работало, и сейчас всё прекрасно работает без ненужно-д.

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

Так inotify так и делает, лол.

Нет, не так он это делает. Как минимум не мучает систему непрерывными бессмысленными, но дорогими системными вызововами файловой системы

Везде «мониторинг» реализован одинаково - блокирующим while.

Не везде, ключевое тут блокировка, а не цикл

zurg
()
Последнее исправление: zurg (всего исправлений: 1)
Ответ на: комментарий от zurg

Нет, не так он это делает. Как минимум не мучает систему непрерывными бессмысленными, но дорогими системными вызововами файловой системы

Нет он делает именно так. В самом что ни на есть настоящем цикле while.

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

Да, он не гоняет в цикле что-то типа

while (file_exists("/tmp/examle_file")) {
 }
printf ("File created");

Взамен этого он (в смысле inotify) гоняет цикл типа

while ((fanotify->events->target!="/tmp/example_file") and (fanotify->events->event!=FAN_MODIFY)) {
 }
printf ("File created");

А этот самый fanotify->events->target и fanotify->events->event заполняет функция ФС создающая или модифицирующая файл.

Да, накладных расходов меньше. Но мое изначальное утверждение этим не отменяется.

Ну нет НИ В ОДНОМ ЯЗЫКЕ ПРОГРАММИРОВАНИЯ алгоритмической возможности читать изменяющиеся значения чего угодно, без циклических проверок этого значения. Пофиг что это за значение - результат функции, или переменная которую заполняют другие функции. Без цикла - никак.

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

Если например твоя функция в любом ЯП к примеру создаст окно, в нем нажимаемую простую кнопку, а потом уйдет в условный sleep, или в любой цикл - кнопка не будет обрабатываться (и интерфейс не отрисуется).

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

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

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

zurg
()
Последнее исправление: zurg (всего исправлений: 1)
Ответ на: комментарий от zurg

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

Можно примерный алгоритм кода, который вызывает колбэк при изменении любого объекта?

Абстрагируемся от файловой системы !

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

windows10 ★★★★★
()
Ответ на: комментарий от u-235

Так же, как электромагнитную индукцию?

Не шлангуй, я уже скинул тебе пример. Вот еще один: https://ibb.co/6qC2cN9

Везде «наблюдение» происходит с блокированием потока по причине использования цикла while.

А давай fanotify разберем?

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

Везде «наблюдение» происходит с блокированием потока по причине использования цикла while.

Значит man inotify ты не читал.

u-235
()
Ответ на: комментарий от u-235

А что там у него с электромагнитно индукцией?

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

Вот ещё, учебники ретранслировать, сам читай про синхроные асинхронные интерфейсы, многозадачность операционки, IPC, прерывания. Таненбаум, говорят, неплох.

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

Вот ещё, учебники ретранслировать

Ну почему же. Вон я ретранслировал целый man inotify.

Там тоже через бесконечный цикл.

синхроные асинхронные интерфейсы, многозадачность операционки, IPC, прерывания

Они не отменяют моего изначального утверждения: нет никаких «обработок событий» - есть примитивная долбежка опросов в цикле.

windows10 ★★★★★
()
Последнее исправление: windows10 (всего исправлений: 1)
Ответ на: комментарий от windows10

Ты запутался в терминологии, потому что поллингом называют разные вещи.

это какая-то магия, а не периодическое опрашивание любого состояния

Это обычно не периодический опрос, но и не магия. Там просто вызывается одна из функций мультиплексирования ввода-вывода, типа poll(). Нижележащий системный вызов укладывает поток в сон. Пока не наступит какое-то из ожидаемых событий, ядро поток не исполняет, поэтому он не потребляет такты CPU. Ядро разбудит поток, когда произойдёт одно из событий, о которых пользовательский процесс заранее рассказывает ядру.

Это иногда называют поллингом, потому что вот так сложилось. При этом поллинге процесс значительную часть времени спит.

while (access(file, F_OK) != 0){}

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

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

i-rinat ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.