Сосуществование SysV, Upstart и systemd init script

15

В моей системе (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?

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

user2061057
источник

Ответы:

17

Только одна система инициализации может быть активной одновременно. 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 с помощью «service network-manager restart». Команда 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инструмент для управления службами.

Марк Стосберг
источник