Sistem 5 init
akan memberi tahu Anda hanya sebagian kecil dari cerita.
Ada semacam miopia yang mempengaruhi dunia Linux. Orang-orang berpikir bahwa mereka menggunakan sesuatu yang disebut "Sistem 5 init
", dan itulah yang tradisional dan tempat terbaik untuk memulai. Faktanya tidak ada.
Tradisi sebenarnya bukanlah apa yang dikatakan orang-orang seperti itu, sebagai permulaan. Sistem 5 init
dan Sistem 5 rc
bertanggal AT&T UNIX System 5, yang hampir sejauh setelah UNIX pertama seperti sekarang (katakanlah) setelah versi pertama Linux-Mandrake.
Edisi 1 UNIX hanya punya init
. Tidak punya rc
. Bahasa assembly Edisi 1 init
( yang kodenya telah dipulihkan dan disediakan oleh Warren Toomey et al. ) Secara langsung menelurkan dan menghidupkan kembali 12 getty
proses, memasang 3 filesystem bawaan dari tabel bawaan, dan langsung menjalankan program dari direktori home dari nama pengguna mel
. The getty
meja juga langsung dalam program gambar.
Satu dekade setelah UNIX System 5, sistem init Linux "tradisional" muncul. Pada tahun 1992, Miquel van Smoorenburg (kembali) menulis Linux init
+ rc
, dan alat-alat yang terkait, yang sekarang orang sebut sebagai "Sistem 5 init
", meskipun sebenarnya bukan perangkat lunak dari UNIX System 5 (dan bukan hanya init
).
Sistem 5 init
/ rc
bukan tempat terbaik untuk memulai, dan bahkan jika seseorang menambahkan pengetahuan tentang systemd yang tidak mencakup setengah dari apa yang perlu diketahui. Ada banyak pekerjaan di bidang desain sistem init (untuk Linux dan BSD) yang telah terjadi dalam dua dekade terakhir saja. Segala macam keputusan teknik telah dibahas, dibuat, dirancang, diimplementasikan, dan dipraktikkan. Unites komersial melakukan banyak hal juga.
Sistem yang ada untuk belajar dan belajar
Berikut adalah daftar yang tidak lengkap dari beberapa sistem init utama selain dua, dan satu atau dua (beberapa) poin penting mereka:
- Finit Joachim Nilsson menempuh rute menggunakan file konfigurasi yang lebih dapat dibaca manusia.
- Minit Felix von Leitner digunakan untuk sistem file-is-the-database konfigurasi, jejak memori kecil, dan mulai / berhenti ketergantungan antara hal-hal yang
init
dimulai.
- Ritual Gerrit Pape sesuai dengan apa yang saya gambarkan sebelumnya sebagai pendekatan empat skrip shell .
- InitNG bertujuan untuk memiliki dependensi, target yang ditentukan , beberapa file konfigurasi, dan sintaks konfigurasi yang lebih fleksibel dengan seluruh pengaturan yang memuat lebih banyak untuk proses anak.
- pemula mulai untuk mendesain ulang yang lengkap, memodelkan sistem bukan sebagai layanan dan saling ketergantungan sama sekali, tetapi sebagai peristiwa dan pekerjaan yang dipicu oleh mereka.
- Desain nosh termasuk mendorong semua manajemen layanan keluar (termasuk bahkan
getty
pemijahan dan menuai zombie) menjadi manajer layanan terpisah, dan hanya menangani perangkat "API" khusus sistem / symlink / direktori / acara sistem.
- sinit adalah init yang sangat sederhana. Ini menjalankan
/bin/rc.init
tugas siapa untuk memulai program, me-mount sistem file, dll. Untuk ini, Anda dapat menggunakan sesuatu seperti minirc .
Selain itu, sekitar 10 tahun yang lalu, ada diskusi antara pengguna daemontools dan yang lain menggunakan svscan
sebagai proses # 1, yang mengarah ke proyek-proyek seperti svscan Paul Jarc sebagai studi proses 1 , ide-ide Gerrit Pape , dan svscan Laurent Bercot sebagai proses 1 .
Yang membawa kita ke proses apa program # 1 lakukan.
Apa proses program # 1 lakukan
Pengertian tentang apa yang proses "seharusnya" lakukan adalah sifatnya subjektif. Kriteria desain objektif yang bermakna adalah apa yang harus dilakukan oleh proses # 1 . Kernel memaksakan beberapa persyaratan di dalamnya. Dan selalu ada beberapa hal khusus sistem operasi dari berbagai jenis yang harus dilakukan. Ketika datang ke proses apa # 1 secara tradisional dilakukan, maka kita tidak pada tingkat minimum dan tidak pernah benar-benar pernah.
Ada beberapa hal yang memerlukan kernel sistem operasi dan program lain dari proses # 1 yang tidak bisa dilepaskan begitu saja.
Orang-orang akan memberi tahu Anda bahwa fork()
hal-hal dan bertindak sebagai induk dari proses yatim adalah fungsi utama proses # 1. Ironisnya, ini tidak benar. Berurusan dengan proses yatim adalah (dengan kernel Linux baru-baru ini, seperti yang dijelaskan di https://unix.stackexchange.com/a/177361/5132 ) bagian dari sistem yang sebagian besar dapat faktor keluar dari proses # 1 ke dalam proses lain, seperti manajer layanan khusus . Semua ini adalah manajer layanan, yang dijalankan dengan proses # 1:
- program IBM AIX
srcmstr
, Pengontrol Sumber Daya Sistem
- Gerrit Pape
runsvdir
dari runit
- Daniel J. Bernstein
svscan
dari daemontools, Adam Sampson svscan
dari freedt , Bruce Guenter's svscan
dari daemontools-encore, dan Laurent Bercot's s6-svscan
dari s6
- Wayne Marshall
perpd
dari pelaku
- Fasilitas Manajemen Layanan di Solaris 10
- yang
service-manager
dari nosh
Demikian pula, sebagaimana dijelaskan di https://superuser.com/a/888936/38062 , seluruh /dev/initctl
gagasan tidak perlu berada di dekat proses # 1. Ironisnya, itu adalah systemd yang sangat tersentralisasi yang menunjukkan bahwa ia dapat dipindahkan dari proses # 1.
Sebaliknya, hal-hal yang wajib bagi init
, bahwa orang-orang biasanya lupa dalam mereka off-the-top-of-the-kepala desain, hal-hal seperti penanganan SIGINT
, SIGPWR
, SIGWINCH
, dan sebagainya dikirim dari kernel dan memberlakukan berbagai permintaan perubahan sistem negara mengirim dari program yang "tahu" bahwa sinyal tertentu untuk memproses # 1 berarti hal-hal tertentu. (Misalnya: Seperti dijelaskan di https://unix.stackexchange.com/a/196471/5132 , perangkat BSD "tahu" yang SIGUSR1
memiliki makna tertentu.)
Ada juga tugas inisialisasi dan finalisasi yang tidak dapat diloloskan, atau akan sangat menderita karena tidak melakukan, seperti memasang sistem file "API" atau membilas cache sistem file.
Dasar-dasar berurusan dengan "API" filesystem yang sedikit berbeda dengan operasi init
rom 1st Edition UNIX: Satu memiliki daftar informasi tertanam ke dalam program, dan satu hanya mount()
s semua entri dalam daftar. Anda akan menemukan mekanisme ini dalam sistem yang beragam seperti BSD (sic!) init
, Melalui nosh system-manager
, hingga systemd.
"mengatur sistem untuk shell sederhana"
Seperti yang telah Anda amati, sistem init=/bin/sh
file "API" tidak terpasang, crash dengan cara yang canggung tanpa cache flush ketika satu tipe exit
( https://unix.stackexchange.com/a/195978/5132 ), dan secara umum membiarkannya kepada (super) pengguna untuk secara manual melakukan tindakan yang membuat sistem dapat digunakan secara minimal.
Untuk melihat apa yang sebenarnya tidak punya pilihan selain dilakukan dalam proses program # 1, dan dengan demikian membuat Anda berada di jalur yang baik untuk tujuan desain yang Anda nyatakan, opsi terbaik Anda adalah dengan melihat tumpang tindih dalam pengoperasian runit Gerrit Pape, Felix von Minit Leitner, dan system-manager
program dari paket nosh. Dua mantan menunjukkan dua upaya untuk menjadi minimalis, namun masih menangani hal-hal yang mustahil untuk dihindari.
Yang terakhir ini berguna, saya sarankan, untuk entri manualnya yang luas untuk system-manager
program ini, yang merinci secara tepat apa sistem file "API" yang dipasang, tugas inisialisasi apa yang dijalankan, dan sinyal apa yang ditangani; dalam suatu sistem yang oleh desain memiliki manajer sistem hanya menelurkan tiga hal lain (manajer layanan, logger yang menyertainya, dan program untuk menjalankan perubahan negara) dan hanya melakukan hal yang tidak dapat dihindari dalam proses # 1.