Tek Başına (basit) Linux
Önceki X Terminal Sisteminin Yapılması Sonraki
Tek Başına (basit) Linux
Kullanacağımız çekirdek hazır. Artık ramdiskimizin içini doldurmaya başlayabiliriz. Önce bu bölümde en temel ve en basit bir konsol oturumu oluşturacağız. Bu sistem henüz sunucu makinaya bağlanabilen bir yapı içermeyecek, her türlü donanımla çalışabilen temel yapıyı oluşturup deneyeceğiz. Sonraki bölümde bunu çalıştıracağımız makinanın donanımına göre özelleştireceğiz ve sunucuya bağlanabilir hale getireceğiz ve tekrar deneyeceğiz. Son olarak da üzerine X ile ilgili dosyaları yerleştirip X terminalimizi oluşturacağız.
Sistemimiz bir pakete çok bağımlı, bu paket busybox kabuğunu içeriyor. busybox, bash gibi salt bir kabuk değil, içinde bize lazım olan hemen her sistem komutu var. Bu tür sistemler için özel olarak hazırlanmış bir paket. Önce onu indirip derleyeceğiz.
http://www.busybox.net/downloads adresinden busybox'ın son sürümünü indirin ve /usr/src dizinine taşıyın. Ben busybox-1.00-pre7 sürümü ile çalıştım. Bu belgeyi hazırlarken indirdiğim busybox-1.00-pre10 sürümünü derleyemedim. Komut geçmişi desteğini kaldırınca derleniyordu. Komut geçmişi olmadan da konsolda çalışmak işkence oluyor. Onun için size de busybox-1.00-pre7 sürümünü öneririm.
busybox-1.00-pre7 paketini önce açın; çekirdek için yaptığımız gibi. busybox-1.00-pre7 dizinine eklerde verdiğim yapılandırma dosyasını .config ismiyle kopyalayın. busybox'da tıpkı çekirdek gibi bir yapılandırma arayüzüne sahip. make menuconfig komutundan sonra make sonra da make install komutlarını verdiğinizde derlenmiş busybox/usr/src/busybox-1.00-pre7/_install dizinin altındaki dizinlerde bulacaksınız.
Bütün araçları tamamladığımıza göre /a3/ramdisk/initrd dizininin içini oluşturmaya başlayabiliriz. /a3/ramdisk/initrd dizine geçeceğiz ve dizinin içinde bazı alt dizinler oluşturacağız. Bu dizin ağacı ramdisk içindeki kök dizinimizin ağacı olacağından, bir kök dizin için gereken bütün dizinleri değil, sadece bize gerekli olan dizinleri oluşturacağız. Çünkü bizim yerimiz az ve kıymetli. Aşağıdaki satırları /a3/ramdisk dizinine kokyap ismiyle kaydedin:
ilk=`pwd`
cd initrd
kok=`pwd`
mkdir bin dev etc lib loopfs proc sysroot tmp usr var
ln -s bin sbin
mkdir etc/X11 etc/init.d etc/X11/xserver
mkdir lib/X11 lib/modules
cd lib/modules
mkdir 2.4.22-x drivers extensions fonts input linux
mkdir 2.4.22-x/kernel 2.4.22-x/kernel/drivers 2.4.22-x/kernel/drivers/net
cd $kok
cd lib/X11
mkdir app-defaults locale xkb
ln -s ../../etc/X11/xserver xserver
cd $kok
cd etc/X11
ln -s ../../lib/X11/xkb xkb
cd $kok
cd usr
ln -s .. X11R6
ln -s ../bin bin
ln -s ../bin sbin
ln -s ../lib lib
cd $kok
cd var
mkdir lib lock log run lib/dhcp lib/xkb lock/subsys
cd ../dev
ln -s /proc/self/fd fd
ln -s fd/0 stdin
ln -s fd/1 stdout
ln -s fd/2 stderr
mkfifo -m 600 initctl
mknod -m 666 tty c 5 0
mknod -m 600 console c 5 1
mknod -m 660 initrd b 1 250
mknod -m 640 ram0 b 1 0
mknod -m 640 ram1 b 1 1
mknod -m 640 mem c 1 1
mknod -m 640 kmem c 1 2
mknod -m 666 null c 1 3
mknod -m 644 random c 1 8
mknod -m 640 apm_bios c 10 134
mknod -m 640 rtc c 10 135
mknod -m 600 tty1 c 4 1
mknod -m 600 tty2 c 4 2
mknod -m 600 tty3 c 4 3
mknod -m 600 tty4 c 4 4
mknod -m 600 tty5 c 4 5
mknod -m 600 ttyS0 c 4 64
mknod -m 600 ttyS1 c 4 65
mknod -m 640 psaux c 10 1
mknod -m 644 urandom c 1 9
mknod -m 444 zero c 1 5
ln -s ttyS0 mouse
ln -s ram1 ram
ln -s ram0 ramdisk
ln -s console tty0
cd $ilk
kokyap betiğini,
# . ./kokyap
komutunu vererek çalıştırın. Betiğin yaptığı işlemleri initrd dizinine geçip görebilirsiniz. Betik tarafından oluşturulan dizinlerin hepsini biz kullanmayacağız, bazı dizinleri çalıştırdığımız uygulamalar kullanacak. Yani bazı dizinleri boş bırakacağız. kokyap betiğinin içindeki komutları komut satırından tek tek vererek de aynı işlemi kendiniz yapabilirsiniz. Betikte kullanılan komutların pek çoğunun bir türkçe kılavuz sayfası var: ln(1), mkdir(1), mkfifo, mknod. cd komutu ise, kabuğun yerleşik komutlarından biridir.
Şimdi sistem açılışı için gerekli dosyaları yerleştireceğiz. Bir Linux sisteminin açılışında ne gibi işlemler yürütüldüğünü initrd(4) kılavuz sayfasında açıklanmıştır. Ayrıca, init(8), inittab(5) kılavuz sayfalarını da okursanız yapacağımız işlemleri niçin yaptığımızı, neden bazı şeyleri orada yazılanlardan biraz farklı yaptığımızı daha kolay anlayabilirsiniz.
initrd(4) kılavuz sayfasında yazdığı gibi önce /linuxrc betiğini yazacağız. Aşağıdaki betiği /a3/ramdisk/initrd dizinine linuxrc ismiyle kaydedin:
#!/bin/nash

echo /proc dosya sistemi baglaniyor
mount -t proc /proc /proc
echo Blok aygitlari olusturuluyor
mkdevices /dev
echo Kok aygiti olusturuluyor
mkrootdev /dev/root
echo 0x0100 > /proc/sys/kernel/real-root-dev
echo "Init sureci basliyor"
rm -f /linuxrc
Bu dosyayı oluşturduktan sonra,
# chmod +x linuxrc
komutuyla betiğe çalıştırılabilirlik özelliği verin.
Bu betiği biraz inceleyelim. İlk satır, betiğin /bin dizininde bulunan nash isimli bir betik yorumlayıcısı tarafından yorumlanacağını söylüyor. Yani bu betik içinde yazılan komutları bu uygulama çalıştıracak. nash, sadece linuxrc betiklerini çalıştırmak için tasarlanmış, küçük bir betik yorumlayıcıdır. Bir kabuk değildir. Sisteminizde nash vardır. Komut satırına whereis nash yazarsanız, nash'ın sisteminizde nerede durduğunu öğrenebilirsiniz. Ben bu komutu verdiğimde:
# whereis nash
nash: /sbin/nash /usr/share/man/man8/nash.8 /usr/share/man/man8/nash.8.gz
şeklinde bir çıktı alıyorum. O halde yapacağımız işlem basit bir kopyalama işlemi:
# cp /sbin/nash /a3/ramdisk/initrd/bin/
İşimiz nash'ı kopyalamakla bitmiyor. nash'ın içerdiği yerleşik komutlar için nash'a birer sembolik bağ yerleştireceğiz:
# cd bin
# ln -s losetup nash
# ln -s mkdevices nash
# ln -s makerootdev nash 
# ln -s pivot_root nash
# ln -s showlabels nash
Böylece linuxrc betiğinin çalışması için gerek ve yeter şart sağlanmış oldu. Betik echo 0x0100 > /proc/sys/kernel/real-root-dev satırıyla çekirdeğe kök dosya sistemimizin ramdisk olduğunu söylüyor. Init süreci başladığında çekirdeğin kök dosya sistemi olarak nereyi kullanacağını belirtmiş olduk. linuxrc betiğinin tekrar tekrar çalıştırılmasını önlemek için son satırda betiği siliyoruz ve linuxrc betiğinin işi bitiyor, görevi init süreci devralıyor.
init bir uygulama ismi. Ama bizim sistemimizde henüz yok. Şimdi onu ve bir sistemde kullanılan bir çok komutu içeren busybox'ı sistemimize yerleştireceğiz. Busybox'ı bu bölümün başlangıcında indirmiş ve derlemiştik. /usr/src/busybox-1.00-pre7/_install/bin dizinindeki herşeyi /a3/ramdisk/initrd/bin dizinine kopyalayın. /usr/src/busybox-1.00-pre7/_install/ atındaki diğer dizinlerin içeriğini de /a3/ramdisk/initrd/bin dizinine kopyalayın. (Kopyalama için mc'den yararlanmıyorsanız, sembolik bağları kopyalarken cp komutunu -d seçeneği ile kullanmalısınız.) /usr/src/busybox-1.00-pre7/_install/ dizini altındaki linuxrc'yi biz kullanmayacağız. Biz onu zaten yazmıştık. /a3/ramdisk/initrd/bin dizinine girdiğinizde mc kullanıyorsanız, bazı sembolik bağ dosyalarının hedeflerini bulamadıklarını göreceksiniz. Onların hedeflerini bulmalarını sağlamalısınız. İmleci onlardan birinin üzerine getirip CTRL tuşu basılıyken X ve S tuşladığınızda açılan pencereye busybox yazmanız yeterlidir. Hepsi için bu işlemi yapın.
bin dizinindeki sembolik bağlar arasında init'in de bulunduğunu göreceksiniz. Ama sistemin açılması için init'in varlığı yeterli değil. init çalıştığında önce /etc/inittab dosyasına bakacak ve oradaki satırları yorumlarak sistemi kullanıcı ile etkileşimli çalışacak duruma getirecek. O halde, etc/inittab dosyasını hazırlamamız lazım. busybox ile gelen init'in çalışacağı inittab dosyasının içeriği, inittab(5) kılavuz sayfasında anlatılan içerikten farklı. Bu konuda daha ayrıntılı bilgiyi file:/usr/src/busybox-1.00-pre7/docs/BusyBox.html#item_init adresinde bulabilirsiniz. Kullanacağımız inittab dosyası:
::sysinit:/etc/init.d/baslat

tty1::askfirst:/bin/busybox sh
tty2::askfirst:/bin/busybox sh

::ctrlaltdel:/bin/reboot -d 0
::restart:/sbin/init
Burada ilk satırda, sistemi ilklendirecek betiğin yerini belirttim. init bu satırı ve orada belirtilen betiği icra ettikten sonra diğer satırlara geçecek. Sonraki iki satırda iki konsolumuz (tty1 ve tty2) olacağını belirtim. Bu konsolları etkinleştirmeden önce onay almasını istedim. Son iki satırda ise CTRL-ALT-DEL tuşlandığında ne işlem yapacağını ve yeniden başlatma durumunda ne yapacağını belirttim. Sistemi kapatmak için birşey belirtmek gerekmiyor. Konsolda komut olarak poweroff verildiğinde busybox sistemi sonlandırıyor. Normalde sistemi kapatması lazım ama bunun için ek modüller gerekiyor. Bu lükse ihtiyacınız varsa siz eklersiniz.
İki konsol belirttim. İlk konsolda açılış iletilerine bakmak ve bir takım komutlar orada çalıştırılabilsin istedim. İkinci konsolu daha sonra X'i çalıştırmak için kullanacağız. Şimdilik o da ilk konsol gibi bir konsol.
Şimdi inittab'ın ilk satırında belirtiğimiz betiği hazırlamalıyız. Betik:
#!/bin/sh
# Bu betik sistemi ilklendirir

PATH="/bin"

umask 022

# Biraz yer acalim
rmdir /lost+found

# Saatimiz dogru kalsin
hwclock -s

echo "lo arayuzu etkinlestiriliyor"
ip link set lo up
ip addr add 127.0.0.1 dev lo
ip route add 127.0.0.0/8 dev lo

exit 0
Çok basit bir betik. rmdir /lost+found satırında, ramdisk üzerinde dosya sistemini oluşturulurken /lost+found isminde bir dizin oluşur. Bu dizin bize lazım olmadığından yerimizi işgal etmesin diye siliyoruz. hwclock -s satırıyla çekirdeğin, sistem saatini donanım saatiyle eşzamanlamasını söylüyoruz. Böylece date komutu bize doğru zamanı gösterecek. Son olarak da sistemin yerel IP adresi ile ilgili yapılandırmayı gerçekleştiriyoruz.
Yalnız busybox'ın çalışması için bazı kütüphane dosyalarına ihtiyacı var. Bunların neler olduğunu öğrenmek için ldd komutunu kullanacağız:
# ldd /a3/ramdisk/initrd/bin/busybox
        libc.so.6 => /lib/i686/libc.so.6 (0x40030000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
Bu çıktıya göre libc.so.6 ve ld-linux.so.2 dosyalarını lib dizinimize yerleştirmemiz gerekli. Sistemin /lib dizine baktığımızda bu dosyaların sırasıyla libc-2.3.2.so ve ld-2.3.2.so dosyalarına sembolik bağ olduklarını görüyoruz. Yani 4 dosyayı da bizim lib dizinimize kopyalamamız lazım:
# cp -d /lib/libc.so.6 /a3/ramdisk/initrd/lib/
# cp /lib/libc-2.3.2.so /a3/ramdisk/initrd/lib/
# cp -d /lib/ld-linux.so.2 /a3/ramdisk/initrd/lib/
# cp /lib/ld-2.3.2.so /a3/ramdisk/initrd/lib/
Birinci ve üçüncü satırdaki -d seçeneğine dikkat edin. Dosya sistemimiz artık hazır, deneyebiliriz. /a3/ramdisk/initrdyap betiğini çalıştırıp /export/netlogon/autoboot/initrd.img dosyasını oluşturalım:
# /a3/ramdisk/initrdyap
/export/netlogon/autoboot dizininde bir önceki bölümde derlediğimiz çekirdeği yerleştirmiştik. Bu dizine Linux'u kurduğunuz CD'lerin ilkinde bulunan loadlin.exe dosyasını da kopyalayın. CD'yi CDROM sürücünüze yerleştirin ve mount /mnt/cdrom komutunu verin. CD'nin içeriğini /mnt/cdrom dizini altında bulacaksınız. mc ile CD'nin dizinlerinde loadlin.exe dosyasını bulun ve F5 ile /export/netlogon/autoboot dizine kopyalayın. /mnt/cdrom dizininde çıkın ve umount /mnt/cdrom komutunu verdikten sonra CD'yi yuvasından çıkarın.
Şimdi bu 3 dosyadan yemek yapacağız. /export/netlogon/autoboot dizininde linux.bat ismiyle bir dosya açın (touch linuxbat) ve içine aşağıdaki satırı yazın:
loadlin autoboot\vmlinuz initrd=autoboot\initrd.img ramdisk_size=12000
Bir üst dizine geçin ve linuxyukle.bat isminde bir dosya açın ve içine aşağıdakileri yazın.
net use z: \\NILGUN\netlogon /y
copy z:\autoboot\vmlinuz c:\autoboot
copy z:\autoboot\initrd.img c:\autoboot
copy z:\autoboot\loadlin.exe c:\
copy z:\autoboot\linux.bat c:\
İlk satırdaki \\NILGUN\ yerine makinanıza verdiğini ismi yazmalısınız. Benim için bu isim nilgun.buguner.home olduğundan NILGUN yazdım. Ayrıca, bu dosyayı windows altında çalıştıracağımız için dosyayı DOS dosya biçimine dönüştürmemiz ve dosyanın çalıştırılabilir bir dosya olmasını sağlamamız lazım. Bunun için aşağıdaki komutları çalıştırın:
# unix2dos linuxyukle.bat
# chmod +x linuxyukle.bat
Linux'da her satır LF (10 numaralı karakter)ile biterken, DOS'da CRLF (13 ve 10 numaralı karakterler) ile biter. Bu komut satır sonlarındaki LF'leri CRLF ile değiştirir.
Sunucu makina üzerindeki işimiz bitti. İstemci makinaya geçin ve Ağ Komşularında netlogon dizinine girin ve linuxyukle.bat dosyasını çalıştırın. Bu betiği çalıştırdığınızda \\NILGUN\netlogon'un karşılığı olarak Z: diski oluşacak ve Z: diskindeki dosyalar C: diskine kopyalanacak.
Şimdi windows masaüstünde bir kısayol oluşturacağız. C:\linux.bat dosyasının üzerindeyken farenin sağtuşu ile açılan menüden kısayol oluştur'u seçin ve oluşan kısayolu masaüstüne taşıyıp ismini LINUX OL olarak değiştirin. Simgenin üzerine sağ tıklayıp Özellikler'e girin. Program sekmesinde Gelişmiş düğmesine tıklayın. 2. ve 3. seçenekleri seçili hale getirin. MS-DOS kipi başlıklı bölümde, Mevcut MD-DOS ayarlarını kullan seçeneğini seçil duruma, MS-DOS kipine girerken uyar seçeneğini ise seçilmemiş durma getirin ve Tamam'a tıklayıp çıkın. Şimdi sıra config.sys dosyasında, C:\config.sys dosyasında aşağıdakilerin bulunmasını sağlayın (bu dosyalar sizin sisteminizde farklı yerdeyse ona göre düzeltin):
DEVICE=C:\WINDOWS\HIMEM.SYS
DEVICE=C:\WINDOWS\EMM386.EXE
DOS=HIGH,UMB
Bundan sonra windows'u yeniden başlatın ve windows açılınca LINUX OL simgesine tıklayıp Linux sistemini başlatın. Ekran kararacak, önce çekirdek, ardından initrd.img yüklenecek. Çekirdek çalışacak, init'i başlatacak ve en son Enter'a basıp konsola düşeceksiniz. ifconfig, ls, date, df gibi bazı komutları deneyin. Bu konsolda yapabileceklerimiz bu gibi komut satırından bir takım komutlar girmekle sınırlı. Sistemi kapatmak için halt veya poweroff komutlarını girebileceğiniz gibi, makinayı doğrudan da kapatabilirsiniz. Çünkü sistemin çalışması için herhangi bir sabit diski bağlamadık. Kaybedilecek ya da bozulacak bir bilgi yok.
Bundan sonraki adım, iki makinayı birbirine bağlamak.
Önceki Üst Ana Başlık Sonraki
Çekirdeğin derlenmesi Başlangıç Ağa Bağlanan Linux Terminali
Bir Linux Kitaplığı Sayfası