SysV, Pemula dan koeksistensi skrip init systemd

15

Di sistem saya (16.04), ada file /lib/systemd/system/network-manager.servicedan /etc/init.d/network-manager, misalnya.

Saya tidak mengerti bagaimana (dan mengapa) ini bekerja. Saya selalu memulai ulang Network Manager oleh sudo service network-manager restart. Bukankah seharusnya ini mengacaukan systemd entah bagaimana? Sepertinya masih berfungsi.

Mengapa service --status-alldaftar semua jenis layanan? Tidakkah seharusnya 16,04 menggunakan systemd, bukannya Upstart?

Seseorang tolong jelaskan bagaimana koeksistensi ini bekerja.

pengguna2061057
sumber

Jawaban:

17

Hanya satu sistem init yang dapat aktif sekaligus. Pada 16,04, itu systemd.

Sejumlah paket dikirimkan dengan file untuk beberapa sistem init, sehingga dapat dikelola dengan beberapa sistem init pada OS yang berbeda. Di Ubuntu, kadang-kadang skrip untuk beberapa sistem init diinstal, meskipun mereka tidak semua digunakan pada saat yang sama.

Sistem init yang lebih baru mencoba mempertahankan kompatibilitas dengan yang lama. Secara khusus, systemd mencoba untuk mempertahankan kompatibilitas dengan skrip init Upstart dan SysV.

Dalam kasus skrip "init.d" yang Anda sebutkan, itu adalah skrip init "SysV", bukan skrip pemula. Juga, skrip init "SysV" hanya akan dimulai saat boot jika disinkronkan ke direktori seperti "/etc/rc5.d". Anda akan menemukan bahwa Network Manager tidak memiliki symlink yang terpasang di sana.

Untuk memahami bagaimana systemdmengelola skrip init "SysV" lama, lihat Bagaimana systemd menggunakan /etc/init.d scirpts? .

Sekarang, untuk menjawab pertanyaan tentang mengapa ia berfungsi untuk me-restart Network Manager dengan "service network-manager restart". The servicePerintah ini digunakan dengan baik script Upstart dan skrip init SysV, lebih memilih mantan. Network Manager juga memiliki skrip pemula yang diinstal pada 16,04 di /etc/init/network-manager.conf.

Jika Anda meninjau output dari sudo strace service network-manager restart, Anda bisa mengetahui apa yang terjadi. Pertama, output menunjukkan bahwa systemctlsedang dipanggil, menunjukkan bahwa perintah sedang diarahkan ke systemd. Pertama, segera setelah dibuka /usr/bin/service, Anda dapat melihatnya mulai membaca di file sebagai skrip shell:

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

Sekarang kita tahu itu serviceadalah skrip shell, kita bisa memeriksa kode sumbernya. Dalam kode sumber, kami menemukan bahwa is_systemdterdeteksi dan diatur. Untuk kasus systemd, Anda dapat melihat bahwa perintah ditulis ulang menjadi systemctl restart network-manager.

Jadi, sementara tiga sistem init hidup berdampingan dan memiliki beberapa kompatibilitas, ada beberapa lapisan kerumitan. Untuk meminimalkan kerumitan apa yang terjadi di masa depan, yang terbaik adalah menggunakan file unit systemd dan systemctlalat untuk mengelola layanan.

Mark Stosberg
sumber