Hệ thống 5 init
sẽ chỉ cho bạn biết một phần nhỏ của câu chuyện.
Có một loại cận thị ảnh hưởng đến thế giới Linux. Mọi người nghĩ rằng họ sử dụng một thứ gọi là "Hệ thống 5 init
", và đó là cả những gì truyền thống và là nơi tốt nhất để bắt đầu. Thực tế cũng không phải vậy.
Thực tế, truyền thống không phải là những gì những người như vậy nói, đối với người mới bắt đầu. Hệ thống 5 init
và Hệ thống 5 có rc
niên đại với Hệ thống UNIX 5 của AT & T, gần như là UNIX đầu tiên như chúng ta bây giờ (nói) sau phiên bản đầu tiên của Linux-Mandrake.
Phiên bản 1 UNIX chỉ có init
. Nó không có rc
. Ngôn ngữ lắp ráp Phiên bản 1 init
( có mã được khôi phục và cung cấp bởi Warren Toomey và cộng sự ) đã trực tiếp sinh ra và getty
xử lý 12 quy trình, gắn 3 hệ thống tệp cứng từ bảng tích hợp và trực tiếp chạy chương trình từ thư mục chính của tên người dùng mel
. Các getty
bảng cũng đã trực tiếp theo hình ảnh chương trình.
Đó là một thập kỷ nữa sau UNIX System 5, cái gọi là hệ thống khởi động Linux "truyền thống" đã xuất hiện. Năm 1992, Miquel van Smoorenburg (lại) đã viết một Linux init
+ rc
và các công cụ liên quan của họ, mà bây giờ mọi người gọi là "Hệ thống 5 init
", mặc dù nó không thực sự là phần mềm từ UNIX System 5 (và không chỉ là init
).
Hệ thống 5 init
/ rc
không phải là nơi tốt nhất để bắt đầu và ngay cả khi người ta bổ sung kiến thức về systemd không bao gồm một nửa những gì cần biết. Có rất nhiều công việc trong lĩnh vực thiết kế hệ thống init (cho Linux và BSD) đã xảy ra chỉ trong hai thập kỷ qua. Tất cả các loại quyết định kỹ thuật đã được thảo luận, thực hiện, thiết kế, thực hiện và thực hành. Các Unices thương mại đã làm rất nhiều, quá.
Các hệ thống hiện có để nghiên cứu và học hỏi từ
Dưới đây là danh sách không đầy đủ của một số hệ thống init chính ngoài hai hệ thống đó và một hoặc hai trong số (một số) điểm nổi bật của chúng:
- Joachim Nilsson của finit đã đi con đường của việc sử dụng một tập tin cấu hình do con người dễ đọc hơn.
- Felix von Leitner minit đi cho một hệ thống cấu hình hệ thống tập tin-là-the-cơ sở dữ liệu, dấu chân bộ nhớ nhỏ, và bắt đầu / dừng phụ thuộc giữa những thứ mà
init
bắt đầu.
- Gerrit Pape của runit đi cho những gì tôi đã mô tả trước đây như bốn kịch bản shell chỉ spawn tiếp cận.
- Ban đầu nhằm mục đích có các phụ thuộc, các mục tiêu được đặt tên, nhiều tệp cấu hình và cú pháp cấu hình linh hoạt hơn với toàn bộ cài đặt nhiều hơn cho các quy trình con.
- mới bắt đầu thiết kế lại hoàn toàn, mô hình hóa hệ thống không phải là dịch vụ và sự phụ thuộc lẫn nhau, mà là các sự kiện và công việc được kích hoạt bởi chúng.
- Thiết kế của nosh bao gồm đẩy tất cả quản lý dịch vụ ra ngoài (bao gồm cả
getty
sinh sản và gặt hái zombie) vào một trình quản lý dịch vụ riêng biệt và chỉ xử lý các thiết bị / liên kết / thư mục "API" dành riêng cho hệ điều hành và các sự kiện hệ thống.
- sinit là một init rất đơn giản. Nó thực thi
/bin/rc.init
công việc của nó là bắt đầu các chương trình, gắn kết hệ thống tập tin, v.v. Đối với điều này, bạn có thể sử dụng một cái gì đó như minirc .
Hơn nữa, khoảng 10 năm trước, đã có cuộc thảo luận giữa những người dùng daemontools và những người khác sử dụng svscan
như quy trình số 1, dẫn đến các dự án như Paul Jarc của Svscan như nghiên cứu quy trình 1 , ý tưởng của Gerrit Pape và Svscan của Laurent Bercot như quy trình 1 .
Điều này đưa chúng ta đến quy trình # 1 làm gì.
Chương trình # 1 làm gì
Các khái niệm về quá trình # 1 được "cho là" phải làm là do bản chất của họ chủ quan. Một tiêu chí thiết kế mục tiêu có ý nghĩa là quy trình tối thiểu # 1 phải làm. Hạt nhân áp đặt một số yêu cầu trên nó. Và luôn có một số thứ dành riêng cho hệ điều hành thuộc nhiều loại khác nhau mà nó phải làm. Khi nói đến quá trình # 1 theo truyền thống đã làm, thì chúng ta không ở mức tối thiểu đó và chưa bao giờ thực sự có được.
Có một số điều mà các hệ điều hành khác nhau và các chương trình khác yêu cầu của quy trình # 1 mà đơn giản là không thể thoát được.
Mọi người sẽ nói với bạn rằng fork()
ing mọi thứ và đóng vai trò là cha mẹ của các quá trình mồ côi là chức năng chính của quy trình # 1. Trớ trêu thay, điều này là không đúng sự thật. Xử lý các quy trình mồ côi là (với các nhân Linux gần đây, như được giải thích tại https://unix.stackexchange.com/a/177361/5132 ) một phần mà hệ thống mà phần lớn có thể đưa ra khỏi quy trình # 1 vào các quy trình khác, chẳng hạn như một người quản lý dịch vụ tận tâm . Tất cả những người này là những người quản lý dịch vụ, chạy theo quy trình # 1:
Tương tự, như được giải thích tại https://superuser.com/a/888936/38062 , toàn bộ /dev/initctl
ý tưởng không cần phải ở bất cứ đâu gần quy trình # 1. Trớ trêu thay, đó là hệ thống tập trung cao độ chứng minh rằng nó có thể được chuyển ra khỏi quy trình # 1.
Ngược lại, những điều bắt buộc đối với init
, mà mọi người thường quên trong họ off-the-top-of-the-đầu thiết kế, những thứ như xử lý SIGINT
, SIGPWR
, SIGWINCH
, và vân vân gửi từ hạt nhân và ban hành các yêu cầu thay đổi trạng thái hệ thống khác nhau gửi từ các chương trình "biết" rằng các tín hiệu nhất định để xử lý # 1 có nghĩa là một số điều nhất định. (Ví dụ: Như được giải thích tại https://unix.stackexchange.com/a/196471/5132 , bộ công cụ BSD "biết" SIGUSR1
có ý nghĩa cụ thể.)
Ngoài ra còn có các tác vụ khởi tạo và hoàn thiện một lần mà người ta không thể thoát hoặc sẽ phải chịu đựng rất nhiều khi không thực hiện, chẳng hạn như gắn hệ thống tệp "API" hoặc xóa bộ đệm của hệ thống tệp.
Các vấn đề cơ bản để xử lý các hệ thống tập tin "API" khác với hoạt động của init
rom 1st Edition UNIX: Một người có một danh sách thông tin được đưa vào chương trình, và chỉ đơn giản mount()
là tất cả các mục trong danh sách. Bạn sẽ tìm thấy cơ chế này trong các hệ thống đa dạng như BSD (sic!) init
, Thông qua nosh system-manager
, đến systemd.
"thiết lập hệ thống cho một vỏ đơn giản"
Như bạn đã quan sát, init=/bin/sh
không có hệ thống tệp "API" được gắn kết, gặp sự cố một cách vô duyên khi không có bộ đệm ẩn khi một loại exit
( https://unix.stackexchange.com/a/195978/5132 ) và nói chung rời khỏi nó để người dùng (siêu) thực hiện thủ công các hành động giúp hệ thống có thể sử dụng tối thiểu.
Để xem những gì người ta thực sự không có lựa chọn nào khác ngoài việc thực hiện các chương trình số 1, và do đó đặt cho bạn một khóa học tốt cho mục tiêu thiết kế đã nêu của bạn, lựa chọn tốt nhất của bạn là xem xét sự chồng chéo trong hoạt động của runit Gerrit Pape, Felix von Leitner's minit, và system-manager
chương trình từ gói nosh. Hai người trước cho thấy hai nỗ lực để được tối giản, nhưng vẫn xử lý những thứ không thể tránh khỏi.
Cái sau hữu ích, tôi đề nghị, cho mục nhập thủ công mở rộng cho system-manager
chương trình, trong đó nêu chi tiết chính xác hệ thống tập tin "API" nào được gắn, nhiệm vụ khởi tạo nào được chạy và tín hiệu nào được xử lý; trong một hệ thống mà theo thiết kế , người quản lý hệ thống chỉ sinh ra ba thứ khác (trình quản lý dịch vụ, bộ ghi nhật ký đi kèm và chương trình để chạy các thay đổi trạng thái) và chỉ làm điều không thể tránh khỏi trong quy trình # 1.