Làm thế nào để systemd sử dụng tập lệnh /etc/init.d?


120

Tôi mới chuyển sang debian jessie và hầu hết mọi thứ đều ổn, kể cả trình quản lý hiển thị đồ họa của tôi wdm.

Vấn đề là, tôi không hiểu cách thức hoạt động của nó. Rõ ràng /etc/init.d/wdmkịch bản của tôi được gọi, bởi vì khi tôi đặt sớm exitở đó, wdm không được bắt đầu. Nhưng khi tôi đổi tên thư mục /etc/rc3.d (runlevel mặc định của tôi từng là 3), thì wdm vẫn được bắt đầu.

Tôi không thể tìm ra cách systemd tìm thấy tập lệnh này và tôi không hiểu nó làm gì với tất cả các tập lệnh init.d khác.

  • Khi nào và làm thế nào để systemd chạy init.d scrips?
  • Về lâu dài, tôi có nên thoát khỏi tất cả các tập lệnh init.d không?

Câu trả lời:


166

câu trả lời của sự hỗn loạn là những gì một số tài liệu nói. Nhưng đó không phải là những gì systemd thực sự làm. (Nó không phải những gì van Smoorenburg rcđã làm, một trong hai. Các van Smoorenburgrc chắc chắn hầu hết không bỏ qua LSB tiêu đề, trong đó insservsử dụng để tính toán orderings tĩnh, cho người mới bắt đầu.) Các tài liệu freedesktop, chẳng hạn như trang "không tương thích", thực chất là sai, trên những điều này và những điểm khác (Các HOMEbiến môi trường trên thực tế thường được thiết lập, chẳng hạn. Điều này đã hoàn toàn không có cơ sở ở bất cứ đâu trong một thời gian dài. Nó bây giờ ghi trong cuốn hướng dẫn, ít nhất, nhưng điều đó freedesktop WWW trang vẫn chưa được sửa chữa.)

Định dạng dịch vụ gốc cho systemd là đơn vị dịch vụ . Quản lý dịch vụ đúng cách của systemd chỉ hoạt động theo các khía cạnh mà nó đọc từ một trong chín thư mục nơi .servicecác tệp (toàn hệ thống) có thể sống. /etc/systemd/system, /run/systemd/system, /usr/local/lib/systemd/system, Và /usr/lib/systemd/systembốn của những thư mục.

Khả năng tương thích với rccác tập lệnh van Smoorenburg đạt được với một chương trình chuyển đổi, được đặt tên systemd-sysv-generator. Chương trình này được liệt kê trong /usr/lib/systemd/system-generators/thư mục và do đó được systemd tự động chạy sớm trong quy trình bootstrap ở mỗi lần khởi động và một lần nữa mỗi khi systemd được hướng dẫn tải lại cấu hình của nó sau này.

Chương trình này là một trình tạo , một loại tiện ích phụ trợ có nhiệm vụ tạo các tệp đơn vị dịch vụ một cách nhanh chóng, trong một tmpfs nơi có thêm ba trong số chín thư mục đó (chỉ dành cho các máy phát điện). systemd-sysv-generatortạo các đơn vị dịch vụ chạy rctập lệnh van Smoorenburg từ đó /etc/init.d, nếu nó không tìm thấy đơn vị dịch vụ hệ thống gốc có tên đó đã tồn tại ở sáu địa điểm khác.

quản lý dịch vụ systemd chỉ biết về các đơn vị dịch vụ. Các đơn vị dịch vụ được tạo tự động (lại) này được viết để gọi các rctập lệnh van Smoorenburg . Họ có, trong số những thứ khác:

[Đơn vị]
SourcePath = / etc / init.d / wibble
[Dịch vụ]
ExecStart = / etc / init.d / wibble bắt đầu
ExecStop = / etc / init.d / wibble dừng

Sự khôn ngoan nhận được là các rctập lệnh van Smoorenburg phải có tiêu đề LSB và được chạy song song mà không tôn trọng các ưu tiên do /etc/rc?.d/hệ thống áp đặt . Điều này là không chính xác trên tất cả các điểm.

Trên thực tế, họ không cần phải có tiêu đề LSB và nếu họ không systemd-sysv-generatorthể nhận ra các tiêu đề bình luận RedHat cũ hạn chế hơn ( description:, pidfile:v.v.). Ngoài ra, trong trường hợp không có tiêu đề LSB, nó sẽ quay trở lại nội dung của các /etc/rc?.dtrang trại liên kết tượng trưng, ​​đọc các ưu tiên được mã hóa thành tên liên kết và xây dựng trước / sau khi đặt hàng từ chúng, tuần tự hóa các dịch vụ. Không chỉ các tiêu đề LSB không phải là một yêu cầu, và không chỉ chúng tự mã hóa trước / sau khi sắp xếp thứ tự các thứ đến một mức độ, hành vi dự phòng trong sự vắng mặt hoàn toàn của chúng thực sự là hoạt động không song song đáng kể.

Lý do /etc/rc3.dkhông quan trọng là có lẽ bạn đã kích hoạt tập lệnh đó thông qua một /etc/rc?.d/thư mục khác . systemd-sysv-generatorđược dịch là được liệt kê trong bất kỳ /etc/rc2.d/, /etc/rc3.d//etc/rc4.d/vào một người gốc Wanted-Bymối quan hệ với nhân systemd multi-user.target. Các cấp độ chạy là "lỗi thời" trong thế giới hệ thống, và bạn có thể quên chúng.

đọc thêm


2
Trong Debian vào thư mục hệ thống máy phát điện không sống trên / usr / lib, nhưng / lib packages.debian.org/sid/amd64/systemd/filelist
Braiam

5
Đây là một câu trả lời thẳng lên tuyệt vời. Làm tốt lắm thưa ngài.
Peelman

1
Cảm ơn bạn, cảm ơn bạn, cảm ơn bạn vì điều này! Việc đối phó với sự pha trộn của các hệ thống Debian 8 và RH / CentOS 7 đã khiến việc quản lý phụ thuộc dịch vụ SysVInit và Systemd trở nên hơi đau đầu nhưng cách giải thích này về những gì systemd đang làm đã giúp tôi hiểu rất nhiều.
Toby

Máy phát điện này không hoạt động. Đối với những người theo dõi, tôi cũng đề cập rằng, nếu bạn có phiên bản cũ hơn systemdvà tập lệnh /etc/init.d không được đặt thành "khởi động khi bắt đầu" thì nó vẫn hoạt động như mong đợi nhưng sẽ không hiển thị trong danh sách đơn vị hiển thị: unix.stackexchange.com/a/518894/8337
rogerdpack

Máy phát điện này không hoạt động. Đối với những người theo dõi, tôi cũng đề cập rằng, nếu bạn có phiên bản systemd cũ hơn và tập lệnh /etc/init.d không được đặt thành "khởi động khi bắt đầu" thì nó vẫn sẽ bắt đầu / dừng như mong đợi khi sử dụng systemctl nhưng đã thắng sẽ không hiển thị trong danh sách đơn vị hiển thị: unix.stackexchange.com/questions/517872/ Lời cũng NB mà về cơ bản bạn "không thể" kiểm soát các dịch vụ này bằng cách chạy /etc/init.d/xx trực tiếp nữa hoặc systemd được ... bối rối không biết cái gì đang chạy và cái gì không: |
rogerdpack

17

Systemd tương thích ngược với các tập lệnh init SysV. Theo LSB 3.1, tập lệnh init phải có các Quy ước Nhận xét thông tin , xác định khi nào tập lệnh phải bắt đầu / dừng và những gì cần thiết để tập lệnh bắt đầu / dừng. Đây là một ví dụ:

### BEGIN INIT INFO
# Provides: my-service
# Required-Start: $local_fs $network $remote_fs
# Required-Stop: $local_fs $network $remote_fs
# Default-Start:  2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop service my-service
# Description: my-service blah blah ...
### END INIT INFO

Đây là phần bình luận bị bỏ qua bởi SysV. Mặt khác, systemd đọc thông tin phụ thuộc đó và chạy các tập lệnh đó tùy theo điều đó.

Nhưng có một điểm, trong đó systemd và SysV khác nhau về các tập lệnh init. SysV thực thi các tập lệnh theo thứ tự liên tục dựa trên số của chúng trong tên tệp. Systemd không. Nếu phụ thuộc được đáp ứng, systemd chạy các tập lệnh ngay lập tức mà không cần đánh số thứ tự của tên tập lệnh. Một số trong số họ có thể sẽ thất bại vì đặt hàng. Có rất nhiều sự không tương thích khác cần được xem xét.


Nếu có tập lệnh init và tập tin dịch vụ cho cùng một dịch vụ, systemd sẽ thực thi cả hai, ngay khi đáp ứng các phụ thuộc (trong trường hợp tập lệnh init, tập lệnh được xác định trong tiêu đề LSB).


Được rồi, nhưng tôi cũng có cả đống tệp .service trong / lib / systemd / system /. Systemd thực sự thực thi cái gì? Bất cứ điều gì được chỉ định trong các tệp dịch vụ (theo thứ tự phụ thuộc), các tập lệnh init.d hoặc cả hai?
Martin Drautzburg

@MartinDrautzburg Tôi đã thêm câu trả lời
hỗn loạn

1
Là một sidenote, Debian vừa công bố để đổ LSB tương thích: article.gmane.org/gmane.linux.debian.devel.lsb/1103
Jan

systemd là bất cứ điều gì NHƯNG tương thích với các tập lệnh SysV. Không chỉ tuyên bố đó không chính xác, mà liên kết được tham chiếu cho thấy rõ rằng nó chỉ "hầu hết tương thích" và số lượng nỗ lực cần thiết để tạo ra kết quả tương tự là vô cùng lớn.
Julie ở Austin
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.