Anlaşıldığı üzere, önyükleme işleminde çok fazla şey yok:
1. Bir önyükleme yükleyici diskteki çekirdek görüntüsünü bulur, belleğe yükler ve başlatır.
2. Çekirdek cihazları ve sürücülerini başlatır.
3. Çekirdek kök dosya sistemini monte eder.
4. Çekirdek init adlı bir program başlatır.
5. Init, işlemlerin geri kalanını harekete geçirir.
6. İnit'in önyükleme sırasının bir parçası olarak başlayan son işlemler giriş yapmanıza izin verir.
Önyükleme işleminin her aşamasını tanımlamak, önyükleme problemlerini düzeltmede ve sistemi bir bütün olarak anlamada paha biçilmezdir. Başlamak için, bilgisayarın kendi kendine testini yaptıktan sonra aldığınız ilk ekran veya istemi olan önyükleme yükleyicisine sıfır. Bir seçim yaptıktan sonra, önyükleme yükleyici Linux çekirdeğini çalıştırır ve sistemin kontrolünü çekirdeğe teslim eder.
Bu kitabın başka bir yerinde çekirdek hakkında bu makalenin alıntıldığı ayrıntılı bir tartışma var. Bu makale, Çekirdek başlatma aşamasıÇekirdek, sistemde bulunan donanım hakkında bir sürü mesaj yazdırdığında. Çekirdek, çekirdeğin monte ettiğini ilan eden bir mesaj görüntüledikten hemen sonra başlatmaya başlar. kök dosya sistemi:
VFS: monte edilmiş Kök (Ext2 dosya sistemi) Readonly.
Kısa bir süre sonra, init başlatma hakkında bir mesaj, ardından sistem hizmeti başlatma mesajları göreceksiniz ve son olarak bir tür oturum açma istemi elde edersiniz.
NOT : Açık Red Hat Linux, init notu özellikle açıktır, çünkü “memnuniyetle karşılanıyor” sen “Red Hat Linux.” Bundan sonra tüm mesajlar ekranın sağ tarafındaki parantezlerde başarı veya başarısızlık gösterir.
Bu bölümün çoğu Init ile ilgilidir, çünkü önyükleme sırasının en çok kontrole sahip olduğunuz bir parçasıdır.
init
Init hakkında özel bir şey yok. Tıpkı Linux sistemindeki diğerleri gibi bir programdır ve diğer sistem ikili dosyalarıyla birlikte /sbin'de bulacaksınız. Init'in temel amacı, belirli bir sırayla diğer programları başlatmak ve durdurmaktır. Bilmeniz gereken tek şey bu dizinin nasıl çalıştığıdır.
Birkaç farklı varyasyon vardır, ancak çoğu Linux dağıtımında burada tartışılan Sistem V stilini kullanır. Bazı dağılımlar BSD INIT'a benzeyen daha basit bir sürüm kullanır, ancak bununla karşılaşmanız pek olası değildir.
Runevels
Bir Linux sisteminde herhangi bir zamanda, belirli bir temel işlem kümesi çalışıyor. Makinenin bu durumuna çalışma seviyesi denir ve 0'dan 6'ya kadar bir sayı ile gösterilir. Sistem zamanının çoğunu tek bir koşuda geçirir. Ancak, makineyi kapattığınızda, INIT, sistem hizmetlerini düzenli bir şekilde sonlandırmak ve çekirdeğe durmasını söylemek için farklı bir çalışma seviyesine geçer. Yine başka bir çalışma, daha sonra tartışılan tek kullanıcı mod içindir.
RunEvels'i ele almanın en kolay yolu, INIT yapılandırma dosyasını /etc /inittab'ı incelemektir. Aşağıdakiler gibi bir satır arayın:
ID: 5: InitDefault:
Bu satır, sistemdeki varsayılan çalışma seviyesinin 5 olduğu anlamına gelir. Inittab dosyasındaki tüm satırlar bu formu alır, dört alan aşağıdaki sırayla meydana gelen kolonlarla ayrılmıştır:
# Benzersiz bir tanımlayıcı (önceki örnekte kimlik gibi kısa bir dize)
# Geçerli çalışma sayısı sayısı (lar)
# Init'in yapması gereken eylem (önceki örnekte, eylem varsayılan RunEvel'i 5'e ayarlamaktır)
# Yürütme komutu (isteğe bağlı)
Bir komut varsayılan RunEvel'i ayarlama bağlamında mantıklı olmadığından, önceki initdefault örneğinde yürütme komutu yoktur. Böyle bir çizgi görene kadar Inittab'a biraz daha fazla bakın:
L5: 5: Bekle: /etc/rc.d/rc 5
Bu çizgi, RC*.d ve init.d dizinleri aracılığıyla sistem yapılandırmasının ve hizmetlerinin çoğunu tetikler. Init'in Runlevel 5'teyken /etc/rc.d/rc 5 adlı bir komutu yürütecek şekilde ayarlandığını görebilirsiniz. Bekleme eylemi, Init'in komutu ne zaman ve nasıl çalıştırdığını söyler: Runlevel 5'e girerken RC 5'i bir kez çalıştırın ve ardından başka bir şey yapmadan önce bu komutu bitirmesini bekleyin.
InitDefault ve beklemeye ek olarak, özellikle güç yönetimi ile ilgili birkaç farklı eylem vardır ve Inittab (5) manuel sayfası size bunlar hakkında her şeyi anlatır. Karşılaşma olasılığınız en yüksek olanlar aşağıdaki bölümlerde açıklanmaktadır.
yeniden doğmak
Yeniden doğma eylemi, Init'in takip eden komutu çalıştırmasına ve komutun yürütülmesini bitirirse, tekrar çalıştırmasına neden olur. Inittab dosyanızdaki bu satıra benzer bir şey göreceksiniz:
1: 2345: yeniden doğma:/sbin/Mingetty tty1
Getty programları giriş istemleri sağlar. Önceki çizgi, Alt-F1 veya Control-ALT-F1 tuşuna bastığınızda gördüğünüz ilk sanal konsol (/dev/tty1) içindir. Yeniden doğma eylemi, oturum açtıktan sonra giriş istemini geri getirir.
Ctrlaltel
Ctrlaltdel eylemi, sanal bir konsolda kontrol-Alt-Delete'ye bastığınızda sistemin ne yaptığını kontrol eder. Çoğu sistemde, bu kapatma komutunu kullanarak bir tür yeniden başlatma komutudur.
syin
Sysinit eylemi, herhangi bir koşu seviyesine girmeden önce init başladığında çalışması gereken ilk şeydir.
Runevels'teki süreçler nasıl başlar?
Artık giriş yapmanıza izin vermeden hemen önce Init'in sistem hizmetlerini nasıl başlattığını öğrenmeye hazırsınız. Bu inittab satırını önceki hatırlatın:
L5: 5: Bekle: /etc/rc.d/rc 5
Bu küçük çizgi diğer birçok programı tetikler. RC, çalışma komutlarını temsil eder ve insanların komutlara komut dosyaları, programlar veya hizmetler olarak adlandırdığını duyacaksınız. Peki, bu komutlar nerede?
RunEvel 5 için, bu örnekte, komutlar muhtemelen /etc/rc.d/rc5.d veya /etc/rc5.d adresindedir. RunEvel 1 RC1.D kullanır, Runlevel 2 RC2.D kullanır, vb. Aşağıdaki öğeleri RC5.D dizininde bulabilirsiniz:
S10Sysklogd S20PPP S99GPM
S12Kerneld S25netstd_nfs S99HTTPD
S15netstd_init s30netstd_misc s99rmnologin
S18Netbase S45PCMCIA S99SSHD
S20Acct S89atd
S20Logoutd S89cron
RC 5 komutu, aşağıdaki komutları çalıştırarak bu RunEvel Dizin'deki programları başlatır:
S10sysklogd başlangıç
S12Kerneld Başlangıç
S15netstd_init start
S18netbase Start
…
S99SSHD Başlangıç
Her komutta başlangıç argümanına dikkat edin. Komut adındaki S, komutun başlangıç modunda çalışması gerektiği ve (00 ila 99) sayısının RC'nin komutu nereden başlattığını belirler.
RC*.d komutları genellikle /sbin veya /usr /sbin'deki programları başlatan kabuk komut dosyalarıdır. Normalde, komut dosyasına daha az veya başka bir çağrı cihazı programı ile bakarak komutlardan birinin gerçekte ne yaptığını bulabilirsiniz.
Bu hizmetlerden birini elle başlatabilirsiniz. Örneğin, HTTPD Web Server programını manuel olarak başlatmak istiyorsanız, S99HTTPD Başlat'ı çalıştırın. Benzer şekilde, makine açıkken hizmetlerden birini öldürmeniz gerekiyorsa, RC*.d dizinindeki komutu durdurma bağımsız değişkeni (örneğin S99HTTPD durağı) ile çalıştırabilirsiniz.
Bazı rc*.d dizinleri, k ile başlayan komutlar içerir (için “öldürmek,” veya stop modu). Bu durumda, RC komutu başlangıç yerine durdurma argümanı ile çalıştırır. Sistemi kapatan koşu seviyelerinde K komutlarıyla karşılaşmanız muhtemeldir.
Hizmetleri ekleme ve kaldırma
RC*.d dizinlerine hizmetleri eklemek, silmek veya değiştirmek istiyorsanız, içindeki dosyalara daha yakından bakmanız gerekir. Uzun bir liste şöyle bir yapıyı ortaya çıkarır:
Lrwxrwxrwx. . . S10Sysogd -> ../init.d/sysklogd
Lrwxrwxrwx. . . S12Kerneld -> ../init.d/Kerneld
lrwxrwxrwx. . . S15netstd_init -> ../init.d/netstd_init
lrwxrwxrwx. . . S18NetBase -> ../init.d/netbase
…
Bir RC*.d dizinindeki komutlar aslında bir init.d dizinindeki dosyalara, genellikle /etc veya /etc/rc.d'deki dosyalara sembolik bağlantılardır. Linux dağıtımları, tüm RunEvels için aynı başlatma komut dosyalarını kullanabilmeleri için bu bağlantıları içerir. Bu kongre hiçbir şekilde bir gereklilik değildir, ancak organizasyonu genellikle biraz daha kolaylaştırır.
Init.d dizinindeki komutlardan birinin belirli bir RunEvel'de çalışmasını önlemek için, uygun RC*.d dizinindeki sembolik bağlantıyı kaldırmayı düşünebilirsiniz. Bu işe yarıyor, ancak bir hata yaparsanız ve bağlantıyı tekrar yerine koymanız gerekiyorsa, bağlantının tam adını hatırlamakta sorun yaşayabilirsiniz. Bu nedenle, RC*.d dizinlerindeki bağlantıları kaldırmamalısınız, daha ziyade, bağlantı adının başlangıcına şöyle bir alt çizgiye (_) ekleyin:
MV S99HTTPD _S99HTTPD
Önyükleme zamanında, RC _S99httpd'yi yok sayar, çünkü S veya K ile başlamaz. Ayrıca, orijinal ad hala açıktır ve bir tutam içindeyseniz ve elle çalıştırmanız gerekiyorsa komuta hızlı erişiminiz vardır.
Bir hizmet eklemek için, init.d dizinindeki diğerleri gibi bir komut dosyası oluşturmalı ve ardından Doğru RC*.D dizininde sembolik bir bağlantı oluşturmalısınız. Bir komut dosyası yazmanın en kolay yolu, zaten init.d'deki komut dosyalarını incelemek, anladığınız birinin kopyasını oluşturmak ve kopyayı değiştirmektir.
Bir hizmet eklerken, hizmeti başlatmak için önyükleme sırasında uygun bir yer seçtiğinizden emin olun. Hizmet çok erken başlarsa, başka bir hizmete bağımlılık nedeniyle işe yaramayabilir. Gerekli olmayan hizmetler için, çoğu sistem yöneticisi, sistemle birlikte gelen hizmetlerin çoğundan sonra 90'larda sayıları tercih eder.
Linux dağıtımları genellikle RC*.D dizinlerinde hizmetleri etkinleştirmek ve devre dışı bırakmak için bir komutla birlikte gelir. Örneğin, Debian'da komut Update-rc.d ve Red Hat Linux'ta komut chkconfig. Grafik kullanıcı arayüzleri de mevcuttur. Bu programların kullanılması, başlangıç dizinlerinin tutarlı tutulmasına yardımcı olur ve yükseltmelere yardımcı olur.
İPUCU: En yaygın Linux kurulum problemlerinden biri, açılan ve kapatılan ve sistemi konsolda kullanılamaz hale getiren yanlış yapılandırılmış bir XFREE86 sunucusudur. Bu davranışı durdurmak için, tek kullanıcı moduna geçin ve RunEvel veya RunEvel Hizmetlerinizi değiştirin. RC*.D dizinlerinizde veya /etc /inittab'inizde XDM, GDM veya KDM içeren bir şey arayın.
İnit kontrol etmek
Bazen, init'e koşu seviyelerini değiştirmek, Inittab dosyasını yeniden okumak veya sadece sistemi kapatmak için küçük bir vuruş vermeniz gerekir. Init her zaman bir sistemdeki ilk işlem olduğundan, işlem kimliği her zaman 1'dir.
INIT'i Telinit ile kontrol edebilirsiniz. Örneğin, RunEvel 3'e geçmek istiyorsanız, şu komutu kullanın:
telinit 3
Çalışma seviyelerini değiştirirken, Init yeni Runlevel için Inittab dosyasında olmayan işlemleri öldürmeye çalışır. Bu nedenle, koşu seviyelerini değiştirmeye dikkat etmelisiniz.
Yeniden doğma işleri eklemeniz veya kaldırmanız veya Inittab dosyasında başka bir değişiklik yapmanız gerektiğinde, Init'i değişikliği anlatmalı ve dosyayı yeniden okumasına neden olmalısınız. Bazı insanlar init'e bunu yapmayı söylemek için Kill -hup 1 kullanır. Bu geleneksel yöntem, doğru yazdığınız sürece Unix'in çoğu sürümünde çalışır. Ancak, bu telinit komutunu da çalıştırabilirsiniz:
Telin Q
Tek kullanıcı moduna geçmek için Telinit S'yi de kullanabilirsiniz.
Kapatma
Init ayrıca sistemin nasıl kapatıldığını ve yeniden başlatıldığını da kontrol eder. Bir Linux makinesini kapatmanın doğru yolu kapatma komutunu kullanmaktır.
Kapatmayı kullanmanın iki temel yolu vardır. Sistemi durdurursanız, makineyi kapatır ve tutar. Makinenin hemen durmasını sağlamak için şu komutu kullanın:
Kapatma -H Şimdi
Linux'un makul olarak yeni versiyonlarına sahip çoğu modern makinede, bir durma gücü makineye keser. Makineyi de yeniden başlatabilirsiniz. Yeniden başlatma için -H yerine -r kullanın.
Kapatma işlemi birkaç saniye sürer. Bu aşamada asla bir makineyi sıfırlamamalı veya güçlendirmemelisiniz.
Önceki örnekte, şimdi kapanma zamanı. Bu argüman zorunludur, ancak bunu belirtmenin birçok yolu vardır. Makinenin gelecekte bir süre aşağı inmesini istiyorsanız, bir yolu +n kullanmaktır, burada n, işini yapmadan önce dakikalık kapatma sayısı beklemelidir. Diğer seçenekler için kapatma (8) manuel sayfasına bakın.
Sistemin 10 dakika içinde yeniden başlatılmasını sağlamak için şu komutu çalıştırın:
Kapatma -r +10
Linux'ta Shutdown, makinenin aşağı indiğini giriş yapan herkese bildirir, ancak bu çok az gerçek iş yapar. Şimdiye kadar başka bir zaman belirlerseniz, kapatma /etc /nologin adlı bir dosya oluşturur. Bu dosya mevcut olduğunda, sistem süper kullanıcı dışındaki herkesin girişlerini yasaklar.
Sistem kapatma süresi nihayet geldiğinde, Shutdown Init'e bir durma için RunEvel 0'a geçmesini ve yeniden başlatma için RunEvel 6'ya geçmesini söyler. Init, RunEvel 0 veya 6'ya girdiğinde, RC0.D ve RC6.D içindeki komut dosyalarına bakarak doğrulayabileceğiniz aşağıdakilerin tümü gerçekleşir.
1. Init, yapabileceği her işlemi öldürür (başka bir koşu seviyesine geçerken olduğu gibi).
# İlk RC0.D/RC6.D komutları çalıştırır, sistem dosyalarını yerine kilitler ve kapatma için başka hazırlıklar yapmak.
# Sonraki RC0.D/RC6.D, kök dışındaki tüm dosya sistemlerini aşma komutları verir.
# Daha fazla rc0.d/rc6.d komutları kök dosya sistemini salla okunur.
# Hala daha fazla rc0.d/rc6.d komutları Senkronizasyon programı ile tüm arabelleğe alınan verileri dosya sistemine yazın.
# Son RC0.D/RC6.D komutları, çekirdeğe yeniden başlatma, durma veya potrosoff programı ile yeniden başlatmasını veya durmasını söyler.
Yeniden başlatma ve durma programları, her koşu seviyesi için farklı davranır ve potansiyel olarak karışıklığa neden olur. Varsayılan olarak, bu programlar -r veya -h seçenekleriyle kapatma çağırır, ancak sistem halihazırda durma veya yeniden başlatma Runlevel'deyse, programlar çekirdeğe hemen kapanmasını söyler. Makinenizi gerçekten aceleyle kapatmak istiyorsanız (düzensiz bir kapanıştan elde edilen olası hasarı göz ardı ederek), -F seçeneğini kullanın.