Yazı Hakkında

18 Mart 2001

Bu yazı FreeBSD'de "make world"ün nasıl yapılacağını anlatmaktadır.OpenBSD için simdilik "make world"ün nasıl ypılacağını anlatmıyacağım.Make world Linux'teki kernel derlemeye benzer.Fakat bilindiği üzere *BSD (BSDi değil)ler Linux gibi sadece bir kerneldan ibaret değildir.*BSd'leri geliştiren şahıslar core sistem olarak kernel ve sistem için gerekli diğer yazılımları isletim sistemine dahil etmişlerdir.Örnek vermek gerekirse FreeBSD core olarak sendmail'i içeririr.Bunun yanında /bin ve /sbin dizini altındakilerde FreeBSD core işlerim sistemi ile beraber gelir.Düşünün sisteminiz çok eskidi.FreeBSD 4.0'a sahipsiniz ama serverınızın kararlığına güvenmiyorsunuz.İşte bu durumda Linux'teki gibi sadece kernel'ı update etmek yerine FreeBSD 'nin source tree'sini kendi sisteminize dahil indirmeniz gerekmektedir.

Not: Bu yazının her hakkı EnderUnix yazılım geliştirme grubuna aittir.Yazar ( Ömer Faruk Şen) bu dökumanın sisteminize vereceği hiçbir zararı kabul etmez.Yazı yazılırken FreeBSD'nin handbook'undan yararlanılmıştır.Yazar kendisi "make world" yapmıştır ve karşılaştığı özel sorunları burada zikredecektir.Bu dökumanın ana adresi http://www.EnderUnix.org adresidir.Yazıda sisteminizin bu tarih itibarı ile (18.03.2001 ) olan 4,3 Beta olan sürümünün kurulumu anlatılacaktır.

NOT2:Aşagıdaki işlemlere başlamadan önce freebsd-stable@freebsd.org adresine üye olmanızı şiddetle tavsiye ederim.Handbook makeworld.html de bulunan ifadeyi aynen kopyalıyorum

Subscribe to the right mailing listThe -STABLE and -CURRENT FreeBSD code branches are, by their nature, in development. People that contribute to FreeBSD are human, and mistakes occasionally happen.

Sometimes these mistakes can be quite harmless, just causing your system to print a new diagnostic warning. Or the change may be catastrophic, and render your system unbootable or destroy your filesystems (or worse).

If problems like these occur, a ``heads up'' is posted to the appropriate mailing list, explaining the nature of the problem and which systems it affects. And an ``all clear'' announcement is posted when the problem has been solved.

If you try and track -STABLE or -CURRENT and do not read the or mailing lists then you are asking for trouble.

Make World'ün Yapılması
Aslında FreeBSD'nin Linux'e göre birçok üstünlüğü var.Nitekim make world!te bunlardan biri.Make World sayesinde sisteminize birkere herhagi bir FreeBSD sürümünü kurarak sisteminizi stable yapabilirsiniz.Hatta biraz ileri gidersek sisteminizin multi user mode'tayken bile sistemniniz otamatik olarak güncelleyebilirsiniz.
Simdi adım adım yapacaklarımızı sıralıyalım:

1)Source Tree'yi Güncellemek
2)Gerekli sistem yedeklerini almak
3)Make.conf dosyasını düzenlemek ve /etc/group ile oynamak
4)Tek kullanıcı moda girmek
5)make world (yada "make buildworld" + "make installworld" )
6)Yeni kernel'in derlenmesi (Sisteminizi stable yapmandan önce /usr/src/sys/i386/conf/TOSBAGA *ya da ne ise* dosyasını bir diskete kopyalayın !!!!)
7)/etc nin "mergemaster" ile güncellenmesi
8)/dev in guncellenmesi ve gerekli device'ların oluşturulması
9) /stand/sysinstall'un kurulması
10)Sistem Açılmıyor?Ne Yapmalıyım?
11)Sistemin yenidebn başlatılması (reboot yada fastboot)

Source Tree'nin Güncellenmesi
Bu kısım en kolay kısımlardan biri aslında bu sizin bağlantı hızınıza göre değişiyor.Çünkü /usr/src nin toplam büyüklüğü FreeBSD 4.2 Release itibarı ile 251mb kadar.Biraz buyuk değilmi ama işin kolayı var.Elinizdeki herhangi bir FreeBSD Release CD'sinden /stand/sysinstall ile sistem sourcelarını o release itibarı ile kurun.
Daha sonra cvsup programı ile (Bu programa KABACA cvs sisteminin kullanım kolaylığı olsun diye biraz değiştirilmiş bir versiyonudur denebilir).Bu program için  bir konfigurasyon dosyasına ihtiyacımız var.Fakat merak etmeyin FreeBSD ekibindekiler bizler için bunuda düşünmüşler ve gerekli konfigurasyon dosyasını /usr/share/examples/cvsup dizini altına koymuşlar.Bu dosyalardan bizim durumumuzda ihtiyaç duyduğumuz stable-supfile olacaktir.Bu dosyada yapmamız gereken sadece bir değişikliklik var.Oda size en yakın olan cvsup serverı seçmek.Burada birkaç cvsup server'ın adresini vereyim.
a)cvsup.freebsd.org
b)cvsup2.freebsd.org ( 3 4 5 6 numaralı servarlarda var)
c) Benim kullandığım cvsup.uk.freebsd.org yada diğerleri.Ayrıntılı mirror listesi için http://www.freebsd.org/handbook/mirors.html adresine yada http://freebsd.enderunix.org/handbook/mirrors.html adresinden bakailirsiniz.
Sadece server satırını değiştirdikten sonra yapmanız gereken tekşey 
cd /usr/src
cvsup -g -L 2  /usr/share/examples/cvsup/stable-supfile
dir.Bundan sonra yapmanız gereken sadece beklemek.Gerekli dosyalar ya GÜNCELLENİR yada olmayan dosyalar OLUŞTURULUR.

Bir diğer yol ise CTM'dir. CTM benim evde source treemi güncellemek için kullandığım bir yöntemdir.CTM= Current Thru Mail yada CVSUP Thru Mail demektir. Manuel sayfasına bakarasanız her iki ifadeyide görebilrsiniz:CTM'in mantığı şudur: Günlük yapılan değişiklikler freebsd ftp mirrorlarından herhangi birinde /pub/FreeBSD/CTM/src-4 dizini altında gerekli değişikliklerin günlük olarak eklendiğini görebilirsiniz.Buradaki herbir dosyaya DELTA adı verilir.Ve herbiri ortalama 5-10 kb civarıdır.CTM kullanmak sanırım bütün dial-upçıların işine gelecektir.CTM kullanmak için ilk başta bir start Delta'ya ihtiyacımız vardır.Bu başlangıç deltalarında yine o kadar büyük değildir.Yaklaşık 65 mb büyüklüğünde olan ve her 100 deltada bir yayınlalan deltalardan birini ÖR: src-4000Empty.gz indirmeniz gerekmektedir.250 mb'a göre yinede çok büyük birşey değil.Üstelik deltaları saklayabilirsinizde.Sırarısyla yapılacak seyler:
a) wget ftp.uk.freebsd.org/pub/FreBSD/CTM/src-4/src-4xxxxEmpty.gz
b) mkdir cd /usr/src
c)cd /usr/src
d)ctm -v -v /root/src4-4xxxxEmpty.gz 
Bundan sonra ctm sizin yerinize gerekli islemleri yapacaktır.Şimdi sıra diğer deltaları commit etmeye geldi.
e)cd /usr/src ( bu işlem mutlaka yapılmalı )
f) ctm -v -v /root/src4-4001.gz  yada   ctm -v -v /root/src*. CTM otamatik olarak hangi versiyonda kaldığını /usr/src/.ctm_status dosyasından okuyacaktır.Ve kaldığı yerden devam edecektir.Ports treenizide yine aynı şekilde isterseniz güncelleyebilirsiniz.

Artık elimizde en son source tree var.Şimdi sıra sonraki adımda...

Gerekli Sistem Dosylarının Yedeklerini almak
Mutlaka bu işlemi yapın.make world işlermi aslında /etc dizininize dokunmaz.Ama sisteminiz yenilendiği için /etc dizini ile /usr/src/etc dizini altındaki değişiklikler birleştirilmelidir.Aslında bunu daha sonra anlatacağım ama bu iki dizindeki dosya farklılıklarını birleştirmek için bir perl scripti olan mergemaster kullanılacaktır.
cp -pR /etc /etc.bak olarak /etc dizininin yedeğini alın.Make world'ün değişiklik yapmadığı bir dizinler ise /var /tmp /usr/local dizinleridir.İşte bu yüzdendirki Dan Bernstein qmail'i /var/qmail altına kurulmasını istemiştir.Ek olarak make world /usr/local e dokunulmadığı için sisteminize kurduğunuz özel yazılımlara dokunulmyacaktır.Aslında Linux kullanırken bile /usr/local'in değerini ve manasını tam anlamamşımdır.Ama FreeBSD tam bir Unix olduğu için FHS ye tam olarak uymaktadır.



Make.conf  ve /etc/group dosyaları ile oynamak
Evet yavaş yavaş make world işlemini yapmaya doğru gidiyoruz.Ama önce /etc/group dosyası ile oynamamız gerekmektedir.make world işlemi sisteminizde bazı groupların olduğunu varsaymaktadir.Ve binaryler bu grouplaraıgöre kurulur.Bu problemle başa çıkmak iin /usr/src/etc/group dosyasında olupta /etc/group dosyasında olmayan group'lar varsa /usr/src/etc/group dosyasındaki gerekli groupları (eğer /etc/group dosyasında yok iseler) /etc/group altına kopyalayın.Ornek vermek gerekirse eskiden ppp olarak adlandırılan (daha sonra network olarak değiştirilmiştir) group bazı versiyonlarda yoktu.Ve bunu değişikliği mutlaka /etc/group altına eklemeliydiniz.Benzer bir şekilde /etc/group altında olupta /usr/src/etc/group'a görefarklı bir GID a sahip olan groupların gidları /usr/src/etc/group baz alınarak değiştirilmiştir.Dikkat ederseniz /etc/group'taki sys adminlerin sonradane eklediği grouplardan bahsetmiyorum.Onlar zaten 1000+ gid'a sahip olduğu için oynamaya gerek yok...

Birde sizlere ek olarak daha derinlere inmek isterseniz /usr/src/UPDATING dosyasını okumanızı tavsiye ederim.Aslında okumanada olur.Çünkü burada ben gerekli şeyleri aklıma geldikçce bir düzen içinde anlatacağım.

Sisteminiz için özelleştirilmesi gereken diğer bir dosya ise /etc/make.conf'tur.Bu dosya ile oynayaraj sisteminize tam olarak uygun optimize edilmiş binary'leri ve/veya kernal'i elde edebilirsiniz.Buradaki yapılan eklemeler make in gerekli opsiyonlarına eklenecektir.Burada oynama yaparken CFLAGS'lere sakın -O2 opsiyonunu eklemeyin.Eklenmesi gereken opsiyon -O olmalıdır.Daha fazla bilgi isterseniz /etc/defaults/make.conf'a bakmanızı öneririm.Eğer hızlı bir şeklilde make world yapmak isterseniz sisteminiz için örnek bir make.conf dosyasını( bu dosyayı /etc/defaults/make.conf'u okuyarak oluşturdum)

-------
# Bu dosya /etc/make.conf dosyasıdır

CFLAGS         = -O -pipe
COPTFLAGS = -O -pipe   (Bu sadece kernel derlenirken kullanılır)
NOPROFILE =  true         (Bunu mutlaka make.conf'a ekleyin)
CFLAGS+=  ${BDECFLAGS} ;  (bu option hata verebilir.# isareti ile disable edebilirsiniz.Aslinda bunun amaci hata mesajlarinin verilmesidir. gcc -Wall ile butun hata mesajlari ekrana verilebilir.Garip gelecek ama ben karsilastigim problemin ustesinden bunu #'leyerek aşmıştım.
CXXFLAGS+= -fmemoize-lookups -fsave-memoized
PERL_THREAD = true      (Perl'u thread desteği ile derlemek için
NO_SENDMAIL = true   (Sistemlerinde Qmail kullanan sistem yöneticileri için. Eğer sendmail kullanıyorsanız bu satırı silin)   
 

Birde ek olarak şahsen denemediğim fakat aşağıdaki opsiyonlarda kullanılabilir.Fakat tekrar ifade etmek isterim ben kullanmadım.Use it at your own RISK

CFLAGS   =        -O -pipe -mcpu=pentium -march=pentium   (COPTFLAGS'e de eklenebilir)


Tek Kullanıcılı Moda Geçiş

NOT:Aslinda illaki tekli moda girmeniz gerekmiyor. Nitekim tecrube kazandiktan sonra bu isi uzaktaki makinaniza ssh ile baglanarak cok rahat yapabilirsiniz.
shutdown now    komutu ile single moda mutli modtayken geçebilrsiniz yada reboot komutunu kullanın sonra sistem açılırken ENTER tuşuna basmak yerine herhangi bir tuşa basarak gelen Kernel Configuration'da  " boot -s  "kullanarak tekli moda geçebilirsiniz.Nitekim eğer ilerki safhalarda make world ( = make buildworld + make installworld ) başarılı olmazsa sistemimizi kurtarmak için ikinci seçeneği kullanacağız.Nitekim ilk denemesinde make world'u sorunsuz yapmak pek olası değil :)

Make World
Evet artık sistem binarylerimizi derleme zamanımız geldi.Şimdi make world komutunu verebiliriz.Ama benim sizlere tavsiyem make buildworld ile önce sistem binarylerini derleyip daha sonra make installworld ile derlenenen sistem dosyalarınızı sisteminize kurmak olacaktır.Ayrıca
% script /root/mbw.out ile derleme sırasında yapılan herşeyi mbw.out dosyasında kaydedebilirsiniz.Eğer sisteminizin kac saatte dosyları derlediğini öğrenmek isterseniz
% time make buildworld komutuda kullanılabilir.Benim sistemimde (celeron 300a + 64mb ram) bu işlem yaklaşık 2,5 saat aldı.Birde eğer istenirse
% make -j4 make buildworld komutunu kullanarak aynı anda make komutunun 4 farklı iş yapmasını sağlayabilirsiniz ama size tavsiyem bu opsiyonu kullanmayın..Eğer sisteminiz derleme sırasında çok değişik .c dosylarının derlenmesinde hata verirse bunun sebebi -j4 'tür. Birde eğer -j4 buildworld derseniz installworld derkende -j4 'ü kullanmalısınız yani:
% make -j4 installworld
Böylece sistem binarylerimiz stable oldu.Bunlara ek olarak bind gibi yazılımlarda stable duruma geldi.Bu aşamada sakın sisteminizi kapatmayın.(reboot vb.)Mutlaka yapılan her make world'ten sonra source tree'den yeni kernel derlenip stable sistem bu kernel ile açılmalıdır.!!!!!!

 

Kernel'ın Derlenmesi

Yapılan her make worldten sonra mutlaka o stable branch'e uygun bir kernel derlenilmesi gerekir.Neden? Daha önceden de söylediğim gibi FreeBSD sadece kernel'dan oluşmaz.Sistem binarylerini de içerir.Nitekim source tree (/usr/src) yi inceleyen herkes bunun farkına çok rahat varabilir.İşte bu aşamada kernel nasıl derleyeceğiz o anlatılacaktır.En üst kısımda Release kernelininizin konfigurasyon dosyasını mutlaka bir diskete kopyalayın ibaresi vardı.İşte  burada onu kullanacağız.Kernel hataları ile make world'ten sonra uğraşmak güç olabilir.Böylece karşılaşılacak hatalar minimuma indirilmiş olur.En azından bu aşamada çalışır bir kernel derleyip sistem tam manasıyla stable olduktan sonra kernel'da gerekli değişiklikler yapılabilir.Eğer istenirse stable source tree'nin GENERIC kernel'ıda bu aşamada kulanılabilir.
Kernel derlemek için :
% cd /usr/src/sys/i386/conf
%config -r TOSBAGA    {yada GENERIC }
%cd /usr/src/sys/compile/TOSBAGA
%make depend
%make
%make install
komutları kullanılır.İşte kernel derlendi ve /kernel ' a kopyalandı.Modullerde /modules dizinine kopyalandı.

/etc Dizininin Güncellenmesi

Make world /etc dizinine dokunmaz.Ama stable sistemin /etc si her zaman release den değişik olmaktadır.Bunu cvsup yada ctm yaparkende gözleyebilirsiniz./etc dizini altındaki dosyalar değiştirilebilir yada /etc altında yeni dosyalar oluşturulabilir.Bu değişiklikler normalde elle de yapılabilir diff komutunu kullanarak gerekli değişiklikler /etc dizini altındaki dosyalara uygulanabilir.Bunun zorluğu göz önune alınarak "mergemaster" scripti yazılmıştır.Yapılacaklar :
%cd /usr/src
%mergemaster -cv
Mergemaster size interactive olarak değişilikleri gösterip size ne yapması gerektiğini şıklar halinde gösterecektir.

/dev Dizinin Güncellenmesi

Make world ve /etc dizini halledildikten sonra sırada /dev dizinini upgrade etmek var.Eğer sisteminizde devfs kullanıyorsanız bu kısmı rahatlıkla geçebilirsiniz.İlk başta release'imizin /dev dizini ile /usr/src/dev ini karşılaştırmak gerekir.Eğer mergemaster'ı kullanmışsanız /dev/MAKEDEV dosyası source treeden /dev dizinine kopyalanmıştır.Ama eğer paranoyak biri iseniz direk ellede kopyalayabilirseniz.Yeni device'lar yaratılmadan önce bu device'ların bir listesini alalım:
% cd /dev
% ls -l | awk '{print $1, $2, $3, $4, $5, $6, $NF}' > /root/dev_release.out
Şimdide devicelarımızı yeniden oluşturalım:
% sh MAKEDEV all
Daha sonra tekrar devicelarımızın listesini bir dosyaya aktaralım:
% ls -l | awk '{print $1, $2, $3, $4, $5, $6, $NF}' > /root/dev_stable.out ve iki dosyayı karşılaştıralım:

%diff /root/dev_release.out /root/dev_stable.out
Böylece olmayan device'lar tekrar yaratılabilir:
% sh MAKEDEV snd
gibi.

Burada önemli olan birkaç husus var.Mesela stable sistemde mutlaka scsi diskin  ya da ide diskin device fileları olmalı yoksa sistem açılmaz.Zaten diff komutu size nelerin kurulması geretiği hususunda gerekli bilgiyi  verecektir.

/stand/sysinstall Programının Güncellenmesi

Aslında bu programı güncellemek gerekli değil.İyi bir sistem yöneticisi sysinstall'a ihtiyaç duymadan her türlü işini gerçekleştirebilir.Kısacası kendi tabirimle " "BIGADMIN /stand/sysinstall nedir bilmez.VI'dan şaşmaz" :) /stand/sysinstall güncellenmesi için
%cd /usr/src/release/sysinstall
%make all install
komutları kullanılır.

Sistemin Yeniden Başlatılması

Artık herşey tamam.Sisteminizi tekrar başlatmalısınız.Bunun için reboot yada fastboot komutlarından birini kullanabilirsiniz.Sistem yeniden açılrken problemle karşışırsanız sonraki bölümü okuyun.....

Sistem açılmıyor?Ne yapmalıyım?

Paniğe hiç gerek yok.Eğer buraya kadar gelmişseniz ve bir sorunla karşılaşmasaydınız yaptığınız tek hata mergemaster ile olacaktır.Daha açık bir ifade ile /etc altındaki dosyalar tam manasıyla güncellenmemiştir.Mesela /dev/ttyv0,,,7 yok gibi bir hata ile karşılaşırsanız muhtemelen /etc/gettytab dosyasını manuel olarak /etc altına koyalamalısınız.Yada verilen hatalara göre gerekli dosyayı kopyalamalısınız.Fakat burada bir sorun oluşacaktır.Eğer sistem açılırken hata ile karşılaşırsaniz sisten bütün slice'ları read-ony mount edecektir.İşte bu durumda daha önce zikrettiğim şekilde sistemi single mode'ta açmanız gerekmektedir.Sistemi CTRL+ALT+DELETE ile yeniden başlatın 10 saniye beklemeden ENTER tuşu haricinde herhangi bir tuşa basın.Böylece kernel configurator'a girmiş olursunuz.
Burada 
> boot -s  komutunu girin ( > işareti sizin kernel configuratorda olduğunuzu gösterir.)
Sistem single modta açılacaçtır.Fakat slice'lar read-only mount edilmiş olacaktır.Yani gerekli değişiklikleri yapamıyacaksınız.Bunun üstesinden gelmek için shell'de iken
% mount -a -t ufs
komutunu yazın.Artık ufs slicelar read only olacaktır. /etc.bak dizininden yada /usr/src/etc dizininden istediğiniz dosyayı kopyalayın ve sistemi tekrar başlatın...

Hepsi bu kadar.Umarım yararlı olmuştur.Bu dökuman hakkında geri donümlerinizi ofsen@enderunix.org adresine bekliyorum.

Bu dökumanın  ana adresi http://EnderUnix.org 'tur.Bu dökumanın tüm hakları Enderunix Yazılım Geliştirme Grubuna aittir.Dökuman üzerinde yapmak istediğiniz işlemler (sitenizde yayınlama,basılı herhangş bir yerde kullanma vb.) için roots@enderunix.org adresine  mail atip gerekli izini alma zorunluluğu vardır

Dökumanı yazan: Ömer Faruk Şen ( ofsen@enderunix.org, omer@faruk.net )