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-okunur 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.