İnit tam olarak ne yapar?


43

Linux dağıtımı yaratıyorum ve şimdi bir init programına ihtiyacım var. C kodunu gerçekten iyi kodlayabilirim ve linux hakkında çok şey biliyorum (çok fazla değil ama 4 yıldır geliştirme için arch linux kullanıyorum), C de kendi temel init betiğimi yazmayı denemem gerektiğini düşündüm. merak ediyorum, init sistemi basit bir kabuk için ayarlamak için ne yapıyor? (“İnit ne yapar?” Diye sorduğumda, initin ne olduğunu ve ne işe yaradığını biliyorum.

Koda ihtiyacım yok ve muhtemelen temel komutlara bile ihtiyacım yok ancak çalıştırılma sırasına ihtiyacım var.


1
Perl, awk, bash, (t) csh, yerel ikili dosyalar, dahil olmak üzere SysV tarzı init betikleri için istediğiniz tercümanı kullanabilirsiniz. Bash normalde kullanılır, çünkü bu tür betiklerin bulunduğu sistemde kullanılabilir olması neredeyse garanti edilir. SysVinit ve bash arasında bir eşleşme olduğundan önyükleme işleminde ilgili noktada konuşlandırılır. SysVinit sözleşmeyi tanımlar ve her komut dosyası geliştiricinin uygun gördüğü şekilde bu sözleşmeyi uygulamakta serbesttir.
CVn

Yanıtlar:


53

Sistem 5 initsize hikayenin sadece küçük bir bölümünü anlatacak.

Linux dünyasını etkileyen bir tür miyopi var. İnsanlar "Sistem 5 init" diye bir şey kullandıklarını düşünüyorlar ve bu hem geleneksel olan hem de başlamak için en iyi yer. Aslında bu da değil.

Gelenek, aslında bu tür insanların ne söylediğini, başlangıç ​​için değil. Sistem 5 initve Sistem 5 rc, AT&T UNIX Sistem 5'e dayanıyor; bu, Linux-Mandrake'in ilk sürümünden hemen sonra şu anda olduğumuz gibi (ilk UNIX'ten hemen sonraydı).

1. Baskı UNIX sadece vardı init. Olmadı rc. 1. Baskı çevirici dili init( kimin kod edilmiş restore ve Warren Toomey ve arkadaşları tarafından sunulan. ) Doğrudan olurken ve 12 respawned gettysüreçleri, 3 kablolu dosya sistemlerine monte bir tablo dahili ve doğrudan a ev dizininden bir program koştu kullanıcı adında mel. gettyTablo programı görüntüde doğrudan da oldu.

UNIX Sistem 5'ten sonra "geleneksel" Linux init sisteminin devreye girmesi de on yıldı. 1992'de, Miquel van Smoorenburg (yeniden) bir Linux init+ yazdı rcve bunlarla birlikte insanların şu anda "Sistem 5 init" olarak adlandırdığı ilgili araçlar, aslında UNIX Sistem 5'in yazılımı olmasa da (ve sadece init).

Sistem 5 init/ rcbaşlamak için en iyi yer değil ve bilinmesi gereken şeyin yarısını kapsamayan bir systemd bilgisine sahip olsa bile. Init sistem tasarımı alanında (Linux ve BSD'ler için) yalnızca son yirmi yılda gerçekleşen çok fazla çalışma oldu. Her türlü mühendislik kararı tartışıldı, yapıldı, tasarlandı, uygulandı ve uygulandı. Ticari Unices de çok şey yaptı.

Çalışmak ve öğrenmek için mevcut sistemler

İşte bu ikisi dışındaki başlıca init sistemlerinden bazılarının ve (birkaç) göze çarpan noktalarından birinin veya ikisinin eksik bir listesi :

  • Joachim Nilsson'un sırası daha insan tarafından okunabilen bir yapılandırma dosyası kullanma yoluna gitti.
  • Felix von Leitner'ın emri , bir veritabanı sistem konfigürasyon sistemi, küçük bellek ayak izleri ve başlayanlar arasında başlat / durdur bağımlılıkları için gitti init.
  • Gerrit Pape'in runitinde daha önce tarif edilenler için sadece spawn dört kabuk komut dosyası yaklaşımı olarak gitti.
  • InitNG bağımlılıklara, adlandırılmış hedeflere, çoklu konfigürasyon dosyalarına ve alt işlemler için daha fazla ayar yüküne sahip daha esnek bir yapılandırma sözdizimine sahip olmayı hedeflemiştir.
  • lansman , sistemi hiç bir şekilde hizmetler ve bağımlılıklar olarak değil, onlar tarafından tetiklenen olaylar ve işler olarak modelleyerek tamamen yeniden tasarlandı.
  • Nosh tasarımı, tüm servis yönetimini ( gettyyumurtlama ve zombilerin ortaya çıkması dahil ) ayrı bir servis yöneticisine itmeyi ve sadece işletim sistemine özel "API" cihazlarını / sembolik bağlarını / dizinlerini ve sistem olaylarını idare etmeyi içerir .
  • günah işlemek çok basit bir başlangıçtır. Bu yürütür /bin/rc.initkimin işi gibi bir şey kullanabilirsiniz Bunun için, vb dosya sistemi monte programları başlamaktır minirc .

Üstelik yaklaşık 10 yıl önce, daemontools kullanıcıları ve kullanmanın diğerleri arasında tartışma oldu svscangibi projelerde yol açtı süreç # 1, olarak Paul JARC en svscan sürecin 1 çalışma olarak , Gerrit Pape fikirleri ve Laurent Bercot en svscan süreci 1 olarak .

Bu da bizi # 1 programlarının yaptığı işleme getiriyor.

İşlem 1 numaralı programlar ne yapar

1 numaralı sürecin ne yapması gerektiği ile ilgili kavramlar, tabiatlarına göre özneldir. Anlamlı bir objektif tasarım kriteri, en azından 1 numaralı sürecin yapması gereken şeydir . Çekirdek üzerine birkaç gereksinim getirir. Ve her zaman, işletim sistemine özgü, yapması gereken çeşitli türde şeyler vardır. Geleneksel olarak # 1 numaralı sürecin ne olduğuna gelince , o zaman biz asgari düzeyde değiliz ve hiç olmadık.

Çeşitli işletim sistemi çekirdeği ve diğer programların, işlemden geçirilemeyecek 1 numaralı işlem için talep ettiği birkaç şey var.

İnsanlar size fork()işleri yapmanın ve artık işlemlerin ebeveyni olarak davranmanın, işlem # 1'in asıl işlevi olduğunu söyleyecektir . İronik olarak, bu doğru değildir. Artık işlemlerle uğraşmak ( https://unix.stackexchange.com/a/177361/5132'de açıklandığı gibi son Linux çekirdeğinde olduğu gibi ), kişinin işlemden büyük ölçüde 1 numaralı işlemi diğer faktörlere ayırabileceği sistemdir. özel bir servis yöneticisi . Bunların hepsi 1 numaralı işlemden geçen servis yöneticileridir:

  • IBM AIX srcmstrprogramı, Sistem Kaynağı Denetleyicisi
  • Gerrit runsvdirPape'den runit
  • Daniel J. Bernstein var svscandaemontools gelen Adam Sampson adlı svscandan freedt Bruce Guenter en svscandaemontools-bis olarak gelen ve Laurent Bercot en s6-svscandan s6
  • Wayne Marshall perpdperp'ten
  • Solaris'te Hizmet Yönetimi Tesisi 10
  • service-managernosh dan

Benzer şekilde, https://superuser.com/a/888936/38062 adresinde açıklandığı gibi , tüm /dev/initctlfikrin işlem # 1'in yakınında hiçbir yerde olması gerekmez. İronik olarak, 1 numaralı süreçten çıkarılabileceğini gösteren merkezi bir sistemdir.

Tersine, zorunlu şeyler init, yani insanlar genellikle kendi off-the-top-of-the-head tasarımlarda unutmak gibi elden geçirilmeden olarak şeylerdir SIGINT, SIGPWR, SIGWINCHve benzeri çekirdekten gönderilen ve gönderilen çeşitli sistem durum değişikliği isteklerini yürürlüğe koymak # 1'i işlemek için belirli sinyallerin belirli şeyler ifade ettiğini "bilen" programlardan. (Örneğin: https://unix.stackexchange.com/a/196471/5132 adresinde açıklandığı gibi , BSD araç setleri SIGUSR1belirli bir anlamı olan "bilir" .)

"API" dosya sistemlerini kurmak veya dosya sistemi önbelleğini temizlemek gibi bir kişinin kaçamayacağı veya yapamamasından büyük zarar göreceği bir kereye mahsus başlatma ve sonlandırma görevleri de vardır .

"API" dosya sistemleriyle başa çıkmanın temelleri, init1st Edition UNIX işletim sisteminden biraz farklıdır : Birinde programa bağlanmış bir bilgi listesi vardır ve bir mount()tanesi de listedeki tüm girişlerdir. Bu mekanizması BSD (sic!) Kadar çeşitli sistemlerde init, delikten sisteme doğru bulacaksınız system-manager.

"sistemi basit bir kabuk için ayarla"

Gördüğünüz gibi, init=/bin/sh"API" takılıyken fileystems alamıyor, bir tür yazıldığında exit( https://unix.stackexchange.com/a/195978/5132 ) ve genel olarak ayrıldığında önbellek boşalmadan ungainly bir şekilde çöküyor sistemi çok az kullanılabilir kılan eylemleri manuel olarak yapmak için (süper) kullanıcıya.

Aslında 1 numaralı programda yapmaktan başka seçeneğin olmadığını görmek ve böylece belirtilen tasarım hedefiniz için sizi iyi bir kursa koymak için en iyi seçeneğiniz Gerrit Pape'in koşusu Felix von'in operasyonundaki örtüşmelere bakmaktır. Leitner'ın bakışı, ve system-managernosh paketindeki program. İlk ikisi, minimalist olmak için iki girişimde bulundular, ancak yine de kaçınılması mümkün olmayan şeylerle ilgileniyorlar.

İkincisi, system-managerprogramın kapsamlı manuel girişi için , hangi "API" dosya sistemlerinin ne şekilde monte edildiğini, hangi başlatma görevlerinin yerine getirildiğini ve hangi sinyallerin ele alındığını ayrıntılarıyla açıklar; bir sistemde bu tasarım ile sistem yöneticisi vardır sadece üç başka şeyler (hizmet yöneticisi, beraberindeki logger ve durum değişikliklerini çalıştırmak için programı) ve sadece sürecin 1. kaçınılmaz yapmak yumurtlamaya.


3
Müthiş cevap ve çok bilgilendirici. Ama kendime bu büyük resmin OSX'in neresinde olduğunu soruyorum launchd. Bazen insanlar tamamen OSX'in büyük * nix ailesinin bir üyesi (mükemmel) olduğunu unuturlar.
DavAlPi

4

Debian'da System V init (diğer çeşitler ve çeşitler vardır) aşağıdakileri yapar:

  • Bir çalışma seviyesine girerken, komut satırlarını /etc/rcX.d/S*alfasayısal sırayla çağırır X, çalışma seviyesi nerede . Bu komut dosyaları çalışma seviyesini ayarlamalıdır. Tipik bir kurulum günlükleri başlatır ve bu çalışma seviyesi için kurulum görevlerini gerçekleştirir. Bu, çalışma seviyesine girerken yapılan tek seferlik bir şey.
  • Koşma seviyesindeyken, koşma seviyesi /etc/inittabboyunca aktif olma gereksinimi duyulan listeye giren şeytanları başlatır . Bu zindanlar çalışmayı keserse, onları yeniden başlatır. Yönetmek istediğiniz herhangi bir arka plana sahip olmanıza rağmen init, en azından bir kaçını istediğinizde gettyoturum açabilmeniz için giriş yapın. gettyGiriş tamamlandıktan sonra çıkar ve ardından inityeniden başlatır ve yeni bir giriş istemi sağlar.
    • Eğer arka plan programı bir süre içinde çok kısa sürede tekrar başlarsa, bir süre tekrar başlatmayı denemeyi bırakır.
    • Sırf başlama seviyesine girerken başlama komut dosyası tarafından bir şeyin başlatılmış olması, initotomatik olarak çalışmaya devam etmesini sağlamaz . Bunu içinde ayrı ayrı belirtmeniz gerekir /etc/inittab.
  • Bir çalışma seviyesinden çıkarken, komut dosyalarını /etc/rcX.d/K*alfasayısal sırayla çağırır X, çalışma seviyesi nerede . Kapatma veya yeniden başlatmayı gerçekleştirmenin bir yolu, bu olaylar için bir çalışma seviyesi tanımlamak ve son görevi haltya da rebootkomutunu çalıştırmaktır .
  • Power olaylar veya Ctrl-Alt-Del gibi belirli olaylara cevap olarak çalıştırılabilirleri çağıracak.
  • Bir sokette dinler, eğer belli mesajları alırsa çalışma seviyesini değiştirir.

initİsterseniz ilkel servis yöneticisi olarak kullanabilirsiniz , ancak bu günlerde asıl görev, gettybir kullanıcının giriş yapabilmesi ve runlevel geçişlerini başlatabilmesi için erişilebilir olmasını sağlamaktır .

Sadece merak ediyorum, sistemi basit bir kabuk için kurmak için ne gibi işler yapıyor?

Ne isterseniz. Debian'da, her bir /etc/rcX.ddizinde bir betiğin sembolik bağlantısı vardır ve bu betiği /etc/init.dtamamen özelleştirebilir veya kaldırabilirsiniz. Sipariş bir ile her bir komut önceki tarafından kurulur 00, 01vs.

Ayrıca sadece bir kabuk oluşturmak istiyorsanız (örneğin çekirdek komut satırıyla) -biçin bir seçenek belirleyebilirsiniz . Eğer kabuk, çıktığınızda ölür ve ne zaman ölür, çekirdek panik olacaktır.initinitinitinit


2

İnit'in yapması gereken mutlak minimum minimum, en az bir başka programdır ve hiç çıkmaz. İnit çıkarsa sistem kilitlenir. Sanırım başka bir programı çalıştırmak bile kesinlikle gerekli değil, ancak bunu yapmazsanız, init, sistemin yapması beklenen her şeyi yapmaktan sorumlu olacaktı ya da çok faydalı olmayacaktı.


1
PID 1'in düştüğü buggy Linux sistemim vardı ancak sistem temelde çalışmaya devam etti. PID 1 çökmesinin ne kadar kötü olduğu çekirdek sürümüne bağlı olabilir.
Gilles 'SO- kötülük yapmayı bırak'

1

init ne istersen yapabilirsin

init, önyükleme işleminin sonunda Linux çekirdeği tarafından çağırılan keyfi bir yürütülebilir dosyadır (ve bu tür yürütülebilir dosyalardan yalnızca biri).

Normalde bir ELF çalıştırıcısı olarak uygulanır, ancak bir kabuk betiği de olabilir chmod +x: Init bir kabuk betiği olarak

Sysemd gibi tipik uygulamalar sistemin konfigürasyon dosyalarını okuyacak /etc/initrcve daha sonra sistemin çeşitli yönlerini uygulamak için bu konfigürasyonlara dayanan bir dizi kullanıcı alanı işlemini takip edecektir.

Ancak, bu tamamen uygulamaya özeldir ve bu nedenle, belirli bir uygulamayı belirtmeden sorunuzu yanıtlayamazsınız. Örneğin, initsadece eğitim amaçlı bir rebootçağrı yapan bir süreçle oynuyorum .

Linux çekirdeği /initvarsayılan olarak yoldaki yürütülebilir dosyayı arar , ancak bu durum init=Linux çekirdeği komut satırı parametresi tarafından geçersiz kılınabilir .

Oyun oynamanın en iyi yollarından biri initQEMU kullanmaktır, çünkü çekirdek komut satırı parametrelerini QEMU komut satırından QEMU komut satırından -appendseçeneği ile ve masaüstünüze tuğla yapma korkusu olmadan geçirebilirsiniz .

İşte en az tamamen otomatikleştirilmiş Buildroot + QEMU kurulumum , konuyu açığa çıkarmak için kendi initlerinizle oynamayı çok kolay hale getiriyor.


0

Modüler "bir şeyi yap ve iyi yap" ilkesine bağlıysanız, o zaman bir initprogram süreçleri başlatmalıdır.

İşlemleri Başlat

Çekirdek başarıyla sıkıştırıldıktan sonra, bir sistemin çalışması için gereken tüm başlangıç ​​işlemlerini (örneğin / etc / fstab içinde bulunan sürücüleri monte etmek, ağ arayüzleri getirmek, ve yakında).

Yeniden başlatma ve kapatma işlemi esas olarak birbirinin tersi olduğundan, bir başlatma programının işlemlerin bir kapatma komutuyla durdurulduğundan emin olması yaygındır.

İşlemleri Durdur

Bu, işlemin man sayfasına göre işlemleri durdurması gerektiği anlamına gelir (başka bir deyişle, sadece bir kesin değil kill -9, işlemi sona ermek istediği şekilde aşağıya çekmek zorundadır), sürücülerin bağlantısını kesmek ve nihai olarak kesinti komutunu vermek gerekir. .

Referanslar

Bunun başkaları tarafından nasıl yapıldığına dair iyi bir referans, Slackware'in /etc/rc.d scriptlerine ve aynı zamanda zaten var olan basit bir init sistemine, doksan gibi ( minimal hale gelen bir halefere) bakmaktır . Bir sürecin denetimine sahiptir (yani eğer bir süreç ölürse, yeniden başlatılır), ki bu kesinlikle tartışmasız bir iş değildir, fakat özellikle yazarın örnek senaryoları aracılığıyla anlaşılması hala oldukça basit ve basittir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.