SysV, Выскочка и systemd init сосуществование сценария

В моей системе (16.04), существуют файлы /lib/systemd/system/network-manager.service и /etc/init.d/network-manager, например.

Я не понимаю, как (и почему) это работает. Я всегда перезапускаю Администратора сети sudo service network-manager restart. Разве это не должно портить systemd так или иначе? Это все еще, кажется, работает.

Почему делает service --status-all перечислить все виды сервисов? Разве 16.04 не должен использовать systemd вместо Выскочки?

Кто-то объясните, как это сосуществование работает.

14
задан 20 May 2017 в 16:54

1 ответ

Только одна init система может быть активной сразу. На 16,04, это - systemd.

Много пакетов поставлются с файлами для нескольких init систем, таким образом, ими можно управлять с несколькими init системами на различных Ose. На Ubuntu иногда установлены сценарии для нескольких init систем, даже при том, что они все не используются одновременно.

Более новые init системы пытаются поддержать совместимость с более старыми. В частности, systemd пытается поддержать совместимость и с Выскочкой и со сценариями SysV init.

В случае "init.d" сценария Вы упомянули, это - сценарий "SysV" init, не Новомодный сценарий. Кроме того, сценарии "SysV" init были бы только запущены на начальной загрузке, если бы они были symlinked к каталогу как "/etc/rc5.d". Вы найдете, что Администратор сети не делает , установили символьную ссылку там.

, Чтобы понять, как systemd управляет старыми сценариями "SysV" init, см. , Как systemd использует/etc/init.d сценарии? .

Теперь, для ответа на вопрос о том, почему это работает для перезапуска Администратора сети с "сервисным перезапуском администратора сети". Эти service команда используется и с Новомодными сценариями и со сценариями SysV init, предпочитая первого. Администратору сети также установили Новомодный сценарий на 16,04 в /etc/init/network-manager.conf.

при рассмотрении вывода sudo strace service network-manager restart можно получить смысл того, что происходит. Во-первых, вывод показывает, что systemctl называется, указывая, что команда перенаправляется к systemd. Во-первых, вскоре после того, как это открывает /usr/bin/service, Вы видите, что он начинает читать в файле как сценарий оболочки:

open("/usr/sbin/service", O_RDONLY)     = 3
...
read(10, "#!/bin/sh\n\n#####################"..., 8192) = 8192

Теперь, когда мы знаем, что service сценарий оболочки, мы можем пойти, проверяют исходный код его. В исходном коде мы находим, что is_systemd обнаруживается и устанавливается. Для systemd случая Вы видите, что команда переписывается, чтобы быть systemctl restart network-manager.

Поэтому, в то время как три init системы сосуществуют и имеют некоторую совместимость, существуют слои сложности. Минимизировать сложность того, что происходит, продвигаясь, лучше использовать systemd файлы единицы и systemctl инструмент для управления сервисами.

16
ответ дан 23 November 2019 в 03:02

Другие вопросы по тегам:

Похожие вопросы: