SysV, Upstart và systemd init script cùng tồn tại


15

Trên hệ thống của tôi (16.04), có các tệp /lib/systemd/system/network-manager.service/etc/init.d/network-manager, ví dụ.

Tôi không hiểu làm thế nào (và tại sao) điều này hoạt động. Tôi luôn khởi động lại Trình quản lý mạng bằng cách sudo service network-manager restart. Không nên làm rối hệ thống này bằng cách nào đó? Nó dường như vẫn hoạt động.

Tại sao service --status-allliệt kê tất cả các loại dịch vụ? Không nên 16.04 sử dụng systemd thay vì Upstart?

Ai đó hãy giải thích làm thế nào sự cùng tồn tại này hoạt động.

Câu trả lời:


17

Chỉ một hệ thống init có thể hoạt động cùng một lúc. Vào ngày 16.04, đó là systemd.

Một số gói gửi cùng với các tệp cho nhiều hệ thống init, vì vậy chúng có thể được quản lý bằng nhiều hệ thống init trên các HĐH khác nhau. Trên Ubuntu, đôi khi các tập lệnh cho nhiều hệ thống init được cài đặt, mặc dù chúng không được sử dụng cùng một lúc.

Các hệ thống init mới hơn cố gắng duy trì khả năng tương thích với các hệ thống cũ hơn. Cụ thể, systemd cố gắng duy trì khả năng tương thích với cả hai script init Upstart và SysV.

Trong trường hợp tập lệnh "init.d" mà bạn đã đề cập, đó là tập lệnh init "SysV", không phải tập lệnh Upstart. Ngoài ra, các tập lệnh init "SysV" sẽ chỉ được khởi động khi khởi động nếu chúng được liên kết với một thư mục như "/etc/rc5.d". Bạn sẽ thấy rằng Trình quản lý mạng không có cài đặt liên kết tượng trưng ở đó.

Để hiểu cách systemdquản lý các tập lệnh init "SysV" cũ, hãy xem Systemd sử dụng /etc/init.d scirpts như thế nào? .

Bây giờ, để trả lời câu hỏi về lý do tại sao nó hoạt động để khởi động lại Trình quản lý mạng với "khởi động lại trình quản lý mạng dịch vụ". Các servicelệnh được sử dụng với cả các kịch bản Upstart và init script SysV, thích cựu. Quản lý mạng cũng có tập lệnh Upstart được cài đặt vào ngày 16.04 tại /etc/init/network-manager.conf.

Nếu bạn xem lại đầu ra của sudo strace service network-manager restart, bạn có thể hiểu được chuyện gì đang xảy ra. Đầu tiên, đầu ra cho thấy systemctlđang được gọi, chỉ ra rằng lệnh đang được chuyển hướng đến systemd. Đầu tiên, ngay sau khi mở /usr/bin/service, bạn có thể thấy nó bắt đầu đọc trong tệp dưới dạng tập lệnh shell:

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

Bây giờ chúng ta biết rằng đó servicelà một tập lệnh shell, chúng ta có thể kiểm tra mã nguồn của nó. Trong mã nguồn, chúng tôi thấy rằng is_systemdđược phát hiện và thiết lập. Đối với trường hợp systemd, bạn có thể thấy lệnh được viết lại thành systemctl restart network-manager.

Vì vậy, trong khi ba hệ thống init cùng tồn tại và có một số khả năng tương thích, có những lớp phức tạp. Để giảm thiểu sự phức tạp của những gì đang diễn ra trong tương lai, tốt nhất nên sử dụng các tệp đơn vị systemd và systemctlcông cụ để quản lý các dịch vụ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.