Apa yang sebenarnya dilakukan init?

43

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.

DividedByZero
sumber
1
Anda dapat menggunakan juru bahasa apa pun yang Anda suka untuk skrip init gaya SysV, termasuk Perl, awk, bash, (t) csh, binari asli, ... Bash biasanya digunakan karena sebenarnya dijamin akan tersedia pada sistem di mana skrip tersebut berada digunakan pada titik yang relevan dalam proses boot, bukan karena ada beberapa kopling antara SysVinit dan bash. SysVinit mendefinisikan kontrak dan setiap skrip bebas untuk mengimplementasikan kontrak itu dengan cara apa pun yang menurut pengembangnya sesuai.
CVn

Jawaban:

53

Sistem 5 initakan 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 initdan Sistem 5 rcbertanggal 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 gettyproses, memasang 3 filesystem bawaan dari tabel bawaan, dan langsung menjalankan program dari direktori home dari nama pengguna mel. The gettymeja 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/ rcbukan 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 initdimulai.
  • 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 gettypemijahan 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.inittugas 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 svscansebagai 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 runsvdirdari runit
  • Daniel J. Bernstein svscandari daemontools, Adam Sampson svscandari freedt , Bruce Guenter's svscandari daemontools-encore, dan Laurent Bercot's s6-svscandari s6
  • Wayne Marshall perpddari pelaku
  • Fasilitas Manajemen Layanan di Solaris 10
  • yang service-managerdari nosh

Demikian pula, sebagaimana dijelaskan di https://superuser.com/a/888936/38062 , seluruh /dev/initctlgagasan 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 SIGUSR1memiliki 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 initrom 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/shfile "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-managerprogram 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-managerprogram 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.

JdeBP
sumber
3
Jawaban yang mengagumkan dan sangat informatif. Tapi saya bertanya pada diri sendiri di mana di gambar besar ini adalah OSX launchd. Terkadang orang lupa sepenuhnya bahwa OSX adalah (hebat) anggota keluarga * nix besar.
DavAlPi
4

Sistem V init pada Debian (ada varian dan variasi lain) melakukan hal berikut:

  • Saat memasukkan runlevel, ia memanggil skrip dalam /etc/rcX.d/S*urutan alfanumerik, di mana Xrunlevel. 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.
  • Saat berada di level run, ia memulai daemon yang terdaftar /etc/inittabsebagai 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 kelola init, minimal Anda menginginkan beberapa daemon gettysehingga Anda dapat login. gettyKeluar begitu log in selesai, kemudian initrestart, menyediakan prompt login baru.
    • Jika daemon dinyalakan ulang terlalu banyak dalam waktu yang terlalu singkat, daemon berhenti mencoba untuk me-restart untuk sementara waktu.
    • Hanya karena sesuatu dimulai oleh skrip kickoff ketika memasuki level run tidak membuat initsecara otomatis mencoba membuatnya tetap berjalan. Anda harus menentukannya secara terpisah di /etc/inittab.
  • Saat keluar dari runlevel, ia memanggil skrip dalam /etc/rcX.d/K*urutan alfanumerik, di mana Xrunlevel. Cara untuk mengimplementasikan shutdown atau reboot adalah dengan menentukan runlevel untuk kejadian-kejadian tersebut dan membuat tugas terakhir dieksekusi perintah haltatau reboot.
  • Ini akan memanggil executable sebagai respons terhadap peristiwa tertentu, seperti peristiwa daya atau Ctrl-Alt-Del.
  • Ia mendengarkan pada soket, jika menerima pesan tertentu itu akan mengubah runlevel.

Jadi Anda dapat menggunakan initsebagai manajer layanan yang belum sempurna jika Anda mau, tetapi tugas utama hari ini adalah untuk tetap gettytersedia sehingga pengguna dapat login, dan memulai transisi runlevel.

Saya hanya ingin tahu, tugas apa yang dilakukan init untuk mengatur sistem untuk shell sederhana?

Apapun yang kamu mau. Di Debian, di setiap /etc/rcX.ddirektori adalah symlink ke skrip /etc/init.ddan Anda dapat sepenuhnya menyesuaikan atau menghapus skrip tersebut. Agar ini didirikan dengan mendahului setiap script dengan 00, 01, dll

Anda juga dapat menentukan -bopsi untuk init(yaitu melalui baris perintah kernel) jika Anda hanya ingin initmenelurkan shell. Ketika Anda keluar dari shell, initmati dan ketika initmati, kernel akan panik.

LawrenceC
sumber
2

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.

Hildred
sumber
1
Saya memiliki sistem Linux yang bermasalah di mana PID 1 macet tetapi sistem pada dasarnya terus berjalan. Seberapa buruk crash PID 1 tergantung pada versi kernel.
Gilles 'SO- berhenti menjadi jahat'
1

init dapat melakukan apa pun yang Anda inginkan

init 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 shell

Implementasi 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 initproses yang hanya melakukan rebootsyscall untuk tujuan pendidikan.

Kernel Linux secara sederhana mencari executable di path /initsecara default, tetapi ini dapat ditimpa oleh init=parameter baris perintah kernel Linux.

Salah satu cara terbaik untuk bermain-main initadalah dengan menggunakan QEMU, karena Anda dapat melewatkan parameter baris perintah kernel ke QEMU dari baris perintah QEMU dengan -appendopsi 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.

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
sumber
0

Jika Anda berkomitmen pada prinsip "lakukan satu hal dan lakukan dengan baik" modular, maka suatu initprogram 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.

Klaatu von Schlacker
sumber