SysV, Upstart ve systemd init komut dosyası bir arada


15

Sistemimde (16.04), dosyalar var /lib/systemd/system/network-manager.serviceve /etc/init.d/network-managerörneğin.

Bunun nasıl (ve neden) çalıştığını anlamıyorum. Ağ Yöneticisi'ni her zaman tarafından yeniden başlatırım sudo service network-manager restart. Bu bir şekilde karışıklık yapmamalı mı? Hala çalışıyor gibi görünüyor.

Neden service --status-allher türlü hizmeti listeliyor? 16.04 Upstart yerine systemd kullanmamalı mı?

Birisi lütfen bu birlikte yaşamın nasıl çalıştığını açıklayın.

Yanıtlar:


17

Aynı anda yalnızca bir init sistemi etkin olabilir. 16.04'te bu sistemd.

Birkaç paket, birden çok init sistemi için dosyalar ile birlikte gönderilir, böylece farklı işletim sistemlerinde birden çok init sistemi ile yönetilebilirler. Ubuntu'da, bazen aynı anda kullanılmasalar bile, birden fazla init sistemi için komut dosyaları yüklenir.

Yeni init sistemleri eski sistemlerle uyumluluğu korumaya çalışır. Özellikle, systemd hem Upstart hem de SysV init komut dosyalarıyla uyumluluğu sürdürmeye çalışır.

Bahsettiğiniz "init.d" komut dosyasında, bu bir Upstart komut dosyası değil, bir "SysV" init komut dosyasıdır. Ayrıca, "SysV" init komut dosyaları yalnızca "/etc/rc5.d" gibi bir dizine bağlandıklarında önyüklemede başlatılabilir. Ağ Yöneticisinin orada yüklü bir sembolik bağlantısı olmadığını göreceksiniz .

systemdEski "SysV" başlangıç ​​komut dosyalarını nasıl yönettiğini anlamak için bkz. Systemd /etc/init.d scirpts'i nasıl kullanır? .

Şimdi, "hizmet ağ yöneticisi yeniden başlatma" ile Ağ Yöneticisi'ni yeniden başlatmanın neden çalıştığı sorusunu yanıtlamak için. serviceKomut eski tercih Sonradan görme komut ve SysV init komut hem birlikte kullanılır. Ağ Yöneticisi ayrıca 16.04 adresinde bir Upstart betiği yüklüdür /etc/init/network-manager.conf.

Çıktısını gözden sudo strace service network-manager restartgeçirirseniz, neler olduğunu anlayabilirsiniz. İlk olarak çıktı, systemctlkomutun systemd'ye yönlendirildiğini gösteren çağrıldığını gösterir . İlk olarak, açıldıktan kısa bir süre sonra /usr/bin/service, dosyada kabuk komut dosyası olarak okumaya başladığını görebilirsiniz:

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

Artık servicebir kabuk betiği olduğunu bildiğimize göre , kaynak kodunu kontrol edebiliriz. Kaynak kodunda, is_systemdtespit edildiğini ve ayarlandığını görüyoruz . Systemd durumu için, komutun yeniden yazıldığını görebilirsiniz systemctl restart network-manager.

Bu nedenle, üç başlangıç ​​sistemi bir arada mevcut ve bazı uyumluluklara sahip olsa da, karmaşıklık katmanları vardır. İleride olacakların karmaşıklığını en aza indirmek için, en iyisi systemd birim dosyalarını ve systemctlhizmetleri yönetme aracını kullanmaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.