Linux çekirdeği bir önyükleyici programı tarafından açılış esnasında belleğe yüklenip çalışmaya
başlar. Çekirdek donanımları tarar, sisteme yerleşir ve tüm yapması gereken işlemleri bitirdiğinde
artık sistemi bize devretmek ister. İşte bu noktada çekirdeğin yaptığı iş /sbin/init
programını çalıştırmaktır.
Çekirdek tarafından ilk olarak çalıştırılan init programının bu nedenle
süreç numarası (PID) daima 1'dir. Geri kalan tüm süreçler için init
ana süreç (parent) konumundadır.
Peki init neler yapar ve biz nerede devreye gireceğiz?
init programı, çalıştığında öncelikle /etc/inittab
ayar dosyasını okur. Buradan aldığı verilerle sisteminhangi çalışma seviyesinde (runlevel) açılacağına
karar verir ve ilgili programı çalıştırır. Ayrıca sanal konsollardan sisteme girişleri sağlayabilmek
için getty programını bu konsollarla ilişkilendirir.
init ile ilgili dikkat etmemiz gereken nokta, busyBox
içerisinden çıkan yeniden yazılmış init sürümünün çalışma seviyelerini
(runlevels) desteklemediğidir. Bu nedenle normal Linux bilgisayarınızdaki /etc/inittab
dosyasını örnek olarak kullanamazsınız. Bunun yerine busyBox
içersindeki init'in kullandığı dosya biçimini kullanmalısınız.
 | Not |
|---|
Çoğu durumda gerekli olmamakla birlikte herhangi bir nedenden ötürü çalışma seviyelerine ihtiyaç duyan
bir sistem geliştiriyorsanız busyBox ile gelen init'i
değil, sysvinit'i
kullanmalısınız.
|
 | Not |
|---|
Eğer bir inittab dosyası ayarlamaz iseniz busyBox
aşağıdaki gibi bir inittab içeriğini girmiş olduğunuzu varsayarak, bu içeriğe
göre çalışır:
::sysinit:/etc/init.d/rcS
::askfirst:/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/sbin/swapoff -a
::shutdown:/bin/umount -a -r
::restart:/sbin/init
Ayrıca /dev/console aygıtının erişilebilir olduğunu görürse aşağıdaki satırları
da ekleyecektir:
tty2::askfirst:/bin/sh
tty3::askfirst:/bin/sh
tty4::askfirst:/bin/sh
|
Şimdi örnek bir inittab dosyası hazırlayalım. İlk iki konsoldan doğrudan
sisteme giriş yapılabilsin, üçüncü konsoldan ise /etc/passwd dosyasından
kimlik doğrulama yapılarak sisteme girilebilsin. Bunun için aşağıdaki gibi bir
inittab dosyasını vi /hedef/etc/inittab komutu ile
oluşturalım:
- Örnek 4.1. /etc/inittab içeriği
::sysinit:/etc/init.d/rcS
::askfirst:/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::restart:/sbin/init
#tty1::askfirst:/bin/sh
tty2::askfirst:/bin/sh
tty3::respawn:/sbin/getty 38400 tty3
Dosyayı bu şekilde oluşturup kaydettikten sonra şimdi dosyadaki satırları açıklayalım. İlk satırda
init programının sistemin açılışı işlemini devredeceği program
belirtilmektedir. İşte burası bizim sistem açılışında doğrudan müdahale etmemiz gereken yerdir.
Örneğimizde bu değer /etc/init.d/rcS'dir. init kendi
işini bitirince bu programı çalıştıracaktır. Bu programı birazdan hazırlayacağız.
İkinci satırda askfirst özel belirteci /bin/sh ile
ilişkilendirilmiştir. askfirst ile ilişkilendirilmiş bir sanal konsola geçildiğinde
<ENTER> tuşuna basmak suretiyle kabuğa düşülür (/bin/sh). Birinci
konsol tty1 için askfirst elemanı öntanımlı olarak
ayarlandığı için dosyanın 7. satırındaki ayar, önüne # getirilerek iptal
edilmiştir. Etkinleştirseniz de bir problem olmaz, sadece birinci konsolda 2 defa giriş mesajını
alırsınız:
Please press Enter to activate this console.
Please press Enter to activate this console.
3, 4 ve 5. satırda yapılan işlemler isimlerinden de anlaşılacağı üzere sistemdeki belirli olaylar
karşısında çalıştırılacak olan uygulamaların seçilmesini sağlamaktadır. 8. satırda 2. sanal konsol da
askfirst ile ilişkilendirilmekte, 9. satırda ise 3. sanal konsol
getty programıyla ilişkilendirilmekte ve respawn
yapılarak süreç öldüğü zaman getty'nin yeniden çalıştırılması gerektiği
belirtilmektedir.
Şimdi /etc/init.d/rcS dosyamızı oluşturalım. Basit bir kabuk programı ile açılışta
yapılmasını istediğimiz işlemleri burada gerçekleştireceğiz. Öncelikle sistemde init.d
dizinini oluşturalım.
# mkdir /hedef/etc/init.d
Ardından vi /hedef/etc/init.d/rcS komutu ile dosyamızı yazmaya başlayalım.
Bu dosyada neler yapmamız gerekiyor? rcS içerisinde teorik olarak sistemin
açılırken yapmasını istediğimiz her türlü işlemi kendi keyfimize göre yaptırabiliriz (Linux'te
bir işi yapmanın her zaman birden fazla yolu olduğuna göre keyif burada doğru bir tanımlama :).
Ancak bu keyfi işlem adımlarının yanında bir de bazı özel durumlar haricinde yapmamız gereken bir işlem
var: kök dosya sistemini oku-yaz kipinde yazılabilir olarak sisteme bağlamak. Linux çekirdeği sistemi
açarken ve init programını çalıştırdığında kök dosya sistemi salt-okonur
olarak sisteme bağlı durumdadır (Elbette bunu da değiştirmenin yolları var ille de ben bildiğimi
yaparım diyorsanız). Bu yüzden rcS içerisinde kök dosya sistemi oku-yaz kipine
geçirilmelidir. Ayrıca /proc sanal dosya sistemi de burada sisteme bağlanmalıdır.
Bu işlemleri yapan dosya içeriği aşağıdaki gibi olup şu aşamada sistemin açılabilmesi için bize
yeterlidir. İleride açılışta yapılacak yeni işlemler eklendiğinde (ağ ayarlarının yapılması gibi)
bu dosyanın içeriğinde değişiklikler yapacağız.
- Örnek 4.2. /etc/init.d/rcS
-
#!/bin/sh
## Sistemi read-write moduna geçirelim
mount -n -o remount,rw /
## Proc'u bağlayalım
mount /proc
Bu dosya mutlaka çalıştırılabilir olmalıdır, chmod 755 /hedef/etc/init.d/rcS
komutuyla dosyaya çalıştırma hakları verilmelidir.
rcS içerisinde mount komutunu kullanma şeklimize
bakacak olursanız dosya sistemi türü, aygıt ismi gibi ayrıntıların verilmediğini görmektesiniz. Bu da
doğru ayarlanmış bir /etc/fstab dosyası sayesinde olabilmektedir. Şimdi bu dosyayı
da gene vi /hedef/etc/fstab komutu ile aşağıdaki gibi oluşturalım:
- Örnek 4.3. /etc/fstab
# Device Point Type Options Dump Pass
/dev/hda1 / minix defaults,rw 1 0
proc /proc proc defaults 0 0
Artık rcS dosyamız çalışmaya hazır. Şimdi tek yapmamız gereken önyükleyici
programımızı ayarlamak ve sistemi yeniden başlatmak olacak.