LINUX.ORG.RU

systemd — новый подход к инициализации системы

 , , , ,


2

2

Lennart Poettering, сотрудник компании Red Hat, представил концепцию принципиально нового механизма управления инициализацией системы — systemd (system daemon), которая вобрала в себя достоинства классического System V init и более современных launchd (Mac OS X), SMF (Solaris) и Upstart (Ubuntu, Fedora), но при этом лишена многих их недостатков. В разработке этого проекта ему помогали сотрудники Red Hat, Novell, IBM, Intel и Nokia.

systemd опирается на современные linux-технологии: cgroups, AutoFS, D-Bus, и при этом совместим с исторически устоявшимися механизмами: init-скриптами, стандартными командами shutdown, poweroff и т.п. Предоставляемый systemd функционал позволяет заменить не только систему инициализации, но и ряд других подсистем, в частности, cron, (x)inetd, xdm/kdm/gdm/..., частично даже SELinux.

Основные идеи, использованные при создании systemd:

  • Контроль над сокетами. Многие демоны, запускаемые при инициализации, взаимодействуют с другими демонами через unix domain и сетевые сокеты, и большинство существующих систем инициализации запускают демона-клиента только после того, как демон-сервер запустится и создаст сокет. Вместо этого, systemd создает сокеты, а затем запускает демонов, передавая им эти сокеты. Даже если демон-клиент запустится быстрее и начнет использовать сокет раньше сервера, ничего страшного не произойдет: его запрос будет буферизован и передан серверу, как только тот сможет его обработать. Такой подход уже используется в Mac OS X (launchd), позволяя этой ОС достигать впечатляющей скорости загрузки.

    Аналогичный принцип используется systemd и при запуске служб, использующих шину D-Bus.

    Кроме того, возможен автоматический запуск служб при обращении к заданным сокетам (см. ниже).

  • Фоновое монтирование. Такие операции, как монтирование, проверка и активация квот файловых систем, занимают весьма значительную долю загрузочного времени. В большинстве современных систем они выполняются последовательно, до запуска всех демонов. systemd же предлагает монтировать не-жизненно-важные ФС только тогда, когда они кому-то понадобятся. Для этого используется механизм AutoFS. Например, многие служебные демоны вовсе не обязаны ждать, пока смонтируется огромный и к тому же зашифрованный /home.

    Разумеется, этот подход неприменим к /, /proc, /sys и т.п.

  • Минимизация числа вспомогательных процессов. В настоящее время значительная часть работ по инициализации производится шелл-скриптами, что приводит к колоссальным времязатратам. В частности, Леннарт пишет:

    On my system the scripts in /etc/init.d call grep at least 77 times. awk is called 92 times, cut 23 and sed 74,

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

    В качестве альтернативы Леннарт предлагает предлагает переписать критичные участки на C, а также вынести часть функционала в самих демонов и в systemd. Сейчас для systemd уже готовы написанные на C подсистемы монтирования и установки имени хоста. До полной победы, отмечает Леннарт, работа предстоит огромная, но результат того стоит.

  • Отслеживание процессов. В ныне используемых системах инициализации в принципе возможна такая ситуация, когда при неправильном форке процесс может «потеряться». Например, так может произойти с некорректно написанным CGI-приложением, и процесс останется работать даже после остановки веб-сервера.

    Для предотвращения таких ситуаций systemd использует интегрированный в ядро Linux механизм контрольных групп (cgroups). Если приложение не имеет доступа к псевдо-ФС, управляющей работой cgroups, то оно не может самостоятельно покинуть свою группу и «потеряться».

    Также к этой группе задач относится и автоматический перезапуск демонов, перенаправление их stdout/stderr на выбранные TTY или в системный журнал, регистрация всех запусков и остановок служб, и многое другое.

  • Ограничение процессов. systemd предоставляет множество возможностей ограничить или расширить полномочия процессов, контролируя такие параметры, как uid, gid, umask, рабочий и корневой каталоги, класс и приоритет CPU и I/O, наличие доступа на чтение и запись к смонтированным файловым системам и отдельным каталогам и т.п. Также можно использовать возможности по ограничению ресурсов, предоставляемые cgroups.

Базовым элементом systemd являются модули (units), которые связаны между собой и имеют определенный тип. Каждый модуль может требовать для своей работы другие модули, конфликтовать с модулями, запускаться только после или до определенного модуля (директивы конфигурации Requires, Conflicts, Before, After, Wants). Из типов модулей определены:

  • service — обычный демон, поддерживающий операции start, stop, restart, reload. Может быть представлен родным (native) файлом конфигурации systemd или System V init-скриптом.
  • socket. При обращении к сокету генерируется событие, для которого можно настроить обработчик. Например, автоматически запускать определенные службы при обращении к заданному сокету. В этом отношении systemd похож на давно известный (x)inetd, однако при этом поддерживает unix domain сокеты и FIFO.
  • device. Отметив нужные устройства в конфигурации udev, впоследствии можно использовать такие события, как появление и удаление устройства, в качестве событий systemd, назначив на них обработчики. Например, при появлении устройства bluetooth будет запущена соответствующая служба.
  • mount. systemd контролирует все точки монтирования файловых систем. В целях обратной совместимости поддерживается сбор информации о точках монтирования из /etc/fstab.
  • automount. Для помеченных таким образом точек монтирования, монтирование выполняется только при обращении к ним.
  • target. Более гибкий аналог уровней исполнения (runlevels), используемых в System V init. Представляет собой группу служб, объединенных по функциональному назначению. Например, multi-user.target идентичен runlevel 5, а bluetooth.target приводит к инициализации подсистемы bluetooth.
  • snapshot — во многом похож на target. Позволяет «запомнить» существующую конфигурацию units (запущенных служб, открытых сокетов, смонтированных ФС) с тем, чтобы в дальнейшем восстановить это состояние. Позволяет, например, перейти в emergency shell (сейчас это init 1), а затем полностью восстановить набор запущенных служб. Другой пример — выход системы из состояния suspend.

Надо заметить, что systemd отличается от SMF, во-первых, тем, что позволяет оперировать не только зависимостями между службами, но и событиями, например, «готовность устройства» или «обращение к сокету». Во-вторых, systemd использует более простой формат файлов конфигурации (.desktop aka .INI против XML в SMF).

От upstart же systemd отличается более высокой степенью параллелизации, и как следствие, более высокой скоростью загрузки. Например, если демон A требует для работы сокет, открытый демоном B, то upstart сначала запустит демона B, а затем демона A, в то время как systemd создаст сокет сам и запустит обоих демонов одновременно, что занимает примерно в два раза меньше времени. Используемый в upstart принцип, когда ключевыми событиями является лишь запуск и остановка демона, Леннарт и его коллеги считают изначально неэффективным.

Well, the point of the part about Upstart above was to show that the core design of Upstart is flawed, in our opinion. Starting completely from scratch suggests itself if the existing solution appears flawed in its core. However, note that we took a lot of inspiration from Upstart's code-base otherwise.

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

★★★★

Проверено: isden ()

Ответ на: комментарий от runtime

> В принципе позитивно, но несколько смущает, что Linux (как впрочем и любая другая крупная система) со временем начинает всё больше и больше усложняться. Впрочем, у нас всегда есть в запасе Slackware ;)

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

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

>А можно глупый вопрос - что происходит при убийстве инита? Ни разу не пробовал (:

Если послать SIGKILL — ничего, это я затупил.
А если он сам сдохнет — ядро запаникует.

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

> Я вот одного понять не могу - ну вот накой все сейчас прицепились к скорости загрузки системы и решили срочно всеми силами с рвением и упорством ее уменьшать?

Уже лет 5-7 как озаботились. В основном благодаря винде с её быстрой загрузкой.

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

> телефоны вообще не должны выключаться, имхо
Кроме телефонов есть туча других девайсов, у который время готовности к работе после включения желательно уменьшить. Например, спутниковые тюнера, точки доступа, телевизоры и прочие linux-managed девайсы... Область применения Linux не ограничивается серваками/десктопами/мобилами - про это забывают :)

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

>Не разочаровывайте меня. Мы ведь прекрасно знаем, что последствия при падении init например по segfault ничем не отличаются от падения systemd от того же sigfault...

Да, требования к качеству кода PID 1 в любом случае предъявляются жесткие. И тестировать systemd перед включением в промышленные дистры (если он доживет) будут очень жестко.

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

В логи ты полезешь уже постфактум, если что-то случится, и если допрешь где смотреть. Имхо, чем раньше вылезет сообщение о проблеме, тем лучше.

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

Насчет раньше - ну вот если сообщение вылезет при обращении к сервису - то как раз нормально, зачем раньше, может и не нужен этот сервис вообще. Можно конечно и раньше, но непонятно зачем, сидеть с nosplash/initdefault 3 и смотреть на бегущие строки думаю и так можно будет.

Ну и плюс можно же сказать, что этот сервис - НУЖЕН, игнорируя автоматику.

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

>телефоны вообще не должны выключаться, имхо

Да пожалуйста, некоторые и о компьютерах это говорят. Но где оно нужно тут как бы понятно.

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

Да? Ну я конечно Ъ, и по ссылкам не читал, но момент когда они сокет передают child-у у вас никаких вопросов не зызвал? Тут, что, только школьники обритают, или у меня ФГМ? Мне показалось, что без переделки демонов ничего у друзей не выйдет. Обычно демону можно только путь передать, как максимум, к UNIX-сокету. Где вы видели демон с указанием номера FD для работы? Через /proc?

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

>Но какой бывает облом, когда в логах ничего нет, потому что все было сказано на консоль, а консоль очистилась.

Это да, но насколько понимаю, тут отдельная проблема — fsck некуда положить логи, на раздел же писать нельзя.

Насчет раньше - ну вот если сообщение вылезет при обращении к сервису - то как раз нормально, зачем раньше, может и не нужен этот сервис вообще.

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

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

Ну Леннарт вроде пишет что там конфигурировать вообще ничего не нужно будет. По идее достаточно описать какие зависимости у демона есть, с чем он конфликтует и что «предоставляет» и этого достаточно, чтобы системд сам выбрал что когда запускать. Ну еще может понадобиться указать что должно быть запущено к концу инициализации. В апстарте когда что запускать надо ручками прописывать.

eugene2k ()

Ожидать от автора совершенно калечного именно в дизайне, прямо в ДНК, PulseAudio, чего-то путного не приходится.

alukin ()

Этому засранцу мало пульса? Нагородил костылей, теперь еще до инита свои лохматые ручонки тянет? Нет пути!

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

> 30 лет init-скрипты работали и всех устраивали, но в 2010 году ВНЕЗАПНО

линукс пришёл на десктоп, где аптайм не измеряется годами, а юзеры не пишут индусские init-скрипты.

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

>> 30 лет init-скрипты работали и всех устраивали, но в 2010 году ВНЕЗАПНО

линукс пришёл на десктоп, где аптайм не измеряется годами

Эээ... и что? Где пойнт экономить 20сек, если аптайм хотя бы 8ч?

а юзеры не пишут индусские init-скрипты.

Как пользователь, я вообще не писал init-скриптов. Как разработчик - я рад, что писать их надо на shell, а не на Си.

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

>Я уже мысленно представила это: системный адимнистратор перенес спул сендмайла куда-нибудь на другйю файловую систему, после чего сендмайл проснулся и не нашел своего спула, ибо файловая систем «монтируется в фоне». Фантастическое и феерическое зрелище...

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

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

>зато init-скрипты поправить можно =) А если в его магическом init на C баг ?

Скрипт-киддисы забыли, что исходный код приложения на C элементарно правится в текстовом редакторе?

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

>> зато init-скрипты поправить можно =) А если в его магическом init на C баг ?

Скрипт-киддисы забыли, что исходный код приложения на C элементарно правится в текстовом редакторе?

Крутые Си-хакеры забыли, что Си-код после этого надо компилировать компилятором, которого на машине може не быть? :)

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

>Как разработчик - я рад, что писать их надо на shell, а не на Си.

Скажите, а вам чалма не мешает?

anonymous ()

>В качестве альтернативы Леннарт предлагает предлагает переписать критичные участки на C, а также вынести часть функционала в самих демонов и в systemd. Сейчас для systemd уже готовы написанные на C подсистемы монтирования и установки имени хоста. До полной победы, отмечает Леннарт, работа предстоит огромная, но результат того стоит.

Красноглазый поц. На ассемблере перепишет пусть.

r ★★★★★ ()

Оно лучше чем openrc?
Чем?
Нет ещё странички где-нибудь в вики (любой), где сравниваются различные системы инициализации?

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

>ри неправильном конфигурировании (переусердствовать с запуском демонов только по требованию)

При неправильном конфигурировании его ассемблера будет BSOD во время загрузки и «переустановите ваш линдовс».

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

>> Как разработчик - я рад, что писать их надо на shell, а не на Си.

Скажите, а вам чалма не мешает?

Нет, а вам?

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

>Красноглазый поц. На ассемблере перепишет пусть.

А ведь по-правильному, на джаве их надо пейсать. А еще можно на C#. Вот это будет ни разу не красноглазие.

anonymous ()

Lennart Poettering

Хоть кто-нибудь, наконец-то, научите этого человека онанизму.

Он же страдает.

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

>Да, от создателя PulseAudio это звучит особенно убедительно.

Это тот самый поц из-за которого ото виндовозное изделие появилось? Я после появления пульса начал ощущать виндовозность исстемы - отключить это уродство полностью можно только переустановив сисстему - потому что оно лезет во столько мест что их найти все - это звездец а удаление за собой не убирает.

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

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

Если так как они сделали с глюкомонстропульсом - то спасибо им с кисточкой.

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

Ну, upstrart этим, возможно, и страдает, но только когда настройка не соответствует возможностям машины. На моём новом домашнем компе Ubuntu-10.04 взлетала ну, не мгновенно, но «я считаю до 5...» У сына PSP'шка дольше грузится. А вот Федора-13 Beta что-то как-то тормозит на взлёте - что-то около 30 секунд до GDM'ного логин-промпта... И это при том, что я уже всё, что можно и нельзя, включая портмаппер, поотключал...

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

> но момент когда они сокет передают child-у у вас никаких вопросов не зызвал?

В тексте новости не написано, что сокет передаётся child'у. И большинство локальных сервисов можно перевести на UNIX-сокеты, на то они и сервисы.

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

>А если в его магическом init на C баг ?

Будешь дать сервис пака.

r ★★★★★ ()

Я так понимаю BSD-init похоронили окончательно?

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

>>Да, от создателя PulseAudio это звучит особенно убедительно.

Это тот самый поц из-за которого ото виндовозное изделие появилось?

Тот самый. Ему в комментах писали: «Леннарт, ты сломал нам сеть, потом звук, а сейчас хочешь сломать вообще всё сразу?».

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

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

И если что не так BSOD и переустановите систему.

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

Ну, шелльные скрипты - штука и впрямь неторопливая. Особенно, если для выкусывания подстроки из строки использовать разом и grep, и sed, и так по пять раз на строчке :) Только при чём тут C?...

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

>линукс пришёл на десктоп, где аптайм не измеряется годами, а юзеры не пишут индусские init-скрипты.

И что? Тебе минуту подождать тяжело?

r ★★★★★ ()

>systemd — новый подход к инициализации системы

хорошее начинание

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

Как будто сейчас init не на C написан... Вы прям как маленькие дети :) Другое дело, что по мере усложнения /sbin/init, тем более, при встраивании туда более-менее приличного и _полезного_ _новоизобретённого_ DSL'я, увеличиваются шансы проглядеть багу. Но тогда, конечно, да, ждать сервис-пака :)

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

> Ну, шелльные скрипты - штука и впрямь неторопливая. Особенно, если для выкусывания подстроки из строки использовать разом и grep, и sed, и так по пять раз на строчке :)

Только вот данные должны быть мегабайтные, чтобы ты ощутил разницу.

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

>Ну, шелльные скрипты - штука и впрямь неторопливая. Особенно, если для выкусывания подстроки из строки использовать разом и grep, и sed, и так по пять раз на строчке :) Только при чём тут C?...

Вот и я о чем. А если человека слово оптимизация === переписать на С - томми забери его к себе.

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

Да, разумеется. А чем он хорош для случая, например, установки на ноутбуке (то есть, когда рабочее окружение может меняться непредсказуемо или близко к тому, а пользователь далёк от изучения тонкостей настроек всеразличных сервисов)?

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

> И что? Тебе минуту подождать тяжело?

Ну представьте картину: в будущем покупаете плазму (например Филлипс), дома врубаете в розетку, жмакаете кнопку включения... и после минуты ожидания делитесь с нами впечатлениями, тяжело ли было ждать эту минуту (и что при этом комментировала жена на покупку телека за 1к баксов).

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

У меня на домашнем ноуте аптайм - утром полчаса, вечером пару часов. Не все приходят со школы и 8 часов дро^чатяцца до ночи.

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

И да, как пользователю, мне пофиг, чему там рад разработчик. Система запускает лишнуюю 1000 процессов во время загрузки? Fail. Пишем минус линуксу, плюс макоси.

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

>Ну представьте картину: в будущем покупаете плазму (например Филлипс), дома врубаете в розетку, жмакаете кнопку включения... и после минуты ожидания делитесь с нами впечатлениями, тяжело ли было ждать эту минуту (и что при этом комментировала жена на покупку телека за 1к баксов).

Я когда включаю телик - из-за того что это случается редки - мой DVBшник пять минут договаривается с провайдером чтобы его пустили. Плазма загружающяся минуту меня не напряжет. Меня напряжет когда вместо could not mount, или command not found: mount.zfs начнуться unexpected signal 11. Segmentation fault и эту плазму я вообще включить не смогу.

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

> И что? Тебе минуту подождать тяжело?

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

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

не-не-не, Дэвид Блэйн...

Я ощущал разницу уже на выполняющемся несколько секунд шелльном скрипте с большим количеством тексто-ориентированной логики внутри. Простая замена grep+sed на билт-ин башизмы давала заметный прирост скорости. Правда, переезд на perl дал бы, думаю, существенно лучший результат.

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

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

Я пользуюсь симанкой. Ы?

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

> Я ощущал разницу уже на выполняющемся несколько секунд шелльном скрипте с большим количеством тексто-ориентированной логики внутри. Простая замена grep+sed на билт-ин башизмы давала заметный прирост скорости.

Для этого и grep, и sed должны быть в глубоком цикле - опять же нетипично для init-скрипта.

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

:>В качестве альтернативы Леннарт предлагает предлагает переписать критичные участки на C, а также вынести часть функционала в самих демонов и в systemd.

:А не помешает ли это самостоятельному написанию init-скриптов?

А много ли этих скриптов вы написали? :)

По идее, «пускач» всей этой лабуды всё равно какой, всё управление должно задаваться через конфиги. Чем шустрее загрузчик, тем быстрее он доедет до станции «Вендекапецовка».
:)

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

> Я

Да ради бога. А вот миллионы юзеров перешли на хром только потому, что он быстро стартует (пруф в виде «а вот фф долго стартует» здесь в тредах), даже несмотря на его опаньки, урезанную функциональность, и отсутствие аддонов. Всё ещё настаиваешь, что быстрый запуск (компьютера, в том числе) никому не нужен?

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