Совместное использование сценариев 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
инструмент для управления услугами.