GNU/Linux >> Belajar Linux >  >> Linux

Apa sebenarnya yang dilakukan init?

Sistem 5 init hanya akan memberi tahu Anda sebagian kecil dari cerita.

Ada semacam miopia yang memengaruhi dunia Linux. Orang berpikir bahwa mereka menggunakan sesuatu yang disebut "Sistem 5 init ", dan itulah yang tradisional dan tempat terbaik untuk memulai. Faktanya tidak demikian.

Tradisi sebenarnya bukanlah seperti yang dikatakan orang-orang seperti itu, sebagai permulaan. Sistem 5 init dan Sistem 5 rc tanggal ke AT&T UNIX System 5, yang hampir sama setelah UNIX pertama seperti kita sekarang (katakanlah) setelah versi pertama Linux-Mandrake.

UNIX Edisi Pertama hanya memiliki init . Itu tidak memiliki rc . Bahasa rakitan Edisi Pertama init (yang kodenya telah dipulihkan dan disediakan oleh Warren Toomey et al.) langsung melahirkan dan respawn 12 getty proses, memasang 3 sistem file bawaan dari tabel bawaan, dan langsung menjalankan program dari direktori home pengguna bernama mel . getty tabel juga langsung di gambar program.

Itu satu dekade lagi setelah Sistem UNIX 5 yang disebut sistem init Linux "tradisional" muncul. Pada tahun 1992, Miquel van Smoorenburg (kembali) menulis init Linux +rc , dan alat terkaitnya, yang sekarang disebut orang sebagai "System 5 init ", meskipun sebenarnya itu 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 didiskusikan, dibuat, dirancang, diimplementasikan, dan dipraktikkan. Unis komersial juga melakukan banyak hal.

Sistem yang ada untuk dipelajari dan dipelajari

Berikut adalah daftar lengkap beberapa sistem init utama selain keduanya, dan satu atau dua dari (beberapa) poin penting mereka:

  • Keterbatasan Joachim Nilsson menggunakan file konfigurasi yang lebih mudah dibaca manusia.
  • Felix von Leitner menggunakan sistem konfigurasi filesystem-is-the-database, jejak memori kecil, dan memulai/menghentikan ketergantungan di antara hal-hal yang init dimulai.
  • Runit Gerrit Pape sesuai dengan apa yang telah saya gambarkan sebelumnya sebagai yang baru saja menelurkan empat skrip shell pendekatan.
  • InitNG bertujuan untuk memiliki dependensi, target bernama, beberapa file konfigurasi, dan sintaks konfigurasi yang lebih fleksibel dengan memuat lebih banyak pengaturan untuk proses anak.
  • pemula melakukan desain ulang lengkap, memodelkan sistem bukan sebagai layanan dan interdependensi sama sekali, tetapi sebagai peristiwa dan pekerjaan yang dipicu olehnya.
  • Desain nosh termasuk mengeluarkan semua manajemen layanan (termasuk getty pemijahan dan penuaian zombi) menjadi manajer layanan terpisah, dan hanya menangani perangkat/symlink/direktori "API" khusus sistem operasi dan peristiwa sistem.
  • init adalah init yang sangat sederhana. Itu mengeksekusi /bin/rc.init yang tugasnya adalah memulai program, me-mount sistem file, dll. Untuk ini, Anda dapat menggunakan sesuatu seperti minirc.

Selain itu, sekitar 10 tahun yang lalu, ada diskusi di antara pengguna daemontools dan lainnya tentang penggunaan svscan sebagai proses #1, yang menghasilkan proyek seperti svscan Paul Jarc sebagai studi proses 1, ide Gerrit Pape, dan svscan Laurent Bercot sebagai proses 1.

Yang membawa kita ke proses yang dilakukan program #1.

Apa proses yang dilakukan program #1

Gagasan tentang apa yang "seharusnya" dilakukan oleh proses # 1 pada dasarnya bersifat subyektif. Sebuah tujuan yang bermakna kriteria desain adalah apa proses #1 paling tidak harus melakukan. Kernel memberlakukan beberapa persyaratan padanya. Dan selalu ada beberapa hal khusus sistem operasi dari berbagai jenis yang harus dilakukan. Mengenai proses apa yang dimiliki #1 secara tradisional selesai, maka kita tidak minimal dan tidak pernah benar-benar.

Ada beberapa hal yang diminta oleh berbagai kernel sistem operasi dan program lain dari proses #1 yang tidak dapat dihindari begitu saja.

Orang-orang akan memberi tahu Anda bahwa fork() ing hal-hal dan bertindak sebagai induk dari proses yatim adalah fungsi utama dari 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 difaktorkan dari proses # 1 ke dalam proses lain, seperti manajer layanan khusus . Semua ini adalah manajer layanan, yang berjalan dengan proses #1:

  • IBM AIX srcmstr program, Pengontrol Sumber Daya Sistem
  • runsvdir dari Gerrit Pape dari runit
  • svscan Daniel J. Bernstein dari daemontools, svscan Adam Sampson dari freedt, svscan milik Bruce Guenter dari daemontools-encore, dan s6-svscan Laurent Bercot dari s6
  • perpd dari Wayne Marshall dari pelaku
  • Fasilitas Manajemen Layanan di Solaris 10
  • service-manager dari nosh

Demikian pula, seperti yang dijelaskan di https://superuser.com/a/888936/38062, seluruh /dev/initctl ide tidak perlu mendekati proses #1. Ironisnya, systemd yang sangat terpusatlah yang menunjukkan bahwa ia dapat dikeluarkan dari proses #1.

Sebaliknya, hal-hal wajib untuk init , yang biasanya dilupakan orang dalam desainnya yang unik, adalah hal-hal seperti menangani SIGINT , SIGPWR , SIGWINCH , dan seterusnya dikirim dari kernel dan memberlakukan berbagai permintaan perubahan status sistem yang dikirim dari program yang "mengetahui" bahwa sinyal tertentu untuk memproses #1 berarti hal-hal tertentu. (Misalnya:Seperti yang dijelaskan di https://unix.stackexchange.com/a/196471/5132, kumpulan alat BSD "tahu" bahwa SIGUSR1 memiliki arti tertentu.)

Ada juga tugas inisialisasi dan finalisasi sekali yang tidak dapat dihindari, atau akan sangat menderita karena tidak dilakukan, seperti memasang sistem file "API" atau membersihkan cache sistem file.

Dasar-dasar berurusan dengan sistem file "API" sedikit berbeda dengan pengoperasian init rom 1st Edition UNIX:Satu memiliki daftar informasi yang tertanam dalam program, dan satu hanya mount() Ini semua entri dalam daftar. Anda akan menemukan mekanisme ini dalam sistem yang beragam seperti BSD (sic!) init , melalui nosh system-manager , ke systemd.

"menyiapkan sistem untuk shell sederhana"

Seperti yang telah Anda amati, init=/bin/sh tidak memasang sistem file "API", mogok dengan cara yang canggung tanpa cache flush ketika salah satu mengetik exit (https://unix.stackexchange.com/a/195978/5132), dan secara umum menyerahkannya kepada pengguna (super) untuk secara manual melakukan tindakan yang membuat sistem dapat digunakan secara minimal.

Untuk melihat apa yang sebenarnya tidak punya pilihan selain dilakukan dalam proses # 1 program, dan dengan demikian membuat Anda berada di jalur yang baik untuk tujuan desain yang Anda nyatakan, pilihan terbaik Anda adalah melihat tumpang tindih dalam pengoperasian runit Gerrit Pape, Felix von minit Leitner, dan system-manager program dari paket nosh. Dua yang pertama menunjukkan dua upaya untuk menjadi minimalis, namun tetap menangani hal-hal yang tidak mungkin dihindari.

Yang terakhir berguna, saya sarankan, untuk entri manualnya yang ekstensif untuk system-manager program, yang merinci dengan tepat sistem file "API" apa yang dipasang, tugas inisialisasi apa yang dijalankan, dan sinyal apa yang ditangani; dalam sistem yang sesuai desain apakah manajer sistem baru saja menelurkan tiga hal lain (manajer layanan, pencatat data yang menyertainya, dan program untuk menjalankan perubahan status) dan hanya melakukan hal yang tidak dapat dihindari dalam proses #1.


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

  • Saat memasuki runlevel, ia memanggil skrip di /etc/rcX.d/S* dalam urutan alfanumerik, di mana X adalah runlevel. Skrip ini harus mengatur runlevel. Penyiapan tipikal adalah memulai daemon dan melakukan tugas penyiapan untuk tingkat proses tersebut. Ini adalah hal yang dilakukan satu kali saat memasuki runlevel.
  • Sementara dalam level run, ia memulai daemon yang terdaftar di /etc/inittab karena perlu aktif selama level lari itu. Jika daemon itu berhenti berjalan, itu akan memulai ulang. Meskipun Anda dapat memiliki daemon apa pun yang ingin dikelola oleh init , minimal Anda menginginkan beberapa getty agar Anda dapat masuk. getty keluar setelah proses masuk selesai, lalu init restart, memberikan prompt login baru.
    • Jika daemon memulai ulang terlalu sering dalam waktu yang terlalu singkat, daemon akan berhenti mencoba memulai ulang untuk sementara waktu.
    • Hanya karena sesuatu dimulai oleh skrip kickoff saat memasuki run level tidak membuat init secara otomatis mencoba untuk tetap berjalan. Anda perlu menentukannya secara terpisah di /etc/inittab .
  • Saat keluar dari runlevel, ia memanggil skrip di /etc/rcX.d/K* dalam urutan alfanumerik, di mana X adalah runlevel. Cara untuk mengimplementasikan shutdown atau reboot adalah dengan menentukan runlevel untuk event tersebut dan membuat tugas terakhir dieksekusi halt atau reboot perintah.
  • Ini akan memanggil executable sebagai respons terhadap peristiwa tertentu, seperti peristiwa daya atau Ctrl-Alt-Del.
  • Itu mendengarkan pada soket, jika menerima pesan tertentu itu akan mengubah runlevel.

Jadi Anda bisa menggunakan init sebagai manajer layanan dasar jika Anda mau, tetapi tugas utamanya saat ini adalah menjaga getty tersedia sehingga pengguna dapat masuk, dan memulai transisi runlevel.

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

Apapun yang kamu mau. Di Debian, di setiap /etc/rcX.d direktori adalah symlink ke skrip di /etc/init.d dan Anda dapat sepenuhnya menyesuaikan atau menghapus skrip tersebut. Urutan dibuat dengan mendahului setiap skrip dengan 00 , 01 , dll.

Anda juga dapat menentukan -b opsi untuk init (yaitu melalui baris perintah kernel) jika Anda hanya ingin init untuk menelurkan cangkang. Saat Anda keluar dari shell, init meninggal dan kapan init mati, kernel akan panik.


Minimal mutlak yang harus dilakukan init adalah menjalankan setidaknya satu program lain dan tidak pernah keluar. Jika init keluar, sistem macet. Saya kira bahkan menjalankan satu program lain tidak sepenuhnya diperlukan, tetapi Jika Anda tidak melakukannya, init harus bertanggung jawab untuk melakukan semua hal yang diharapkan dilakukan oleh sistem, atau itu tidak akan terlalu berguna.


Linux
  1. Deteksi Sistem Init Menggunakan Shell?

  2. Apa?

  3. Apa itu Exec 3?

  1. Apa yang Digema $? Mengerjakan??

  2. Apa yang Sebenarnya Dilakukan Grub_gfxpayload_linux=text?

  3. Apa yang dikembalikan malloc(0)?

  1. Apa yang dilakukan panggilan sistem brk()?

  2. Apa artinya 'cd -'?

  3. Apa yang dilakukan 'bash -c'?