15 Kasım 2009

Pardus 64bit : Temel Sistemi Oluşturma

Artık temel sistemi oluşturmak için çalışıyoruz. Buraya gelmeden önce, hazırladığımız geçici sistemi 64bit debian üzerine taşıyarak, orada bu geçici sisteme chroot yapmıştık. Bundan sonra da bu 64bit chroot ortamında, temel bir sistemin ihtiyaç duyacağı uygulamaları (tabi ki Pardus sürümleri ile uyumlu olacak şekilde) 64bit derlediğimiz araçları kullanarak, (kısmen Pardus derleme parametrelerine bağımlı kalarak) 64bit derleyeceğiz. Chroot yaptıktan sonra, geçici sistem üzerinde FSH'ye (File System Hierarchy) bağlı kalarak gerekli dosya yapısını oluşturduk. Daha sonra da bazı uygulamaların ihtiyaç duyduğu sembolik linkleri oluşturduk. Şu anda bu sembolik linklerin bir kısmı /tools dizini altını gösteriyor. Bu sembolik linkler sistem üzerinde paketler tekrar tekrar derlendikçe silinecek, yerini kararlı sistemin kullandığı, olması gerektiği gibi olan linkler alacak (/tools dizini sistemden silinecek).

Şu anda sistemdeki tek kullanıcı olan root'un başarılı bir şekilde login işlemini gerçekleştirebilmesi için /etc/passwd ve /etc/group dosyaları oluşturuldu. Ardından da yeni oluşturulan dosya yapısı üzerinde ekstra kernel dosya sistemleri (tmpfs, devpts) bağlandı. Bu aşamadan sonra temel sistemin oluşturulmasına geçmeden önce test takımı araçları yüklendi. Bu sayede sisteme kuracağımız araçların kurulumunu test edebilecek durumda olacağız. Bu amaçla da chroot yaptığımız sistem üzerine sırasıyla TCL, Expect, DejaGNU paketlerini kurduk. Test araçlarını başarılı bir şekilde kurduktan sonra temel sistemi kurma aşamasına gelmiştik. Burada ilk önce Perl paketinin geçici bir kurulumunu gerçekleştiriyoruz. Ardından da Linux-headers ve Man Pages'ı da sorunsuz bir şekilde kurup Glibc'ye geçiyoruz. Glibc'nin kurulumu esnasında birkaç hata ile başetmek durumunda kaldık. Glibc ile ilgili ilk hatayı yapılandırma betiğini çalıştırdığımızda aldık:

/tools/lib/gcc/x86_64-unknown-linux-gnu/4.3.3/../../../../x86_64-unknown-linux-gnu/bin/ld:

/source/glibc-build/elf/librtld.os: relocation R_X86_64_PC32 against undefined hidden symbol`_begin' can not be used when making a shared object

Bu hatayı, Glibc'nin build dizini içerisindeki libc/elf/Makefile dosyasının şu satırlarını değiştirerek aştık :

— libc/elf/Makefile 2008/10/31 20:35:11 1.330

+++ libc/elf/Makefile 2009/01/31 00:20:55 1.331

- -e ’s/\. = 0 + SIZEOF_HEADERS;/& _begin = . - SIZEOF_HEADERS;/’ \

+ -e ’s/\. = .* + SIZEOF_HEADERS;/& _begin = . - SIZEOF_HEADERS;/’ \

Bunun ardında make hatasız çalıştı; ancak make install dediğimiz zaman şu hata ile karşılaşıyoruz :

[some lines stripped]

Offending line of ldd output: libgcc_s.so.1 => /tools/lib/libgcc_s.so.1

[some lines stripped]

Bu hatanın çözümü için sembolik linkleri tekrar oluştursak da, Glibc libgcc_s düzgün bir şekilde kurulamadığından şikayet ederek hata veriyordu. Bu hata libgcc_s.so.1 için birincil kütüphane olarak link oluşturulabilmesi için sadece /lib ya da /usr/lib altını geçerli kabul ettiğinden (şu anda /tools altına link verilmiş durumda) ve de binutils ve gcc kurulumlarında bu linkleme işlemlerinden kurtulacağımız için ilerlemeye devam ettik.

Glibc'nin kurulumu ardından GCC spec dosyalarını, yeni dinamik bağlayıcıyı gösterecek şekilde ayarlıyoruz. Bunun ardından da GMP, MPFR ve ZLib kurulumunu başarılı bir şekilde gerçekleştiriyoruz. Sıra Binutils kurulumuna geldiğinde daha ilk satırda PTY'lerin (pseudo terminals) doğru bir şekilde çalışıp çalışmadığı kontrolü expect -c "spawn ls" komutuyla yapılıyordu; ancak şu hata ile karşılaştık :

The system has no more ptys.Ask your system administrator to create more.

Daha sonra bu hatayı düzeltmek için araştırma yaptığımızda şuraya ulaşıyoruz :

http://www.linuxfromscratch.org//lfs/faq.html#no-ptys

Buradan yola çıkarak, testler için gerekli olan, daha fazla sayıda terminal elde etmek için üzerinde chroot yaptığımız debian çekirdeğin yeniden yapılandırılması gerekiyordu. Bu yüzden üzerinde çalıştığımız, host sistem görevini üstlenen debian-5 lenny üzerinde çekirdek kaynak kodu indirip, config dosyasında şu değerleri ayarladıktan sonra tekrar yapılandırıp, derliyoruz :

CONFIG_UNIX98_PTYS=y

CONFIG_DEVPTS_FS=y

Bu derleme işleminde oluşan çekirdeği kullanarak boot ettiğimiz debian üzerinde, temel sisteme tekrar chroot yaparak expect -c "spawn ls" komutunu verdiğimizde aynı hatayı almaya devam ediyorduk. Bu durumda derleme işleminin başarısız olduğunu düşünüp, tekrar derleme yapıp aynı komutları çalıştırdığımızda yine hata alınca, bu komutları direkt debian üzerinde çalıştırmayı denedik ve hatasız çalıştı. Çekirdeğin derlenmesi ile ilgili bir problem olmadığını gösteren bu durum, bizi chroot yaptığımızda kernel dosya sistemlerinin bağlanması sırasında bir hata olabileceği ihtimaline yönlendirdi. Sonuçta da kernel (sanal) dosya sistemleri chroot yapmadan önce olması gerektiği gibi bağlanmıyordu.

mount -f -vt devpts -o gid=4,mode=620 devpts ${CLFS}/dev/pts komutunun "-f" parametresi ile "fake" mount yapılıyordu, Bu da /dev/pts nin chroot ortamı üzerinde gerçekten mount olmamasına sebep olup, chroot içersinde de çalıştırdığımız komutun no more ptys hatası ile sonuçlanıyordu. Artık çekirdeği tekrar derlemeye gerek olmadan kernel dosya sistemlerini (/dev/pts ile tmpfs) bağladıktan sonra geçici sisteme chroot yapıp, Binutils kurulumuna devam ettik. Ardından da [1] de listelenen geri kalan paketleri sırasıyla chroot yaptığımız temel sistem üzerinde kurduk.

Temel sistemin kurulumu sona erdikten sonra artık genel Linux kurulumları ile ilgili kısmın da sonuna gelmiştik. Bundan sonra artık daha Pardus ağırlıklı bir yol izleyeceğiz. Öncelikle COMAR ve PISI'nin bu 64bit temel sistem üzerinde ayağa kaldırılması için çalışacağız. Bunun için de PISI ve COMAR'ın bağımlılıklarını çıkarıp, bunları chroot yaptığımız temel sistem üzerinde 64bit derlemek için çalışmalara devam ediyoruz. Bu amaçla önce bir bağımlılık ağacı oluşturduk. Hemen ardından bu veriler doğrultusunda toolchain olarak adlandırdığımız kernel-headers, glibc, binutils ve gcc'yi (ilave olarak make'i) chroot yaptığımız temel sistem üzerinde, pspec.xml ile belirtilmiş yamaları uygulayıp, actions.py'de yazan direktiflerle derleyerek (tabi 64bit için gerekli parametreleri uygulayarak) sisteme tekrar kurduk. Burada da amacımız bu temel araçların Pardus üzerinde çalıştığı şekilde oluşturulması ve bağımlılıkların minimuma indirilmesiydi. Bu işlemleri tüm araçların yeni derlenmiş halleri ile birbirini derleyip, tüm bağımlılıklardan kurtuluncaya kadar devam edeceğiz.

[1]http://tr.pardus-wiki.org/X86_64-64_Mimarisine_Port_Edilmesi#K.C3.B6k_Dosya_Sisteminin_Haz.C4.B1rlanmas.C4.B1

0 yorum:

Yorum Gönder