Bu yazımda Ubuntu Server sisteminde boot işlemi üzerine tuttuğum notları ve çevirimi paylaşıyorum. Boot işlemi benim için her zaman büyülü anlaşılması zor olan bir kavramdı. Şimdi bunun oldukça mantıklı bir sistemle ve gereksinimler üzerine inşa edildiğini anladım.
Proseslerin Kontrolü
Öncelikle işimize yarayacak bazı kodlara bakalım. Bunları eminim herkes biliyordur ancak hatırlatma gibi olsun istedim.
Sistemimizdeki en çok sistem kaynaklarını tüketen programları anlık olarak takip etmemizi sağlar.
Sistem açıldığından itibaren kullanılan prosesleri yazdırır.
Bir önceki komutun çıktısını daha sade hale getirir.
Proses ID’si ile prosesi sonlandırmanızı sağlar.
Her proses kill işlemine cevap vermeyebilir bunun için onu zorlayabiliriz. Bu koddan önceki kodu denememiz daha uygundur. Böylece proses kendisini daha düzgün sonlandırmayı dener.
Çıktılar ekrana sığmıyorsa shift PgUp-PgDown tuşlarıyla sonuçlar üzerinde gezinebilirsiniz.
Sistemde root hesabını kullanmak güvenlik açısından pek tavsiye edilmez. Onun yerine hepimizin sevgilisi olan sudo kullanılır
Ubuntu Boot Prosesleri
Ubuntu Upstart servisleriyle tamamiyle değişik start-up prosesi kullanır. System V init modeliyle uyumlu olarak tasarlanmıştır.
Grub Boot Loader
Mster Boot Record’da (harddiskin ilk 512 byte’ı) bulunan bir koddur. Hangi Linux kernelinin boot edileceğini kontrol eder.
Konfigurasyon dosyası: /boot/grub/grub.cfg.
Bu dosyayı elle değiştirmiyoruz. Değişiklik yapmak istersek /etc/default/grub u düzenliyor ve aşağudaki kodu çalıştırıyoruz:
Desktop versiyonu için bunu kullanmamız gerekmese de Ubuntu Server için bu dosya üzerinde değişiklikler yapmamız gerekebilir. Dökümantasyon için bu konfigurasyon dosyalarındaki yorumları veya projenin kendi sitesine bakabilirsiniz. Döküamnın hepsi için:
Grub ayarları açılışta da yapılandırılabilir. Eğer Grub menüsünü göremiyorsanız shift tuşuna basın. Ardından menüde değiştirmek istediğiniz Kernel sürümünü seçip E tuşuna basın. Bundan sonra istediğiniz ayarı değiştirebilirsiniz. Ctrl x ile menüye geri dönün.
Eğer shift tuşuna zamanında basmakta zorlanıyorsanız /etc/default/grub içindeki GRUB_HIDDEN_TIMEOUT değeri daha büyük bir değerle değiştirin (10 gibi) ardından
komutunu çalıştırın.
Kernel Boot Prosesi
GRUB menüsünden kerneli seçtiğimizde GRUB o kerneli bellekteki initrd dosyasına (initial RAM disk) yükler. initrd dosyası aslında initramfs dosyası olarak bilinen gziplenmiş cpio arşividir. Eğer bu özel initramfs dosyasına eklenen dosyaları merak ediyorsanız aşağıdaki işlemleri uygulayınız:
-
cp /boot/initrd.img-3.0.0-12-server /tmp/initrd.img-3.0.0-12-server.gz
-
cd /tmp
-
gunzip initrd.img-3.0.0-12-server.gz
-
mkdir initrd
-
cd initrd
-
cpio -idv < /tmp/initrd.img-3.0.0-12-server
Şimdi bu /tmp/ dizininde root dizinine benzer dizinlerin bir kısmını göreceksiniz. Kernel boot olurken öncelikle temel konfigürasyon dosyalarına, kernel modüllerine ve sistem binarysini yükleyecek kadar root dosya sistemini oluşturur.
Kernel modüllerinin root dosya sisteminde olması, o dosya sistemine erişebilmek için de bu kernel modüllerine ihtiyaç duyulması mantıksal bir problem oluşturur(tavuk yumurta problemi). Bu da initramfs dosyasına açıklık getirir. initramfs dosyası root dosya sisteminin yüklenebilmesi ve boot işlemine devam edilmesi için gerekli olan temel kernel modülleriyle birlikte kerneli ve sistem binarisini sağlar. Kernel derlenirken kernelin boot olabilmesi için gerekli olan bu initramfs dosyasını yapılandırır.
Kernel boot olurken initramfs RAM’e açılır ve onun root dizinindeki init scripti çalışır. Yukarıdaki yönergeyi izleyerek bu koda ulaşabilirsiniz. Mount işlemlerini sağlayan bash kodundan ibarettir. Görevini tamamladıktan sonra kurduğu gerçek root dosya sistemindeki /sbin/init kodunu çalıştırır. Bu boot prosesindeki diğer fazı başlatır.
/sbin/init
/sbin/init programı sistemde çalışan bütün programların öncül prosesidir. Bu prosesin PID’si her zaman 1′dir ve Linux sistemindeki bütün proseslerden sorumludur. Unix sistemlerinde farklı başlatma standratları vardır fakat klasik Linux sistemlerinin çoğunluğu System V init modelini kullanır. Ubuntu Server bunun yerine Upstart modeline geçmiştir. Ubuntu runlevels ve /etc/rc?.d dizinleri gibi bir çok yapıyı eskiye yönelik uyumluluk için korumuştur. Upstart artık kaputun altındaki herşeyi yönetmektedir.
Classic System V init
Bu init sisteminde, init prosesi /etc/inittab konfigürasyon dosyasını öntanımlı runlevelini keşfetmek için okunur. Ardından bu runlevele (çalışma aşaması) girilir ve runlevelde çalışacal konfigüre edilmiş prosesler çalıştırılır.
RUNLEVELLAR
System V init prosesi farklı sistem durumlarıyla tanımlanmıştır bunlar runlevelleri olarak bilinir. Runlevelleri 0′dan 6′ya kadar numaralarla ayrılmıştır. Her numara tamamiyle değişik durum sistemini belirtir. Örneğin runlevel 0 halted sistem durumu için ayrılmıştır. Eğer runlevel 0′a girerseniz, sistem bütün prosesleri kapatır, bütün sistem dosyaları unmount edilir ve enerji kesilir. Runlevel 6 ise reboot işlemi için ayrılmıştır. Runlevel 1 tek kullanıcı modu için ayrılmıştır-sadece bir kullanıcı bu durumda sisteme giriş yapabilir. Bu tek kullanıcı modunde genellikle az sayıda proses çalıştırılır. Sistemin tamamıyla boot olamadığı durumlarda arıza giderimi için oldukça kullanışlıdır. GRUB menüsündeki recovery modu runlevel 1′e girmenizi sağlar.
2′den 5′e kadar olan runlevelleri dağıtımların tanımlaması için bırakılmıştır. Birçok Farklı runlevellerinin olmasının altında yatan serverin girebileceği birçok modu kullanıcının yaratabilmesini sağlamaktır. Geleneksel olarak Linux sistemleri bir grafik masaüstü runleveli (RedHat için 5) ve bir de grafiksiz runleveli (RedHat için 3) içerirler. Kullanıcı diğer runlevellerini tanımlayabilir, örneğin network bağlantısı olmadan açılış gibi. Boot ederken bu runleveli seçebilirsiniz. Ayrıca sistem boot edildikten sonra init komutu ile runlevelinizi değiştirebilirsiniz. Ubuntu Server sisteminizde tek kullanıcılı moda geçmek için aşağıdaki kodu çalıştırabilirsiniz.
Sisteminizi kapatmak için halt komutuna alternatif olarak aşağıdaki kodu kullanabilirsiniz.
init Scriptleri
/etc/inittab’ın yanında sistemdeki bütün büyük servsiler için açılış ve kapanış scriptleri, init scriptlerini barındıran önemli V System dosya ve dizinleri içerir.
etc/init.d
Bu dizin bütün runlevellerindeki açılış scriptlerini içerir. Bunlar tipik olarak shell scriptleridirler ve temel standartlara uyarlar. Her script en az iki argümana sahiptir. Bunlar başla ve dur’dan oluşur ki bunlarla servisiniz başlatılıp durdurulur (örneğin Web Server). Buna ek olarak init scriptleri başka özellikleri de içinde barındırır. Bunlar, restart (servisi durdur ve çalıştır), status (servisin o anki durumunu geri döndürür), reload (servise konfigürasyon dosyalarından ayarların tekrar yüklenmesini söyler) ve force-reload (servisi ayarları yeniden yüklemesi için zorlar). Eğer scripti argümansız çalıştırırsak, genellikle kabulettiği argümanların listesini geri döndürecektir.
/etc/rc0.d – /etc/rc6.d
Bu dizin runlevellerine göre init scriptlerini içerir. Pratikte bunlar /etc/init.d’deki gerçek dosyalara sembolik olarak (symlink) bağlanmışlardır. Bu init scriptleri D,S,K gibi haflerle başlamış ve ardından bir sayı gelen isimlendirmeye sahiptir. init bir runlevel’e girdiğinde K ile başlayan bütün scriptleri sayısal sırasıyla çalıştırır ve dur argümanına geçer (bu sadece çağırılan init script önceki runlevel’e aitse geçerlidir). Daha sonra init script bütün S scriptlerini sırasıyla çalıştırır ve başla argümanına geçer. D ile başlayan bütün scriptler ihmal edilir. Bu size özel bir runlevelde bir init scriptini geçici bir süre için kapatabilmenize izin verir. Sadece symlinkini silerek de bunu yapabilirsiniz. S01foo ve S05bar adında iki scriptimiz olsun, init scriptimiz farklı bir runlevele girdiğinde önce S01foo start ardından S05bar start işlemlerini çalıştırır.
/etc/rcS.d
Bu dizinde açılış esnasında runleveli değişmeden önce çalışan bütün init scriptlerini bulabilirsiniz. Bu dizindeki scriptlerde değişiklikleri yaparken dikkatli olmalısınız çünkü bu tek kullanıcı moduna (kurtarma kipi) geçmenizi engelleyebilir.
/etc/rc.local
Bütün dağıtımlar rc.local kullanmaz ama geleneksel olarak bu kullanıcının değiştirebileceği bir shell scriptidir. Bu genellikle init işleminin sonunda çalıştırılır. Yeni bir init scripti oluşturmaya gerek kalmadan kendi kodlarnızı koyabilirsiniz.
V System init sistemini bir boot örneğiyle açıklayalım. İlk önce init çalışır ve /etc/inittab ‘ı öntanımlı runleveli belirlemek için okur, bizim örneğimizde bu runlevel 2. Ardından init /etc/rcS.d’ye gider ve S ile başlayan bütün scriptleri start argümanıyla çalıştırır. Daha sonra aynı işlemi /etc/rc2.d dizini için yapar. Son olarak init durdurulmuştur ancak runlevelin değişmesini bekler halde arkaplanda çalışmaya devam eder.
Bu yazının ardından devamı niteliğinde Upstart konusu üzerinde durulacaktır. Yazıdaki kodlar Ubuntu Server 11.10 Virtualbox üzerinde denenmiştir. Kaynak olarak http://www.amazon.com/Official-Ubuntu-Server-Book-Edition/dp/0137081332/ref=dp_ob_title_bk kitabı kullanılmıştır.
Upstart Bölümü geçikmedi
Yazının devamını aşağıdaki linkten okuyabilirsiniz:
http://www.cagdastopcu.com/upstart-ve-system-v-init-karsilastirmasi.html