Совместное использование сценариев SysV, Upstart и systemd init

На моей системе (16.04) есть файлы /lib/systemd/system/network-manager.service а также /etc/init.d/network-manager, например.

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

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

Кто-нибудь, пожалуйста, объясните, как это сосуществование работает.

1 ответ

Решение

Только одна система инициализации может быть активной одновременно. 16 апреля это systemd.

Ряд пакетов поставляется с файлами для нескольких систем инициализации, поэтому ими можно управлять с нескольких систем инициализации в разных ОС. В Ubuntu иногда устанавливаются сценарии для нескольких систем инициализации, хотя они не все используются одновременно.

Новые системы инициализации пытаются поддерживать совместимость со старыми. В частности, systemd пытается поддерживать совместимость как со сценариями инициализации Upstart, так и с SysV.

В случае сценария "init.d", который вы упомянули, это сценарий инициализации "SysV", а не сценарий Upstart. Кроме того, сценарии инициализации "SysV" будут запускаться только при загрузке, если они будут связаны с каталогом, подобным "/etc/rc5.d". Вы обнаружите, что в Network Manager не установлена ​​символическая ссылка.

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

Теперь, чтобы ответить на вопрос о том, почему работает перезапуск Network Manager с помощью "перезапуска службы network-manager". service Команда используется как со сценариями Upstart, так и со сценариями инициализации SysV, предпочитая первый. NETwork Manager также имеет сценарий Upstart, установленный 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,

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

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