Yapay Kalıp Fantazisi

Yazan: kelalaka | Tarih 15 Mayıs 2009 | Yorum  Yorum Yok
BerbatKötüOrtaGüzelHarika 3 kez puan verildi, Ortalama: 5.00 (5 üzerinden)
Loading ... Loading ...

Bilgisayarı kurcalamayı sevenler için GNU/ ortamı bulunmaz bir nimet. Bu ortamda, kurcalamalarımız için gereken her türlü malzemeyi rahatlıkla bulmak mümkün. Kurcalama eylemleri, dışarıdan bakan için çoğunlukla anlamsız görünse de GNU/ ortamını daha iyi tanımamız ve gerektiğinde etkin bir şekilde kullanabilmemiz için gereken tecrübe ve birikimi bize sağlıyor. Bu giriş cümlesi ile "Yapacak doğru düzgün işin yok muydu? Bu yazıda anlattığın olay, ne halta yarayacak ki?" şeklindeki eleştirilerin baştan önlemini aldıktan sonra, son bir haftamı neyle ziyan ettiğimi anlatmaya başlayayım.

GNU/ yüklü bir sabit diskimiz olduğunu varsayalım. Bu sabit diskin tamamının içeriğini, kalıp () şeklinde bir dosyaya aktarmamız mümkün. Bu kalıp dosyası içinde sabit disk bölümleme bilgileri, işletim sistemi yükleyici (GRUB), çekirdeği, yüklü olan yazılımlar vs bir şekilde yer almakta. Benim yapmak istediğim ise bu işlemin tam tersi... Yani boş bir dosyayı alacağım, içine gerekenleri elle tıkıştıracağım ve her hangi bir kurulum materyali kullanmadan hazırladığım bu kalıbı bir sabit diske yazdığımda, disk boot edecek.

Yapay kalıbımızın boot etmesi, ilk aşama için yeterli olacağı için bir şekilde işletim sistemi yükleyiciyi (GRUB), çekirdeği ve kabuğu (shell) kalıba yüklemek yeterli olacak. Başlamadan önce bütün bunları, favori dağıtımım Debian ile yaptığımı hatırlatayım. Aynı işi başka dağıtımlarla yapmak isteyenlerin, bazı işlemleri farklı şekilde yapmaları gerekecek.

Yapay Kalıp Oluşturuluyor
Öncelikle içi boş bir dosya oluşturacağız. Bu dosya, yapay kalıbımız olacak. Bunu, yeni satın alınmış bir sabit disk gibi düşünebilirsiniz. Sonra da bu kalıp içine bir bölüm (partition) koyacağız ve daha sonra da bölümümüzü biçimlendirecegiz (format).

BASH:
  1. dd if=/dev/zero of=disk.img bs=1M count=300
  2. su
  3. losetup /dev/loop0 disk.img
  4. fdisk /dev/loop0
  5.    p
  6.    o
  7.    n -> p -> 1 -> <enter> -> <enter>
  8.    a -> 1
  9.    p
  10.    w
  11. losetup -d /dev/loop0

dd komutu 300 MB boyutunda, içi sıfırlarla dolu bir dosya oluşturuyor. Yani yeni bir sabitdisk satın almış oluyoruz. losetup komutu ile bunu aygıt (device) gibi gösterip fdisk komutu ile bu sanal diskte bir bölüm oluşturuyoruz.

Şimdi sıra geldi oluşturmuş olduğumuz bölümü biçimlendirmeye... Biçimlendirilecek kısım, yapay kalıbımızın tamamı değil. Sadece kalıp içinde oluşturmuş olduğumuz yapay bölümü biçimlendireceğiz. fdisk komutunu kullanırken dikkat ettiyseniz kalıbımızın her track'ında 63 sektör yer almakta. Birinci bölüm, ilk tracktan sonra başlayacağı için ve her sektör 512 byte olduğu için 32256. byte'tan (63 x 512) sonra birinci bölüm başlamakta. Öyleyse bu yapay kalıp dosyasının 32256. byte'tan sonraki kısmını bir aygıt olarak tanıtırsak bu aslında bizim 1. bölümümüz olacak (yani /dev/hda1 gibi). Bu bölümü de, her hangi bir disk bölümünü biçimlendirir gibi biçimlendirebileceğiz.

BASH:
  1. losetup -o 32256 /dev/loop0 disk.img
  2. mkfs.ext3 /dev/loop0

Başlıca Klasörlerin Oluşturulması
Her GNU/ sistemde bulunması gereken bazı klasörler var. Bu klasörleri, biçimlendirmiş olduğumuz bölüm içinde oluşturacağız ama klasör oluşturmak gibi işlemleri yapabilmemiz için önce bu bölümü, gerçek bir disk bölümü gibi dosya sistemimize mount etmemiz gerekiyor.

BASH:
  1. mkdir -pv /mnt/disk
  2. mount -t ext3 /dev/loop0 /mnt/disk/
  3. mkdir -pv /mnt/disk/{dev,proc,sys}
  4. mknod -m 600 /mnt/disk/dev/console c 5 1
  5. mknod -m 666 /mnt/disk/dev/null c 1 3
  6. mkdir -pv /mnt/disk/{bin,boot,etc,home,lib,media,mnt,opt,root,sbin,srv,tmp,usr,var}
  7. mkdir -pv /mnt/disk/etc/opt
  8. mkdir -pv /mnt/disk/media/{floppy,cdrom}
  9. mkdir -pv /mnt/disk/usr/{bin,include,lib,lib64,local,sbin,share,src}
  10. mkdir -pv /mnt/disk/usr/local/{bin,etc,include,lib,sbin,share,src}
  11. mkdir -pv /mnt/disk/usr/local/share/man
  12. mkdir -pv /mnt/disk/usr/share/{doc,info,locale,man,misc,terminfo,zoneinfo}
  13. mkdir -pv /mnt/disk/usr/share/man/man{1..8}
  14. mkdir -pv /mnt/disk/var/{cache,lib,local,lock,log,mail,opt,run,spool,tmp}
  15. mkdir -pv /mnt/disk/var/lib/misc
  16. ln -sv share/man /mnt/disk/usr/local/
  17. chmod 0750 /mnt/disk/root
  18. chmod 1777 /mnt/disk/tmp /mnt/disk/var/tmp
  19. ls -alh /mnt/disk/

GRUB Önyükleyicinin Yüklenmesi
Yapay kalıbımızın boot edebilmesi için ona bir de işletim sistemi yükleyici yüklemek gerekiyor. GRUB ayarlarını yaparken benim kullanmış olduğum ve Debian Lenny'nin şu anki default çekirdeği olan 2.6.26-2-686 çekirdeğe göre işlemlerimi yapacağım.

BASH:
  1. mkdir -p /mnt/disk/boot/grub
  2. cp /boot/grub/stage1 /boot/grub/e2fs_stage1_5 /boot/grub/stage2 /mnt/disk/boot/grub/
  3. touch /mnt/disk/boot/grub/menu.lst

/mnt/disk/boot/grub/menu.lst dosyasının içeriğini bir editör ile şu hale getiriyoruz:

BASH:
  1. default         0
  2. timeout         5
  3. color cyan/blue white/blue
  4.  
  5. title           Debian GNU/, kernel 2.6.26-2-686
  6. root            (hd0,0)
  7. kernel          /boot/vmlinuz-2.6.26-2-686 root=/dev/hda1 ro init=/bin/bash
  8. initrd          /boot/initrd.img-2.6.26-2-686

Son olarak da GRUB'ı yapay kalıbımızın MBR bölümüne yüklüyoruz.

BASH:
  1. sync
  2. umount /dev/loop0
  3. losetup -d /dev/loop0
  4.  
  5. grub
  6.     device (hd0) disk.img
  7.     root (hd0,0)
  8.     setup (hd0)
  9.     quit

Paketlerin Kurulması
Bu bölümde, yapay diskimize paketleri yükleyeceğiz. İşlemleri yaparken Debian'ın paket yönetim sistemi kullanılacağı için aynı komutlar, Debian tabanlı olmayan dağıtımlarda çalışmayacaktır. O nedenle başka dağıtım kullananların, buradaki işlemlerin dengi neyse onları yapmaları gerekmektedir.

Öncelikle paket depomuzu update edeceğiz ve sonra yükleyeceğimiz paketleri, yerel depomuza alacağız. Paket işlemlerinde ben aptitude komutunu tercih ediyorum ama isteyen apt-get veya synaptic ile de aynı işlemleri yapabilir.

BASH:
  1. aptitude update
  2. aptitude autoclean
  3. aptitude reinstall -d -y --2.6.26-2-686 libc6 libgcc1 gcc-4.3-base bash busybox libncurses5
  4.  
  5. losetup -o 32256 /dev/loop0 disk.img
  6. mount -t ext3 /dev/loop0 /mnt/disk/
  7. dpkg -x `ls /var/cache/apt/archives/--2.6.26-2-686_*.deb` /mnt/disk
  8. cp /boot/initrd.img-2.6.26-2-686 /mnt/disk/boot/
  9. dpkg -x `ls /var/cache/apt/archives/libc6_*.deb` /mnt/disk
  10. dpkg -x `ls /var/cache/apt/archives/libgcc1_*.deb` /mnt/disk
  11. dpkg -x `ls /var/cache/apt/archives/gcc-4.3-base_*.deb` /mnt/disk
  12. dpkg -x `ls /var/cache/apt/archives/libncurses5_*.deb` /mnt/disk
  13. dpkg -x `ls /var/cache/apt/archives/bash_*.deb` /mnt/disk
  14. dpkg -x `ls /var/cache/apt/archives/busybox_*.deb` /mnt/disk
  15.  
  16. sync
  17. umount /dev/loop0
  18. losetup -d /dev/loop0

busybox, az yer kapladığı için özellikle gömülü sistemlerde kullanılan ve en çok kullanılan komutların, az yer kaplayacak şekilde yeniden yazılmış hallerini içeren bir paket... Hem busybox'ın hem de kabuk olarak seçtiğimiz bash'ın statik sürümleri de paket deposunda mevcut. Statik sürümlerde, kullanılan kütüphaneler, yazılım içine gömüldüğü için ayrıca kütüphane paketlerini yüklemek gerekmiyor ama ileride yükleyebileceğimiz bazı paketlerin kütüphanelere ihtiyaç duyma ihtimali nedeniyle şimdiden kütüphaneleri de yükledik. Eee madem kütüphaneleri yükledik, öyleyse busybox ve bash'ın da kütüphaneleri kullanan sürümlerini yükleyelim.

Yukarıda dikkatinizi çekmiş olabilecek bir nokta da initrd.img dosyasının cp ile mevcut sistemden yükleniyor olması. Çekirdek paketinde bu dosya yer almıyor, yükleme esnasında oluşturuluyor ama biz yüklemeyi canlı bir sisteme yapmadığımız için mevcut sistem için oluşturulmuş olan initrd.img dosyasını kopyalayarak işimizi hallediyoruz.

Sıra Geldi Boot Etmeye
Artık elimizde boot edebilecek bir kalıp bulunmakta. Bu kalıbı bir sabit diske yazarsak, o disk boot edecek ve kabuk açılacak. Elimde şu an için boşta bir disk olmadığından ben bunu, bir diske yazmak yerine, qemu ile disk gibi kullanarak test ettim. Bu testi yapabilmek için eğer yoksa qemu adlı sanallaştırma yazılımını kurmanız veya gerçek disk kalıplarını kullanabilen herhangi bir sanallaştırma yazılımını kullanmanız gerekiyor.

BASH:
  1. aptitude install qemu
  2. exit

Bu noktadan sonra root olarak devam etmeye gerek yok. Normal kullanıcı olarak kalıbımız ile boot ediyoruz:

BASH:
  1. qemu disk.img

Her şey doğru giderse (ki bende gitti) sisteminiz boot edecek ve
I have no name!@(none):/# diyen kabuk ekranını göreceksiniz. 2 kere Tab tuşuna basarsanız, kullanabileceğiniz komutları görebilirsiniz. Kullanabileceğiniz komutların bir çoğu busybox içinde... busybox komutlarını görmek için busybox yazıp enter tuşuna basın. Örneğin busybox ls komutu, bildiğimiz ls komutu ile aynı işi yapıyor.

Bugünlük de bu kadar

Bu yazı http://emrahcom.blogspot.com adresinde yayınlanmış olup; yazarın izni alınarak perfectgate.net'te yayına koyulmuştur.

Çok sevdim, başkalarıyla paylaşayım:
  • Google Bookmarks
  • Facebook
  • MySpace
  • TwitThis
  • del.icio.us
  • Digg
  • Live
  • YahooMyWeb
  • Technorati
  • StumbleUpon

Benzer Yazılar


Yorum Yap


(gerekli)

(gerekli,yayınlanmaz)




XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>