Saya membuat distro linux dan sekarang saya membutuhkan program init. Saya dapat mengkodekan c dengan sangat baik dan saya tahu sedikit tentang linux (tidak banyak tapi saya sudah menggunakan linux arch untuk pengembangan selama 4 tahun), jadi saya pikir saya harus mencoba menulis skrip init dasar saya sendiri di C. Saya hanya ingin tahu, tugas apa yang dilakukan init untuk mengatur sistem untuk shell sederhana? (Ketika saya bertanya "apa yang dilakukan init?", Saya tahu apa itu init dan untuk apa. Saya hanya tidak tahu tugas apa yang dikerjakannya.)
Saya tidak perlu kode dan saya mungkin bahkan tidak perlu perintah dasar tapi aku tidak membutuhkan agar mereka berjalan di.
Jawaban:
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 5rc
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 punyarc
. Bahasa assembly Edisi 1init
( yang kodenya telah dipulihkan dan disediakan oleh Warren Toomey et al. ) Secara langsung menelurkan dan menghidupkan kembali 12getty
proses, memasang 3 filesystem bawaan dari tabel bawaan, dan langsung menjalankan program dari direktori home dari nama penggunamel
. Thegetty
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 5init
", meskipun sebenarnya bukan perangkat lunak dari UNIX System 5 (dan bukan hanyainit
).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:
init
dimulai.getty
pemijahan dan menuai zombie) menjadi manajer layanan terpisah, dan hanya menangani perangkat "API" khusus sistem / symlink / direktori / acara sistem./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:srcmstr
, Pengontrol Sumber Daya Sistemrunsvdir
dari runitsvscan
dari daemontools, Adam Sampsonsvscan
dari freedt , Bruce Guenter'ssvscan
dari daemontools-encore, dan Laurent Bercot'ss6-svscan
dari s6perpd
dari pelakuservice-manager
dari noshDemikian 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 penangananSIGINT
,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" yangSIGUSR1
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 hanyamount()
s semua entri dalam daftar. Anda akan menemukan mekanisme ini dalam sistem yang beragam seperti BSD (sic!)init
, Melalui noshsystem-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 tipeexit
( 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.sumber
launchd
. Terkadang orang lupa sepenuhnya bahwa OSX adalah (hebat) anggota keluarga * nix besar.Sistem V init pada Debian (ada varian dan variasi lain) melakukan hal berikut:
/etc/rcX.d/S*
urutan alfanumerik, di manaX
runlevel. Script ini harus mengatur runlevel. Setup tipikal adalah memulai daemon dan melakukan tugas-tugas pengaturan untuk level run tersebut. Ini adalah hal yang dilakukan satu kali saat memasuki runlevel./etc/inittab
sebagai yang perlu aktif selama level run itu. Jika daemon itu berhenti berjalan, itu me-restart mereka. Meskipun Anda dapat memiliki daemon apa pun yang ingin Anda kelolainit
, minimal Anda menginginkan beberapa daemongetty
sehingga Anda dapat login.getty
Keluar begitu log in selesai, kemudianinit
restart, menyediakan prompt login baru.init
secara otomatis mencoba membuatnya tetap berjalan. Anda harus menentukannya secara terpisah di/etc/inittab
./etc/rcX.d/K*
urutan alfanumerik, di manaX
runlevel. Cara untuk mengimplementasikan shutdown atau reboot adalah dengan menentukan runlevel untuk kejadian-kejadian tersebut dan membuat tugas terakhir dieksekusi perintahhalt
ataureboot
.Jadi Anda dapat menggunakan
init
sebagai manajer layanan yang belum sempurna jika Anda mau, tetapi tugas utama hari ini adalah untuk tetapgetty
tersedia sehingga pengguna dapat login, dan memulai transisi runlevel.Apapun yang kamu mau. Di Debian, di setiap
/etc/rcX.d
direktori adalah symlink ke skrip/etc/init.d
dan Anda dapat sepenuhnya menyesuaikan atau menghapus skrip tersebut. Agar ini didirikan dengan mendahului setiap script dengan00
,01
, dllAnda juga dapat menentukan
-b
opsi untukinit
(yaitu melalui baris perintah kernel) jika Anda hanya ingininit
menelurkan shell. Ketika Anda keluar dari shell,init
mati dan ketikainit
mati, kernel akan panik.sumber
Minimum mutlak yang harus dilakukan init adalah menjalankan setidaknya satu program lain dan tidak pernah keluar. Jika init keluar, sistem macet. Saya kira bahwa bahkan menjalankan satu program lain tidak sepenuhnya diperlukan, tetapi Jika Anda tidak melakukannya, init harus bertanggung jawab untuk melakukan segala hal yang diharapkan dilakukan oleh sistem, atau itu tidak akan sangat berguna.
sumber
init
dapat melakukan apa pun yang Anda inginkaninit adalah executable arbitrary yang dipanggil oleh kernel Linux pada akhir proses boot (dan satu-satunya yang dapat dieksekusi).
Ini biasanya diimplementasikan sebagai executable ELF, tetapi bahkan bisa menjadi skrip shell dengan
chmod +x
: Init sebagai skrip shellImplementasi umum seperti sysemd akan membaca file-file konfigurasi, ofen
/etc/initrc
, dan kemudian melakukan banyak proses userland berdasarkan pada konfigurasi-konfigurasi itu, untuk mengimplementasikan berbagai aspek sistem.Namun, ini sepenuhnya implementasi khusus, dan oleh karena itu pertanyaan Anda tidak dapat dijawab tanpa menentukan implementasi spesifik. Sebagai contoh, saya telah bermain dengan
init
proses yang hanya melakukanreboot
syscall untuk tujuan pendidikan.Kernel Linux secara sederhana mencari executable di path
/init
secara default, tetapi ini dapat ditimpa olehinit=
parameter baris perintah kernel Linux.Salah satu cara terbaik untuk bermain-main
init
adalah dengan menggunakan QEMU, karena Anda dapat melewatkan parameter baris perintah kernel ke QEMU dari baris perintah QEMU dengan-append
opsi tersebut, dan tanpa rasa takut merusak desktop Anda.Ini adalah pengaturan Buildroot + QEMU minimal otomatis minimal yang membuatnya sangat mudah untuk bermain-main dengan init Anda sendiri untuk menghilangkan masalah ini.
sumber
Jika Anda berkomitmen pada prinsip "lakukan satu hal dan lakukan dengan baik" modular, maka suatu
init
program harus memulai proses.Mulai Proses
Itu harus dieksekusi setelah kernel telah berhasil didekompresi, menangani semua tugas dasar yang terlibat dalam menginisialisasi semua proses awal yang diperlukan sistem untuk beroperasi (seperti drive pemasangan yang ditemukan di / etc / fstab, memunculkan antarmuka jaringan, dan sebagainya).
Karena proses booting dan shutdown pada dasarnya adalah kebalikan satu sama lain, merupakan hal yang umum bagi program init untuk juga memastikan bahwa proses dihentikan pada perintah shutdown.
Hentikan Proses
Ini berarti harus menghentikan proses sesuai dengan halaman manual proses itu (dengan kata lain, bukan hanya terang-terangan
kill -9
, itu harus membawa proses turun dengan cara yang ingin diakhiri), unmount drive, dan akhirnya mengeluarkan perintah power down final .Referensi
Referensi yang baik untuk bagaimana hal ini dilakukan oleh orang lain adalah untuk melihat skrip /etc/rc.d Slackware , dan juga pada sistem init sederhana yang sudah ada, seperti ninit (penerus minit). Ini memiliki pengawasan proses (artinya jika suatu proses mati, itu diluncurkan kembali), yang bisa dibilang bukan pekerjaan init, tetapi masih cukup mendasar dan sederhana untuk dipahami, terutama melalui skrip sampel penulis.
sumber