Uygulamalı LFS denemesi

Başlatan heartsmagic, 17 Mayıs 2012 - 02:18:30

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

heartsmagic

Bu başlığın açılmasına sebep olan konumuz şuradadır:

http://forum.ubuntu-tr.net/index.php?topic=33727.0

Giriş

Vakit bulduğumuz sürece bu başlık altında beraberce LFS yapmaya çalışacağız. Bu işlem tek seferde yapılabilecek bir şey olmadığından belirli bölümlerde ara vereceğiz. Tekrar vakit bulduğumuzda başlığımızı güncelleyeceğiz. Dileyen böylece kaldığı yerden LFS yapmaya devam edebilecek.

Öncelikle LFS'nin çok kısa bir tanımını yapalım. LFS için kabaca sıfırdan Linux sistemi kurma/oluşturma projesi diyebiliriz. Başını Gerard Beekmans'ın çektiği bir grup uzunca bir süredir LFS ve onunla ilgili diğer projeleri yönetir ve belgelendirirler. Kendisi bir kitaptır aslında, kullanıcılar bu kitabı takip ederek kendilerine ait bağımsız bir Linux sistemini sıfırdan ele alarak oluştururlar. Oluşturma aşamaları da kabaca gerekli ortamı hazırlama, paketleri indirme, yamalama/derleme ve kurma, ardından sistemi yapılandırma olarak sıralanabilir.


LFS yapmak için ne kadar Linux bilgisine sahip olmalıdır?

LFS yapabilmek için orta düzeyde Linux bilgisi yeterli olur diyebiliriz. Fakat malumunuz "düzey" göreceli bir kavramdır. Linux'a henüz yeni başlamış, kabaca dizin yapısını bilmeyen, en temel kabuk komutlarında bile tekleyen, sorun yaşadığında temel meseleleri deneyecek kadar bilgiye sahip olmayan, sistem dosyalarının yerlerini bilmeyen/tahmin edemeyen kullanıcılar için LFS kesinlikle önerilmez. Şu durumda, yukarıdaki şartları sağlayan ve vakti olan herkes LFS'yi deneyebilir. Bu başlıkta da LFS yapmaya niyetlenenlerle beraber uygulamalı olarak denemelerimizi yapacağız.

Lütfen, lütfen, çok temel meselelerde dahi eksikleriniz varsa bu işe girişmeyin. Bu başlık tamamen eğlence ve biraz da eğitim, beraberce bir şeyleri öğrenme amaçlı açılmıştır.

LFS için kendi kitabının en son (current/development) sürümünü takip edeceğiz:
http://www.linuxfromscratch.org/lfs/view/development/

Bu sürümün bize getirisi daha yeni paketlerin kullanılıyor olması, götürüsü ise hata çıktığında henüz çözüme ulaşmamış olması veya bizim bulamama ihtimalimiz. Be geliştirme sürümü için hata kayıtları şuradan takip edilebilir:
http://wiki.linuxfromscratch.org/lfs/report/1

Vakti ve hevesi olanlar kitabı baştan okuyabilirler. Biz burada doğrudan LFS yapma aşamalarına geçeceğiz.

LFS için gerekli bölümün hazırlanması ve sisteme bağlanması

LFS için diskimizde boş bir bölüm hazırlamalıyız. Öncelikli işlemlerimizi kurulu olan yani mevcut olarak kullandığımız Linux dağıtımı üzerinden yapacağız. LFS'nin yapılma şekillerinden biri budur. Kullandığımız Linux dağıtımı üzerinden belirli bir yere kadar geliriz. O aşamaya kadar mevcut olan dağıtımımızı kullanırız. Bu nedenle boş bölümü oluşturup mevcut sisteme bağlıyoruz.

Haliyle bize şu an lazım olan şey bir adet boş bölüm. Bunu nasıl yapacağınız tamamen size bağlı, hazırda boş bir bölümünüz olsun. Ben kendime boş bir bölüm ayarlayıp ext4 olarak biçimledim. Boyutu 12GB, oldukça geniş bir yer kısacası bu iş için.

NOT: BLFS yapmayı düşünenler için bu alanın çok daha geniş olması gerekebilir. Zira büyük uygulamalar derleme için geniş alanlara ihtiyaç duyabilirler.

Not: İşte tam bu aşamada "Ya @heartsmagic ben boş bölümü nasıl ayarlayacağım, nasıl ext4 yapacağım?" diyen varsa LFS'den hemen vazgeçsin :)

Benim diskimde bu iş için ayırdığım bölüm ismi: /dev/sda5
Bunu kullandığım Ubuntu üzerinde şimdilik bağlayacağım dizin /media/lfs
Ev dizinini ayrımayacağım, sistemin kullandığı herhangi başka bir dizini de ayrı bir bölüm olarak tanımlamayacağım. Kısacası tek bir disk bölümüm ve tek bir bağlama noktam olacak. Dileyen ev dizinini ayırabilir, fakat ilerideki fstab gibi düzenlemelerde bu ayrımı yaptığınızı göz önünde bulundurun.

LFS kitabı /media/lfs (aslında kitapta media değil mnt kullanılır, ben /media tercih ettim) dizini için bize bir değişken tanımlatır: $LFS. Aslında buna gerek yoktur (şu an böyle düşünüyorum) fakat aşamalarda her seferinde /media/lfs yazmamak için bu yapılabilir.

export LFS=/media/lfs

Not: Bu tanımlamayı LFS yapmayı bırakıp sistemi kapattıktan sonra tekrar bir şekilde sürece geri döndüğümüzde her seferinde yine yapmalıyız. Eğer unuturum, çok tembelim diyorsanız .profile veya .bashrc dosyanıza ekleyin tanımlamayı. Yine, bunu nasıl yapacağını soracak olan varsa LFS yapmayı bıraksın :)

Tabi bölümümüzün bağlanması için o dizinin sistemimizde bulunuyor olması gerekmekte diye bir hatırlatmayı LFS yapacaklara söylemem abes olacaktır :) Ben şu an işlemlerimi root ile yapıyorum, siz ister root ile yapın isterseniz sudo ile, ne yaptığınızı lütfen iyi bilin. LFS ile uğraşıyorum diyerek kurulu sisteminizden olmayın. Zaten ileride LFS kitabı da bizi root kullanmamamız için uyaracak ve ayrı bir kullancı tanımlatacak.

Şimdi, bölümümüz hazırlandı ve sistemde /media/lfs dizini altına bağlandı. Bir sonraki aşamaya geçebiliriz.


Gerekli paketleri ve yamaları indirme

Paketlerin indirilmesi aşaması kitabın şu bölümünde anlatılmakta:
http://www.linuxfromscratch.org/lfs/view/development/chapter03/introduction.html

LFS'ci arkadaşlar bir sonraki sayfada paket ve yama listesini veriyorlar. Bir paket yerinde olmadığı için kendi suncularından dağıtıyorlar, çekirdek sürümü için de en güncelini kullanın diyorlar. Tabi diğer paketlerde uyarı olmaması sorun yaşamayacağımız anlamına gelmez. Duruma göre hareket edeceğiz. Tüm listeyi tek tek indirmeyle uğraşmamamız için de bir wget listesi yapmışlar. Paketlerin güncelliğinden emin olmadığım için anlatımın şu noktasına ufak bir ara verip paketleri denetlememiz lazım. Sizin için bunu ben yapmış olacağım haliyle :)

Değişenleri yazalım.

Paketler:

1. E2fsprogs
Sürmü 1.42.3 olmuş, bu da kitabın hata kayıt bölümünde hatırlatılmakta. wget-list Dosyamızda değiştireceğiz.

2. Perl için kendiniz bakarsanız ve "5.15.9 sürümü çıkmış neden kullanmıyoruz" derseniz Perl sürümlerinde ikinci bölümdeki çift sayı kararlı, tek sayı kararsız sürüm anlamına geliyor. Haliyle 5.14 şu an kararlı seridir.

Ana paketlerde değişen başka bir şey yok. Toplam boyut: 288 MB

Yamalardan değişen yok. Toplam boyut: 206.1 KB

Paketleri ve yamaları indirmek için LFS'cilerin bize sağladıkları wget-list dosyasını kullanacağız. Fakat öncelikle paketleri ve yamaları indirmek, ayrıca derlemeleri de yapmak için kök dizinimiz içinde bir "sources" dizini olşturalım.

mkdir $LFS/sources

Ardından dizine düşelim ve dosyamızı indirelim.

cd $LFS/sources
wget http://www.linuxfromscratch.org/lfs/view/development/wget-list


Ardından e2fs sürüm değişikliğini yapalım:

sed -i 's/e2fsprogs-1.42.2.tar.gz/e2fsprogs-1.42.3.tar.gz/' wget-list

Değişikliğimizi yaptığımıza göre paketlerimizi indirebiliriz:

wget -i wget-list

Bu aşamadan sonra arkanıza yaslanıp bekleyin. Tüm paketler sırayla inecektir. LFS'ci arkadaşlar dosyaların tam inip inmediğini denetlemek için de bir yol vermişler kitapta. İsteyen onu da deneyebilir.

Şimdilik bu kadar uğraş yeter. Bir sonraki eklememizde olayları biraz daha hareketlendireceğiz :)
Hayattan çıkarı olmayanların, ölümden de çıkarı olmayacaktır.
Hayatlarıyla yanlış olanların ölümleriyle doğru olmalarına imkân var mıdır?


Böylece yalan, dünyanın düzenine dönüştürülüyor.

heartsmagic

$LFS hatırlatması, /tools dizini ve lfs kullanıcısının oluşturulması

Bir önceki anlatımda LFS için gerekli bölümü ayarlamış ve paketlerimizi buraya indirmiştik. Bizim anlatımımızda bölümümüz /media/lfs altına bağlanmıştı ve $LFS isimli bir değişken tanımlanmıştı. Tam bu noktada bir hatırlatma yapalım. Anlatımın herhangi bir yerinde $LFS kullanıldığını görürseniz mutlaka bu değişkenin o kullanıcı için tanımlanmış olduğuna emin olun. Neden "o" kullanıcı dedik? Göreceksiniz ki LFS yaparken ayrı bir kullanıcımız da olacak ve bu kullanıcı root'tan veya sisteminizde olan kullanıcıdan farklı olacak. Haliyle bazı aşamalarda kullanıcılar arasında geçiş yapacağız (çok sık değil). Kısacası bir işlem yaparken hangi kullanıcıda olursak olalım eğer $LFS kullanılıyorsa bu değişkenin /media/lfs'yi göstermesi gerekmekte.

Nasıl yaptığımızı hatırlayalım:

export LFS=/media/lfs

Bu değişkenin doğru şeyi gösterdiğine emin olmak için:

echo $LFS

Şu çıktıyı vermeli:

Alıntı Yap/media/lfs

Ara ara bunun ve diğer noktaların hatırlatmasını yapacak olsak bile unutma ihtimalimiz var. Zira tek bir seferde LFS yapmıyoruz, sistemi bir yerde bırakıp geri dönüyoruz.

LFS yaparken paketler iki aşamada, kısacası ikişer kez derlenir. Birincisi LFS için geçici ortamı sağlamak adına yapılır ve LFS kitabının beşinci bölümüdür bu aşama. LFS'nin kendisi altınca bölümde, paketlerin derlendiği ikinci aşamada yapılır. Asıl derleme işlemi chroot üzerinden yapılır. Şimdilik bu kadar bilinmesi yeterlidir. Bizim bu geçici paketleri edinme aşamamız için $LFS/tools dizini kullanılır. Böylece geçici olarak derlenen paketler tek bir yerde toplanır ve asıl LFS ile karışmaz. Lafı fazla uzatmadan biraz ilerleyelim.

Öncelikle LFS yapacağınız disk bölümünü bağladığınızı ve yukarıda hatırlatıldığı üzere $LFS değişkenini tanımladığınızı varsayıyorum. Aslında bu değişkeni kullanmak şart değil fakat geleneklere uyalım :) Geçen bölümde root kullanmıştım kullanıcı olarak. Bu sefer kendi kullanıcımla fakat sudo kullanrak devam edeceğim.

sudo mkdir -v $LFS/tools
sudo ln -sv $LFS/tools /


Not: İkinci komutta sonda / karakteri var.

Böylece /media/lfs/tools dizinimiz oluşturuldu ve ev sahibi sistemde /tools adında bir sembolik bağ oluşturuldu. Kendisi /media/lfs/tools dizinini işaret etmekte.


LFS yapılırken sistemdeki root kullanıcısı ile işlem yapılmaması önerilmekte. Kitapta sisteme yeni bir kullanıcı tanımlanması var. Aslında biz root olmayan kendi kullanıcımızla da devam edebiliriz. Fakat yine geleneklere bağlı kalmak için bu işlemi de yapalım. LFS kitabı bir lfs kullanıcısı oluşturmayı anlatmakta. Tabi yanında bir de lfs grubu oluşturacağız ve lfs kullanıcısı lfs grubuna da dahil olacak.

sudo groupadd lfs
sudo useradd -s /bin/bash -g lfs -m -k /dev/null lfs


lfs grubumuz ve kullanıcımız oluşturuldu. İkinci satır kullanıcı oluşturmak için, neler yaptığı aslında kitapta anlatılmakta. -s kabuğu ayarlamak için, -g kullanıcıyı lfs grubuna eklemek için, -m ev dizininin oluşturulması için, -k sistemdeki "skeleton directory" denilen iskelet dizinin öntanımlı olarak alınmaması için kullanılmakta.

Şimdi lfs için parola atayalım ve bazı sahiplikleri verelim.

sudo passwd lfs
sudo chown -v lfs $LFS/tools
sudo chown -v lfs $LFS/sources


Böylece lfs'ye parola atadık ve az önce oluşturduğumuz tools dizini ile bir önceki bölümde oluşturduğumuz sources dizinlerinin sahipliklerini kendisine geçirdik. Artık lfs kullanıcısına geçebiliriz.

su - lfs

Bu komuttan sonra artık kullanıcı olarak lfs'ye geçmiş oluyoruz. Şu şekilde denetleyebiliriz bunu:

whoami
Alıntı Yaplfs

Bu komut size lfs ismini döndürmeli. Ayrıca pwd komutu da ev dizinini işaret ediyor olmalı, yani /home/lfs dizinini.

pwd
Alıntı Yap/home/lfs

Peki $LFS değişkeni?

echo $LFS

Gördüğümüz üzere boş döndü? Neden? LFS yapan bizlerin bunu biliyor olması lazım :) Tanımlamadık. LFS değişkenini bir önceki kullanıcıda yani normal kullanımızda tanımlanmıştı. Haliyle lfs henüz oluşturuldu ve boş boş bizi bekliyor. Devam edelim.

Çevresel değişkenlerin hazırlanması

lfs kullanıcımız için bazı çevresel değişkenleri ayarlayacağız.

Dikkat: Bu ayarlamaları mutlaka lfs kullanıcısına geçtiğiniz uçbirimde uygulayın. Yanlışlıkla bir başka kullanıcı ile uygularsanız sistemdeki kendi kullanıcınıza ayar yapmış olursunuz.

cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF


Yukarıdaki işlemi şu şekilde yapacaksınız. İlk satırdaki komutu kopyalayıp yapıştırın. Bir alt satıra geçecek ve şu şekilde bekleyecektir:
>
Buraya ikinci satırı kopyalayıp yapştırın. Enter tuşuna basınca bir alt satıra geçecektir. EOF yazıp olayı bitirin. Bu cat kullanarak bir dosyaya yazma işlemidir. Bu şekilde yapılan tüm anlatımlarda aynı şeyi uygulayacaksınız.

Not: Aslında size uzun yolu anlatıyorum, mantığı anlayın diye. Zira yukarıdaki tüm satırları kopyalayıp, eksiksizce yapıştırdığınızda istediğimiz şey olacaktır. Sadece EOF'tan sonra bir Enter hamlesine bakar. Fakat kopyala/yapıştır esnasında dikkatli olun.

Bu komutla lfs kullanıcısına ait bir .bash_profile dosyası oluşturduk. Şu şekilde denetleyebilirsiniz:

cat .bash_profile

Ardından şunu uygulayın:

cat > ~/.bashrc << "EOF"
set +h
umask 022
LFS=/media/lfs
LC_ALL=POSIX
LFS_TGT=$(uname -m)-lfs-linux-gnu
PATH=/tools/bin:/bin:/usr/bin
export LFS LC_ALL LFS_TGT PATH
EOF



Yine bu üstteki ifadeyi kopyalayıp yapabilirsiniz. Ayrı ayrı yazmanıza gerek yok, ancak tekrar söyleyeyim dikkatli olun. Bir de ekleme yapalım, keşke /media/lfs değil de yine geleneklere uyarak /mnt/lfs yapsaymışız :) Kitapta /mnt/lfs dizini olarak anlatıldığı için bunun olduğu her yerde bizim kesinlikle unutmadan bunu değiştirmemiz gerekiyor. Tabi bunu anlatımda ben yaptığım için unuttuğum bir yer olursa fark etmek size düşüyor :) Gerçi /mnt/lfs olarak değiştirmek için çok geç değil fakat işleri daha da fazla karıştırmayalım.

Böylece kullanıcımıza ait bir de .bashrc dosyası oluştumuş olduk. Tam olarak bunların ne olduğunu anlatmak isterdim fakat mesele çok uzayacağından yapamıyorum. Belki ileride LFS bittiğinde geri dönüp anlatımı düzenleriz. Tabi başarıyla LFS yapabilirsek ve vaktimiz kalırsa. Zira LFS yapıp yapamayacağımızı bilmiyoruz henüz :)

Bu aşamaya geçmeden önceki son not. Lütfen iki dosyanın içeriğini tekrar denetleyin:

cat .bash_profile
Alıntı Yapexec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash

cat .bashrc
Alıntı Yapset +h
umask 022
LFS=/media/lfs
LC_ALL=POSIX
LFS_TGT=$(uname -m)-lfs-linux-gnu
PATH=/tools/bin:/bin:/usr/bin
export LFS LC_ALL LFS_TGT PATH

İki dosyanın da içeriğinin yukarıdaki gibi olması lazım. Eğer ortalık karışmışsa basitçe dosyaları rm ile silerek yeniden oluşturabilirsiniz. Derlemelerin sorunsuzca gitmesi için bu dosyaların düzgün olması lazım.

Artık oluşturduğumuz bu dosyadaki tanımlamaları etkin hale getirebiliriz, yani dosyamızı "source" edebiliriz.

source ~/.bash_profile

Bu işlemden sonra göreceksiniz ki $LFS değişkenimiz de /media/lfs olarak tanımlanmış olacaktır.


SBU ve Test Araçları

Derlemelere geçmeden önce iki şeyden bahsediyor kitap. Paketlerimizi derlerken herkesin kullandığı makineye, kaynaklarına göre derleme süresi değişecektir. Kitap haliyle hangi paketin ne kadar sürede derleneceğini söyleyemiyor. Mesela en büyük paket olan (çekirdeği saymıyor) Glibc hızlı makinelerde 20dk. yavaş makinelerde üç gün sürer diyor. Fakat buna rağmen ortaya bizim kıyaslayabileceğimiz bir değer sunuyor. Beşinci bölümde derleyeceğimiz ilk paket binutils. Bu paketin makinemizde derlenme süresi bizim SBU'muz olacak. Kısacası eğer bu paket bizim makinemizde beş dakikada derleniyorsa bizim SBU'muz beş dakikadır. Her paketin SBU'su verilmekte, mesela bir paket için 3 SBU demişse kitap, bu bizim sistemimizde 3*5=15 dakika yapar. Tabi bu sistemi uygulamak için ilk derlemenin süresini tutmanız gerekir. Gerekli midir bu işlem? Elbette değildir, fakat tahmini olarak size derleme sürelerini verir.

Diğer mesele ise paketlerle beraber gelen test araçları. Bazı paketler doğru düzgün derlenip derlenmediklerini anlamamız için test araçları ile beraber gelirler. Derleme sonunda bu araçları yürütür ve duruma bakarız. Beşinci bölümde, yani geçici ortamımızı oluşturduğumuz bölümde test araçlarına gerek yoktur. Zaten kitap bizi güzel bir şekilde yönlendirmektedir. Fakat ilerleyen bölümlerde test araçlrarından bahsediyorsak mutlaka sizler de bunları uygulayın. Özellikle glibc, gcc gibi hayati paketlerde bu araçlar önemlidir.

Bir diğer mesele ise derlemelerin paralel olarak yapılarak zaman kazanılmasıdır. Çift çekirdeğe veya çift işlemciye sahip olanlar make aşamalarında -j2 kullanabilirler. Böylece paralel derleme yapılacak ve zamandan kazanılacaktır.


Geçici sistemin hazırlanması

Daha önce bahsettiğimiz üzere LFS'nin yapılması iki aşamadan oluşmaktadır. Önce geçici olarak paketlerimizi derleyip, sonra bu derlediğimiz paketleri kullanarak asıl LFS sistemimizi inşaa edeceğiz. Bu geçici sistemi de yine daha önce belirttiğimiz üzere tools dizini altına oluşturacağız. Detayları yine geçerek ellerimizi kirletmeye başlayabiliriz. Kısacası ilk paketimiz bizi bekliyor.

İlk paketimize geçmeden önce bazı önemli noktaları kitabın yaptığı gibi tekrar hatırlatalım.

* $LFS değişkeninin doğru tanımlandığını denetleyin.
* Paketleri doğru yere indirdiğinize emin olun. Bizim sistemimizde burası $LFS/sources dizini.
* Her paket için derleme kabaca şöyledir, takip ettiğinize emin olun.
* Paket tar ile arşivden çıkartılır.
* Çıkartılan dizini girilir.
* Anlatım takip edilir.
* sources dizinine gidilir.
* Pakete ait kaynak dizin ve varsa <paket>-build dizini silinir.

Bu aşamda kafanız karışmasın, zira adım adım gidilecek. Kitap anlatıyor, ben de yaptıkça zaten aktarmaya çalışacağım. Evet, elleri kirletme zamanı geldi.

Not: Bu arada kitap tar ve cd işlemlerini anlatmıyor, o kadarını LFS yapacak birinin anlayacağını düşünüyor tabi :) Ben ekliyorum ama komutları.


Binutils-2.22 - Aşama 1 (Kitap Pass 1 diyor, ben Aşama dedim)


Alıntı YapYaklaşık derleme zamanı: 1SBU
Gereken disk alanı: 350MB

Görülebileceği üzere kitap bu paket için 1SBU demiş. Yapılandırma ve kurulum sonucunda geçen zaman bizim SBU'muz olacak. Derleme için alan şartı da 350MB. Geçelim ilk paketimizin derlenmesine.

Şu an lfs kullanıcısına geçmiş ve öylece bekliyorsanız muhtemelen. Ayrıca o kullanıcıya ait ev dizinindesinizdir. Lütfen şunları tekrar görün, ancak unutmayın bunları her seferinde anlatmamız mümkün değil. Ara ara hatırlatabiliriz. Derlemeler için lfs kullanıcısında olmalısınız ve $LFS/sources dizinine inmelisiniz.

whoami

size lfs döndürmeli. pwd nerede olduğunuzu gösterir. Şimdi LFS yapacağımız bölümdeki sources dizinine geçelim.

cd $LFS/sources

Şimdi binutils paketimizin arşivini açıyoruz ve dizinine geçiyoruz.

tar xvf binutils-2.22.tar.bz2
cd binutils-2.22


Kendisine ait bir yamamız var, yapıyoruz:

patch -Np1 -i ../binutils-2.22-build_fix-1.patch

binutils, kaynak dizinde derleme yapmamızı istemiyormuş. Bir üst dizinde kendisine ait bir build dizini oluşturuyoruz ve derlemeye orada devam ediyoruz.

mkdir -v ../binutils-build
cd ../binutils-build


Böylece dizini oluşturduk ve düştük. Şimdi derlemeye geçebiliriz. Fakat sadece bu seferlik bir SBU ölçümü yapmamız lazım. Böylece derleme sürelerini tahmin edebileceğiz. time diye güzel bir komutumuz var bu iş için. Onu ve derleme aşamalarını kullanarak ölçüm yapacağız. Önce komutumuzu verelim sonra açıklamayı yapacağız. Fakat komutu uygulamadan önce açıklamayı okuyun lütfen.

time { ../binutils-2.22/configure --prefix=/tools --with-sysroot=$LFS --with-lib-path=/tools/lib --target=$LFS_TGT  --disable-nls --disable-werror && make -j2 && make install; }

Bu komut tek satırda uygulanmalı. time ile başlayıp son küme parantezine kadar tek komuttur bu. Söylediğimiz gibi sadece bu seferlik böyle bir şey yapıyoruz. Bunun sonucunda time uygulaması bize bir süre verecek. Bu süre paketin configure ile yapılandırmasından, derlenip kurulmasına kadar olan süredir.

Eğer sisteminiz 64bit ise, yani 64bit'lik bir dağıtım kullanıyorsanız lütfen yukarıdaki komutu şu şekilde değiştirin:

time { ../binutils-2.22/configure --prefix=/tools --with-sysroot=$LFS --with-lib-path=/tools/lib --target=$LFS_TGT --disable-nls  --disable-werror && case $(uname -m) in x86_64) mkdir -v /tools/lib && ln -sv lib /tools/lib64 ;; esac && make -j2 && make install; }

Yine tek satırda uygulanacak, lütfen dikkat edin.

Komuttaki bir başka konu ise benim make aşamasında -j2 parametresini kullanmam. Eğer iki çekirdekli veya çift işlemciye sahip bir sisteminiz yoksa bu aşamayı sadece make olarak değiştirin. Ben derlenme aşamasında iki çekirdeğin birden kullanıldığını izledim Conky üzerinde.

Şimdi, eğer her şey yolunda giderse paketimiz için yapılandırma aşaması yapılacak ve sırasıyla derleme ve kurma işlemleri tamamlanacak. Benim time ile aldığım çıktı şu şekilde:

Alıntı Yapreal   1m38.127s
user   1m41.222s
sys   0m13.709s

Burada ilk satırdaki değeri ele alıyoruz. Kısacası bu paketin bende yapılandırılması, derlenmesi ve kurulması 1dakika 38saniye sürdü. Bu demektir ki benim SBU değerim 1dakika 38saniyedir. Tabi bu derlenme esnasında sisteme hiç yüklenmedim, diski kullanmadım. Bunlar yapılırsa derleme süresi değişecektir.

Eğer paket güzel bir şekilde derlendi ve kurulduysa /tools dizini altında bazı dizinler ve bu dizinlerin altında uygulamalar, dosyalar oluşmalı. Mesela bendeki bir çıktı şöyle:

ls -l $LFS/tools/i686-lfs-linux-gnu/bin/
Alıntı Yapar  as   ld  ld.bfd  nm   objcopy  objdump  ranlib  strip


Evet, ilk paketimizi derledik. Bende derleme ve kurulum sorunsuz gitti. Sorunsuz bittiği için açtığım arşiv dosyasını ve build dizinini siliyorum.

cd $LFS/sources
rm -rf binutils-2.22
rm -rf binutils-build/


Dikkat, sadece açtığımız arşiv dizinini ve haricen oluşturduğumuz build dizinini siliyoruz. Kaynak pakete ve yamaya dokunmuyoruz. Sonraki anlatımlarda silme işlemleri verilecek fakat bu uyarı yapılmayacaktır.


Peki derleme sorunsuz bitti mi diye soracak olursanız? LFS yapan birisinin en azından derlemelerin sorunsuz gittiğini anlayabilmesi gerekir :)
Fakat, derleme sonucunda "error" yazan bir satır veya satırlar görmediyseniz sorunsuz gitmiş demektir.

Sizdeki duruma göre ve vakit bulduğumuzda bir sonraki aşamaya yani bir sonraki paketimize geçeceğiz. O paket ise GCC.
Hayattan çıkarı olmayanların, ölümden de çıkarı olmayacaktır.
Hayatlarıyla yanlış olanların ölümleriyle doğru olmalarına imkân var mıdır?


Böylece yalan, dünyanın düzenine dönüştürülüyor.

heartsmagic

#2
GCC-4.7.0 - Aşama 1

Alıntı YapSBU: 5.0
Disk alanı: 1.2GB

Bir önceki bölümde en son binutils'i derleyip bırakmıştık. Sıradan devam ediyoruz. İşlemlere başlamadan önce LFS yapacağınız bölümü bağlamış olmanız ve lfs kullanıcınıza geçmeniz gerekmekte. Şu çıktılar fayda verecektir:

whoami
Alıntı Yaplfs
echo $LFS
Alıntı Yap/media/lfs

Eğer lfs kullanıcısnı görmüyorsanız, kendisine geçmelisiniz. Eğer lfs kullanıcısındaysanız fakat $LFS değişkeni /media/lfs basmıyorsa bir önceki bölümde anlatılan .bashrc veya .bash_profile yapılandırmasında sorun yaşıyorsunuz demektir. Bu adımları tamamlamadan derlemeye devam etmeyin.

Evet, her şeyin yolunda olduğunu varsayarak devam ediyoruz. Önce ilgili dizinimize geçelim ardından paketimizi açalım ve dizinine geçelim.

cd $LFS/sources
tar xvf gcc-4.7.0.tar.bz2
cd gcc-4.7.0


Böylece gcc paketimizi açtık ve dizinine düştük. GCC derlenmek için GMP, MPFR ve MPC paketlerine ihtiyaç duyuyormuş. Onları da açarak ilgili taşımaları ve isimlendirmeleri yapacağız.

Aşağıdaki komutları gcc-4.7.0 içinde uyguluyoruz, eğer yukarıdaki komutları uyguladıysanız ve dizin değiştirmediyseniz zaten oradasınız demektir. Sırayla uygulayabilirsiniz.

tar xvf ../mpfr-3.1.0.tar.bz2
mv -v mpfr-3.1.0 mpfr
tar xvf ../gmp-5.0.5.tar.xz
mv -v gmp-5.0.5 gmp
tar xvf ../mpc-0.9.tar.gz
mv -v mpc-0.9 mpc


Evet, gereken paketleri gcc-4.70 dizini içine açtık ve isimlerini değiştirdik. Aşağıdaki komutla, /tools altındaki GCC'ye ait olan öntanımlı dinamik bağlayıcı konumunu değiştiriyor ve GCC'nin "include" için arama yolunu düzeltiyormuşuz. Şimdi, aşağıdaki komut topluluğuna bakın fakat hemen uygulamaya geçmeyin. Aşağıda ufak bir açıklama geçiyorum.

for file in \
$(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h)
do
  cp -uv $file{,.orig}
  sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
      -e 's@/usr@/tools@g' $file.orig > $file
  echo '
#undef STANDARD_STARTFILE_PREFIX_1
#undef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
  touch $file.orig
done


Kitapta böyle bol bol komut toplulukları görebiliriz. Burada önemli olan kısım bazı komutların aslında tek satır olması. Bu satırlar \ olarak ayrılmıştır. Mesela yukarıda görülen ilk iki satır aslında tek satırdır. \ ile ayrılan satırlar aslında ayrılmamış olarak algılanır bash tarafından. Komut aslında şöyle:

for file in $(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h)

Fakat kitapta karışıklık olmasın, belki de satır çok uzamasın diye bölerek kullanılmakta. Bazen internet üzerindeki anlatımlarda da bu görülebilir. Satır satır uygulansa da olur bu komut. Fakat, tek tek vermeye gerek yok. Zira bu komut bloğu kopyala yapıştır yapıldığında da iş görecektir. Yukarıdaki bloğu kopyalayıp aynen uçbirime yapıştırın. Yapıştırdıktan sonra görünüm şöyle olmalı:

Alıntı Yapfor file in \
>  $(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h)
> do
>   cp -uv $file{,.orig}
>   sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
>       -e 's@/usr@/tools@g' $file.orig > $file
>   echo '
> #undef STANDARD_STARTFILE_PREFIX_1
> #undef STANDARD_STARTFILE_PREFIX_2
> #define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
> #define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
>   touch $file.orig
> done

Gördüğünüz gibi ilk satırdan sonra > ile devam ediyor. Tek tek yazsanız da aynı şey olacaktı. Son satırdan sonra Enter tuşuna basınca for döngüsü devreye girer ve yapması gerekeni yapar. Çıktısı şöyle olacaktır:


Alıntı Yap`gcc/config/xtensa/linux.h' -> `gcc/config/xtensa/linux.h.orig'
`gcc/config/i386/linux.h' -> `gcc/config/i386/linux.h.orig'
`gcc/config/i386/linux64.h' -> `gcc/config/i386/linux64.h.orig'
`gcc/config/i386/sysv4.h' -> `gcc/config/i386/sysv4.h.orig'
`gcc/config/ia64/linux.h' -> `gcc/config/ia64/linux.h.orig'
`gcc/config/ia64/sysv4.h' -> `gcc/config/ia64/sysv4.h.orig'
`gcc/config/linux.h' -> `gcc/config/linux.h.orig'
`gcc/config/bfin/linux.h' -> `gcc/config/bfin/linux.h.orig'
`gcc/config/cris/linux.h' -> `gcc/config/cris/linux.h.orig'
`gcc/config/vax/linux.h' -> `gcc/config/vax/linux.h.orig'
`gcc/config/s390/linux.h' -> `gcc/config/s390/linux.h.orig'
`gcc/config/mn10300/linux.h' -> `gcc/config/mn10300/linux.h.orig'
`gcc/config/alpha/linux.h' -> `gcc/config/alpha/linux.h.orig'
`gcc/config/tilegx/linux.h' -> `gcc/config/tilegx/linux.h.orig'
`gcc/config/frv/linux.h' -> `gcc/config/frv/linux.h.orig'
`gcc/config/m32r/linux.h' -> `gcc/config/m32r/linux.h.orig'
`gcc/config/m68k/linux.h' -> `gcc/config/m68k/linux.h.orig'
`gcc/config/sh/linux.h' -> `gcc/config/sh/linux.h.orig'
`gcc/config/microblaze/linux.h' -> `gcc/config/microblaze/linux.h.orig'
`gcc/config/tilepro/linux.h' -> `gcc/config/tilepro/linux.h.orig'
`gcc/config/rs6000/linux.h' -> `gcc/config/rs6000/linux.h.orig'
`gcc/config/rs6000/linux64.h' -> `gcc/config/rs6000/linux64.h.orig'
`gcc/config/rs6000/sysv4.h' -> `gcc/config/rs6000/sysv4.h.orig'
`gcc/config/mips/linux.h' -> `gcc/config/mips/linux.h.orig'
`gcc/config/mips/linux64.h' -> `gcc/config/mips/linux64.h.orig'
`gcc/config/sparc/linux.h' -> `gcc/config/sparc/linux.h.orig'
`gcc/config/sparc/linux64.h' -> `gcc/config/sparc/linux64.h.orig'
`gcc/config/sparc/sysv4.h' -> `gcc/config/sparc/sysv4.h.orig'

Eğer bu çıktıyı gördüyseniz işlem tamam demektir. Bu arada yukarıdaki for döngüsü ya da daha genel olarak bash kodları satır satır ayırmadan ; ile de ayrılarak yazılabilir fakat o zaman çok kargacık burgacık bir yazım şekli olur. Hem kitap, hem de genel anlatımlar satır satır yazarak düzeni korurlar.

Evet, gcc için hazırlığı tamamladık. Şimdi derlemeye geçebiliriz. Gcc de kaynak dizin içinde derleme yapmamızı istemiyor, yine bir build dizini oluşturacağız üst dizinde ve oraya geçeceğiz.

mkdir -v ../gcc-build
cd ../gcc-build


Geldik gcc için yapılandırma kısmına. Ben bu aşamada ufak bir deneme daha yapacağım. Yapılandırma yani ./configure, sonrasında make ve make install için zaman tutacağım, fakat bu sefer time ile değil bildiğimiz saat ile :) Maksat, bir önceki pakette elde ettiğim SBU'nun ne kadar doğru olduğunu görmek. Kafanız karışmasın, her bir aşamada süre tutacağım sadece. Eğer SBU'lar tutarsa bu paketin 490 saniyede derlenmesi ve kurulası gerekiyor.

Evet, yapılandırma kısmına geçiyoruz. Aşağıdaki komut bloğunu aynen kopyala yapıştır yapabilirsiniz.

../gcc-4.7.0/configure         \
    --target=$LFS_TGT          \
    --prefix=/tools            \
    --with-sysroot=$LFS        \
    --with-newlib              \
    --without-headers          \
    --with-local-prefix=/tools \
    --with-native-system-header-dir=/tools/include \
    --disable-nls              \
    --disable-shared           \
    --disable-multilib         \
    --disable-decimal-float    \
    --disable-threads          \
    --disable-libmudflap       \
    --disable-libssp           \
    --disable-libgomp          \
    --disable-libquadmath      \
    --enable-languages=c       \
    --with-mpfr-include=$(pwd)/../gcc-4.7.0/mpfr/src \
    --with-mpfr-lib=$(pwd)/mpfr/src/.libs


Dikkat edin, uçbirime yapıştırınca yine her satırın başında > olacak. Sizden son satır için Enter tuşuna basmanızı isteyecek.

Not: Gönül isterdi ki yukarıdaki ayarlamaları kitabın anlattığı şekilde anladığımız kadar size de aktaralım, fakat şimdilik o konu vakit açısından bizi aşıyor. Belki sonra ekleme yapılabilir.

Bende bu adım yaklaşık üç saniye sürdü :) Diğer aşama ile devam edelim ki o da derleme.

make -j2

Not: -j2 çift işlemci içindi, eğer sizde böyle bir durum yoksa normal make yapacaksınız.

Derleme temiz bittiyse:

make install

ile kurulumu tamamlıyoruz. Bende sıkıntı çıkartmadan derlendi ve kuruldu gcc. Üç aşamanın aldığı toplam süre 518 saniye kadardı. Kısacası SBU'muz biraz şaşmış durumda fakat çok fazla fark da yok hani. Yaklaşık 9 dakikalık derlemede 30 saniye makul bir sapma bence.

Evet derleme ve kurulum bittiyse ufak bir pürüzü şu komutla hallediyoruz:

ln -vs libgcc.a `$LFS_TGT-gcc -print-libgcc-file-name | sed 's/libgcc/&_eh/'`

Derleme ve kurulumdan sonra şu komutun çıktısında gcc'yi de görmeniz gerekmekte.

ls /tools/bin/
Alıntı Yapi686-lfs-linux-gnu-addr2line  i686-lfs-linux-gnu-elfedit    i686-lfs-linux-gnu-gcc-ranlib  i686-lfs-linux-gnu-nm       i686-lfs-linux-gnu-size
i686-lfs-linux-gnu-ar         i686-lfs-linux-gnu-gcc       i686-lfs-linux-gnu-gcov      i686-lfs-linux-gnu-objcopy  i686-lfs-linux-gnu-strings
i686-lfs-linux-gnu-as         i686-lfs-linux-gnu-gcc-4.7.0  i686-lfs-linux-gnu-gprof      i686-lfs-linux-gnu-objdump  i686-lfs-linux-gnu-strip
i686-lfs-linux-gnu-c++filt    i686-lfs-linux-gnu-gcc-ar     i686-lfs-linux-gnu-ld      i686-lfs-linux-gnu-ranlib
i686-lfs-linux-gnu-cpp         i686-lfs-linux-gnu-gcc-nm     i686-lfs-linux-gnu-ld.bfd      i686-lfs-linux-gnu-readelf

Bir önceki pakette farklı bir dizin vermiştik, aslen bu verdiğimiz dizini takip etmemiz daha makul zira derleme ile oluşan tüm paketleri görebiliyoruz burada. Sadece gcc değil, diğer paketler de yavaş yavaş buraya yerleşiyor.

Son olarak derlemede kullandığımız dizinleri silebiliriz.

cd $LFS/sources
rm -rf gcc-build/ gcc-4.7.0



Derlemeler için genel bilgiler

Paket derlemelerine ara verip bir iki şeyin üzerinden geçelim. Belki yapıyı anladınız belki anlamadınız fakat aslında paket derlemeleri çok zor bir hadise değil. Temel mantık kabaca şu şekilde yürüyor.

1. $LFS/source dizininde olduğuna emin ol.
2. Paketi aç:
3. Açtığın dizine düş:
4. Varsa yamasını yap.
5. Varsa ek ayarlamalarını yap.
6. Eğer kendi dizin içinden derlenmeyecekse bir üst dizinde build dizinini oluştur ve o dizine geç. Eğer gerek yoksa kaynak dizin içinde kal.
7. ./configure ve parametreleri ile yapılandırmayı yap.
8. make ile derle.
9. make install ile kur.
10. Gerekiyorsa son düzeltmeleri yap.

Kabaca on adım kısacası. Kitap zaten hemen her adımı anlatıyor. Es geçtiği tek yer, pakete ait arşivin açılması ve o dizine düşülmesi. Onu kullanıcıların yapacağını varsayıyor. Bense yine de o aşamaları veriyorum.

Kısacası bir şeylerin ters gittiğini düşünüyorsanız önce bu adımları denetlemenizde fayda var. Bundan sonraki paket derlemelerinde işi daha çabuklaştıracağız, gerekli olmayan kısımlara hiç girmeyeceğiz.
Hayattan çıkarı olmayanların, ölümden de çıkarı olmayacaktır.
Hayatlarıyla yanlış olanların ölümleriyle doğru olmalarına imkân var mıdır?


Böylece yalan, dünyanın düzenine dönüştürülüyor.

heartsmagic

Linux-3.3.6 API Headers

Alıntı YapSBU: 0.1
Disk alanı: 511MB

Bu bölümde derleme yapılmayacak. Linux çekirdeğinden Glibc için bazı API'ler çıkartıp bizim dizinimize kopyalatacağız sadece. Aynen aşağıdaki komutları uygulayabilirsiniz.

cd $LFS/sources
tar xvf linux-3.3.6.tar.xz
cd linux-3.3.6
make mrproper
make headers_check
make INSTALL_HDR_PATH=dest headers_install
cp -rv dest/include/* /tools/include
cd ..
rm -rf linux-3.3.6


Böylece Linux çekirdeğini arşivden çıkarttık, istediğimiz dosyaları oluşturttuk ve kendi /tools dizinimize kopyalattık. Ardından da açtığımız arşivi sildik.


Glibc-2.15

Alıntı YapSBU: 5.5
Disk alanı: 501MB

Evet, sıra geldi Glibc paketine. Ara ara hatırlatmakta fayda var, derlemeleri lfs kullanıcısıyla yapıyorduk.

cd $LFS/sources
tar xvf glibc-2.15.tar.xz
cd glibc-2.15


sources dizinimize geçtik, glibc paketini açtık ve açtığımız dizine geçtik. Glibc derlenmeden önce ufak tefek sournların düzeltilmesi ve bir yama yapılması gerekiyormuş, yapalım.

sed -i 's#$ac_includes_default#\n\n#' sysdeps/i386/configure
sed -i 's#/var/db#/tools/var/db#' Makeconfig
patch -Np1 -i ../glibc-2.15-gcc_fix-1.patch


Glibc kendi dizininde derlemeyi önermiyormuş, yine bir build dizini oluşturacağız yukarıda.

mkdir -v ../glibc-build
cd ../glibc-build


Glibc artık i386 serili işlemciler için destek vermiyormuş. Bu seri çok gerilerde kaldı, fakat ola ki o kadar eski bir sistemde derleme yapacak olanlar şunu uygulasınlar:

case `uname -m` in
  i?86) echo "CFLAGS += -march=i486 -mtune=native" > configparms ;;
esac


Not: Yukarıdaki işlem yeni makine sahipleri için uygulanmamalıdır.


Derleme için yapılandırmayı halledelim. Fakat öncesinde bir şeyi belirtelim. Kitap burada şöyle bir uyarı alabileceğimizi söylüyor:

Alıntı Yapconfigure: WARNING:
*** These auxiliary programs are missing or
*** incompatible versions: msgfmt
*** some features will be disabled.
*** Check the INSTALL file for required versions.

msgmft'nin olmamasını pek önemsemiyor kitap. Bendeki yapılandırmada bu hata çıkmadı zira sistemimde msgmft'yi sağlayan gettext paketi kurulu. Hani olmasa da kitabın söylediği gibi önemi olmayabilir.

Fakat, bende başka bir uyarı belirdi yapılandırma esnasında:

Alıntı Yapconfigure: WARNING:
*** These auxiliary programs are missing or incompatible versions: makeinfo
*** some features will be disabled.
*** Check the INSTALL file for required versions.


Haliyle bu da bir uyarı, pek sorun yapmılmasa da olur. makeinfo denilen uygulamayı da texinfo sağlıyormuş. Küçük ve tek başına gelen bir paket olduğu için ben kurdum kullandığım dağıtım üzerinde.


Evet, yapılandırmayı halletmek için şunu yürütüyoruz:


../glibc-2.15/configure                             \
      --prefix=/tools                                 \
      --host=$LFS_TGT                                 \
      --build=$(../glibc-2.15/scripts/config.guess) \
      --disable-profile                               \
      --enable-add-ons                                \
      --enable-kernel=2.6.25                          \
      --with-headers=/tools/include                   \
      libc_cv_forced_unwind=yes                       \
      libc_cv_ctors_header=yes                        \
      libc_cv_c_cleanup=yes



Ardından da paketimizi derliyoruz:

make -j2

Not: -j2 çift işlemci içindi, eğer sizde böyle bir durum yoksa normal make yapacaksınız.


Bende derleme yaklaşık olarak dokuz dakika sürdü, iki dakika da kurulum için aldı. Yine SBU'muza hemen hemen uymakta. 2-2,5 dakikalık fark gayet normal ki bu arada ben epostalarıma bakmak, youtube'dan bir şeyler dinlemek, hatta sisteme bir şeyler kurmak, forumu denetlemek gibi işlerimi de yapıyordum.

Derleme bittiği için kurabiliriz glibc'yi.

make install

Bu aşamada glibc'nin güzelce derlendiğini, kurulduğunu ve çalıştığını denetlememiz lazım. Bunun için basit bir C derlemesi yaptırıyor kitap bize.

echo 'main(){}' > dummy.c
$LFS_TGT-gcc dummy.c
readelf -l a.out | grep ': /tools'


Yukarıdaki komutların ilk ikisi çıktı vermeyecek, sonuncusu ise bir çıktı verecek bize. O çıktının da şöyle olması gerekiyor:

Alıntı Yap[Requesting program interpreter: /tools/lib/ld-linux.so.2]

Eğer bu çıktıyı alamıyorsak veya yukarıdaki işlemlerde bir hata olduysa glibc sorunlu demektir.

Not: Yukarıdaki çıktıdaki /tools/lib 64bit sistemlerde /tools/lib64 olabilir.

Glibc'nin derlenmesi başarılı bir şekild bittiyse geçici dizinlerimizi silebiliriz.

cd $LFS/sources
rm -rf glibc-2.15/ glibc-build/



Binutils-2.22 - Aşama 2


Alıntı YapSBU: 1.1
Disk: 363

Fark etmişsinizdir, daha önce Binutils'i derleyip kurmuştuk. Bu ikinci aşamada kendisini bir iki bölüm önce derlediğimiz kendi gcc'miz ile derleyeceğiz. Malum elimizde artık kendi mahsulümüz olan bir gcc var. Binutils'i onun elinden geçireceğiz bu aşamada, kullandığımız dağıtıma ait olan hazır derlenmiş gcc ile değil yani. Belki de ilk defa LFS inşa etme hissini burada edineceksiniz, zira kendi derlediğiniz gcc ile başka paketleri derlemeye başladınız bile.

İlgili dizinimize geçelim ve paketimizi açalım, dizine düşelim. Ardından yamamızı yapalım ve binutils'i derlemek için geçici build dizinimizi oluşturalım. Sonra da o dizin üzerinden derlemeyi yapalım.

cd $LFS/sources
tar xvf binutils-2.22.tar.bz2
cd binutils-2.22
patch -Np1 -i ../binutils-2.22-build_fix-1.patch
mkdir -v ../binutils-build
cd ../binutils-build


Buraya kadar her şey bir önceki binutils derlemesi ile aynı görebileceğiniz. üzere. Fakat aşağıdaki yapılandırma komutuna bakarsanız artık bizim mahsülümüz olan gcc'nin kullanıldığını göreceksiniz: CC=$LFS_TGT-gcc

CC=$LFS_TGT-gcc            \
AR=$LFS_TGT-ar             \
RANLIB=$LFS_TGT-ranlib     \
../binutils-2.22/configure \
    --prefix=/tools        \
    --disable-nls          \
    --with-lib-path=/tools/lib




Yapılandırmadan sonra derlemeye geçebiliriz.

make -j2

Not: -j2 çift işlemci içindi, eğer sizde böyle bir durum yoksa normal make yapacaksınız.


Eğer sorun çıkmadıysa kendi ürünümüz olan gcc iyi iş çıkartmış demektir. Şimdi derlediğimiz binutils paketlerini kuralım.

make install

Bu aşamada bir sonraki gcc derlemesi için bazı temizlik ayarlamalar yapıyoruz.

make -C ld clean
make -C ld LIB_PATH=/usr/lib:/lib
cp -v ld/ld-new /tools/bin



Ardından geçici paketlerimizi silerek bu aşamayı tamamlıyoruz:

rm -rf binutils-2.22/ binutils-build/
Hayattan çıkarı olmayanların, ölümden de çıkarı olmayacaktır.
Hayatlarıyla yanlış olanların ölümleriyle doğru olmalarına imkân var mıdır?


Böylece yalan, dünyanın düzenine dönüştürülüyor.

heartsmagic

#4
GCC-4.7.0 - Aşama 2

Alıntı YapSBU: 7.0
Disk: 1.5GB

Evet geldik GCC'mizi ikinci kez derlemeye.

cd $LFS/sources
tar xvf gcc-4.7.0.tar.bz2
cd gcc-4.7.0


İlk derlememizde bazı sistem başlıkları eksik durumdaydı ve bu bizim GCC'mizin eksik başlıklarla iş görmesine neden oluyordu. Kitapta bahsi geçen bu başlığımız limits.h. Bu eksiği gidermek için aşağıdaki işlemi yapıyoruz. Hani bu konuları ben de bilmiyorum :) Uzun uzun ne neymiş diye bakmak da ne yazık ki şu an mümkün değil.

cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
  `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include-fixed/limits.h


Şimdi, bir değişikik daha yapılacak fakat sadece X86 sistemlerde, yani 32bit'lik sistemlerde. Aslında kitap burada "X86 machines" diyor. Eğer bu donanımsal bir ifade ise ben yanlış yoldayım demektir :) Zira bu ifadeyi sürekli x86 sistemler olarak algılıyor ve yoluma böyle devam ediyorum. Bunu da şu nedenle düşündüm, kitap LFS_TGT değişkenini benim uname çıktımdan aldı ve i686-lfs-linux-gnu yaptı. 64bitlik sistemlerde de bu 64bit'e göre isimlendirildi. Demek ki önemli olan donanımsal mimari değil, sistemin ne olduğu. Zaten LFS'yi haliyle kullandığımız sistemde yaptığımız için paketlerimiz de o mimariye, yani işletim sisteminin kullandığı mimariye uygun oluyor diye düşünüyorum. Eğer yanlış yoldaysam hem ben hem de varsa eğer bu anlatımı takip edenler yanmış olacak :)

32bit'lik sistemlerde yapanlar şu iki komutu uyguluyor:

cp -v gcc/Makefile.in{,.tmp}
sed 's/^T_CFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in.tmp \
  > gcc/Makefile.in


Bu aşamadan sonra ortak devam ediyoruz:

Dinamik bağlayıcımızın yerini yine /tools dizinindeki olarak değiştiriyoruz:

for file in \
$(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h)
do
  cp -uv $file{,.orig}
  sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
  -e 's@/usr@/tools@g' $file.orig > $file
  echo '
#undef STANDARD_STARTFILE_PREFIX_1
#undef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
  touch $file.orig
done


İlk derlemedeki gibi derleme için ihtiyacımız olan bazı paketleri açıp taşıyoruz:

tar -jxf ../mpfr-3.1.0.tar.bz2
mv -v mpfr-3.1.0 mpfr
tar -Jxf ../gmp-5.0.5.tar.xz
mv -v gmp-5.0.5 gmp
tar -zxf ../mpc-0.9.tar.gz
mv -v mpc-0.9 mpc



GCC dışarıda derlemesini istiyor bizden kendisini:

mkdir -v ../gcc-build
cd ../gcc-build


Yapılandırmayı başlatıyoruz:

CC=$LFS_TGT-gcc \
AR=$LFS_TGT-ar                  \
RANLIB=$LFS_TGT-ranlib          \
../gcc-4.7.0/configure          \
    --prefix=/tools             \
    --with-local-prefix=/tools  \
    --with-native-system-header-dir=/tools/include \
    --enable-clocale=gnu        \
    --enable-shared             \
    --enable-threads=posix      \
    --enable-__cxa_atexit       \
    --enable-languages=c,c++    \
    --disable-libstdcxx-pch     \
    --disable-multilib          \
    --disable-bootstrap         \
    --disable-libgomp           \
    --with-mpfr-include=$(pwd)/../gcc-4.7.0/mpfr/src \
    --with-mpfr-lib=$(pwd)/mpfr/src/.libs


Eğer her şey yolundaysa derliyoruz:

make -j2

Not: -j2 çift işlemci içindi, eğer sizde böyle bir durum yoksa normal make yapacaksınız.


Eğer derleme sorunsuz gittiyse kurulumu yapıyoruz:

make install

Bu aşamada bir sembolik bağ oluşturuyoruz:

ln -vs gcc /tools/bin/cc

GCC'mizin çalışıp çalışmadığını denetliyoruz yine ilk seferde olduğu gibi:

echo 'main(){}' > dummy.c
cc dummy.c
readelf -l a.out | grep ': /tools'


Şu şekilde bir çıktı almamız gerekiyor:

Alıntı Yap[Requesting program interpreter: /tools/lib/ld-linux.so.2]

64bit sistemlerde biraz değişebilir çıktı. Eğer çok farklı bir şey aldıysanız veya hata döndürdüyse ortada bir sorun var demektir. Eğer her şey yolundaysa bir sonraki paket için yolumuza devam ediyoruz. Tabi temizlik yapmayı unutmuyoruz.

cd $LFS/sources
rm -rf gcc-4.7.0 gcc-build



Tcl-8.5.11

Alıntı YapSBU: 0.3
Disk: 33MB

TCL ve sıradaki üç paket (Expect, DejaGNU ve Check) GCC, binutils ve diğer paketlerin test takımlarını yürütmek için gerekliler. Bu bölümde aslında bizler test takımlarını kullanmıyoruz zira gerekli değiller. Çünkü şu an LFS'miz geçici bir konumda. Bir sonraki bölümde asıl LFS'mizi inşaa ederken sürekli elimiz bu test takımlara gidecek.

cd $LFS/sources
tar xvf tcl8.5.11-src.tar.gz
cd tcl8.5.11
cd unix
./configure --prefix=/tools
make -j2


Not: -j2 çift işlemci içindi, eğer sizde böyle bir durum yoksa normal make yapacaksınız.

Eğer derleme başarılıysa kuruluma geçebiliriz. Kitap burada deneme takımından bahsetmiş, gerekli değil ama isterseniz yapabilirsiniz demiş. Ben atlıyorum ve kuruluma geçiyorum.

make install

İlerideki bir temizlik için kurulan kütüphaneyi yazılabilir yapıyoruz:

chmod -v u+w /tools/lib/libtcl8.5.so

Expect paketi için başlıkları kurduruyoruz:

make install-private-headers

Bir adet de sembolik bağ yapıyoruz:

ln -sv tclsh8.5 /tools/bin/tclsh

Böylece TCL paketimiz de bitiyor, sonraki paketimize geçmeden önce temizlik yapıyoruz.

cd $LFS/sources
rm -rf tcl8.5.11/



Expect-5.45


Alıntı YapSBU: 0.1
Disk: 4.1 MB

cd $LFS/sources
tar xvf expect5.45.tar.gz
cd expect5.45


LFS yapılan sistemde /usr/local/bin/stty olması ihtimaline karşı (bende yoktu gerçi) şunlar yapıyoruz:

cp -v configure{,.orig}
sed 's:/usr/local/bin:/bin:' configure.orig > configure


Ardından derleme için yapılandırmayı hallediyoruz:

./configure --prefix=/tools --with-tcl=/tools/lib \
  --with-tclinclude=/tools/include


Her şey yolundaysa derlemeye geçiyoruz.

make -j2

Not: -j2 çift işlemci içindi, eğer sizde böyle bir durum yoksa normal make yapacaksınız.

Yinde deneme takımlarını yürütmüyor ve doğrudan kuruluma gidiyorum.

make SCRIPTS="" install

Temizlik yapıyoruz:

cd $LFS/sources
rm -rf expect5.45



DejaGNU-1.5

Alıntı YapSBU: 0.1
Disk: 6.1 MB

cd $LFS/sources
tar xvf dejagnu-1.5.tar.gz
cd dejagnu-1.5
./configure --prefix=/tools
make install


Derleme ve kurulum bu kadar. Ayrı bir make aşaması yok, ikisi bir arada olmakta. Temizlik yapabiliriz.

cd $LFS/sources
rm -rf dejagnu-1.5


Check-0.9.8

Alıntı YapSBU: 0.1
Disk: 4.8 MB

cd $LFS/sources
tar xvf check-0.9.8.tar.gz
cd check-0.9.8
./configure --prefix=/tools
make -j2
make install


Not: -j2 çift işlemci içindi, eğer sizde böyle bir durum yoksa normal make yapacaksınız.


Bu paketin de derlenmesi çok kolay. Eğer her şey sorunsuzsa temizlik yapabiliriz.

cd $LFS/sources
rm -rf check-0.9.8



Ncurses-5.9

Alıntı YapSBU: 0.7
Disk: 30MB

cd $LFS/sources
tar xvf ncurses-5.9.tar.gz
cd ncurses-5.9
./configure --prefix=/tools --with-shared \
    --without-debug --without-ada --enable-overwrite
make -j2
make install


Gördüğünüz gibi Ncurses paketinin derlemesi de son derece kolay. İşler yolundaysa temizlik yapalım. Bu aşamadan sonra make -j2 uyarısını yapmayacağım, çok zahmetli oluyor :)

cd $LFS/sources
rm -rf ncurses-5.9



Bash-4.2

Alıntı YapSBU: 0.5
Disk: 35MB

Geldik kendi kabuğumuzu yani Bash'i derlemeye.


cd $LFS/sources
tar xvf bash-4.2.tar.gz
cd bash-4.2


Bir yama yapıp derlemeye geçiyoruz.

patch -Np1 -i ../bash-4.2-fixes-7.patch

Fakat bu bende hata döndürdü şöyle ki:
Alıntı Yappatch: **** Can't open patch file ../bash-4.2-fixes-7.patch : No such file or directory

İlgili yamayı bulamıyorum dedi. Baktım bende şu yama varmış:
Alıntı Yapbash-4.2-fixes-6.patch

wget-list dosyasında da bu tanımlıymış:

grep bash wget-list
Alıntı Yaphttp://ftp.gnu.org/gnu/bash/bash-4.2.tar.gz
http://www.linuxfromscratch.org/patches/lfs/development/bash-4.2-fixes-6.patch

Haliyle tutup yamanın 6 sayılı sürümünü indirtmişler bize. Demek ki ortalık az karışmış orada. Biz doğru sürümü indiriyoruz.

cd $LFS/sources
wget http://www.linuxfromscratch.org/patches/lfs/development/bash-4.2-fixes-7.patch


Sonra tekrar deniyoruz yamayı:
cd bash-4.2
patch -Np1 -i ../bash-4.2-fixes-7.patch


Bende sorun yapmadı, devam ettim. Yapılandırmayı hallediyoruz derleme için:

./configure --prefix=/tools --without-bash-malloc

Ardından derleme yapıyoruz. Fakat derleme aşamasında şu hatayı verdi:

Alıntı Yapyacc -d ./parse.y make:
yacc: Command not found

yacc gerekiyormuş, Ubuntu üzerinde byacc paketi sağlıyormuş kendisini. Kurdum diğer kullanıcımla, sonra yoluma devam ettim.

make -j2
make install
ln -vs bash /tools/bin/sh


Böylece Bash de derlenip kurulmuş oldu. Temizlik yapalım.

cd $LFS/sources
rm -rf bash-4.2



Bzip2-1.0.6

Alıntı YapSBU: 0.1
Disk: 4.8MB

Bzip'in derlenmesi çok kolay.

cd $LFS/sources
tar xvf bzip2-1.0.6.tar.gz


Her ne hikmetse bizde bu sürüm için bir de yama varmış, fakat kitap yamadan bahsetmiyor. Ben yapmayı tercih ettim.

cd bzip2-1.0.6
patch -Np1 -i ../bzip2-1.0.6-install_docs-1.patch


Yama ters tepmedi, demek ki işlenmemiş. Zaten sürümler tutuyor. Derleyip kurdum.

make -j2
make PREFIX=/tools install


Sorunsuzca derlendi ve kuruldu. Temizlik yapalım.

cd $LFS/sources
rm -rf bzip2-1.0.6



Coreutils-8.17


Alıntı YapSBU: 0.7
Dİsk: 88MB

cd $LFS/sources
tar xvf coreutils-8.17.tar.xz
cd coreutils-8.17


Bu pakette de yama var ama kitap değinmiyor. Acaba diyorum kendi kendime, başka paketlerde de vardı da görmemiş olabilir miyiz? :) Neyse, varsa da arada kaçtı şimdilik. Bunu da yamalamayı deneyelim.

patch -Np1 -i ../coreutils-8.17-i18n-1.patch

Yama mızıldanmadı, devam edelim.


./configure --prefix=/tools --enable-install-program=hostname
make -j2
make install
cp -v src/su /tools/bin


Eğer her şey yolunda gittiyse temizlik yapalım.

cd $LFS/sources
rm -rf coreutils-8.17



Bu anlatımda bir hayli yol kat ettik. Eğer bir sonraki anlatımda da bu kadar hızlı gidebilirsek ilk bölümü tamamlamış oluruz.
Hayattan çıkarı olmayanların, ölümden de çıkarı olmayacaktır.
Hayatlarıyla yanlış olanların ölümleriyle doğru olmalarına imkân var mıdır?


Böylece yalan, dünyanın düzenine dönüştürülüyor.

heartsmagic

Diffutils-3.2

Alıntı YapSBU: 0.1
Disk: 6.1MB

cd $LFS/sources
tar xvf diffutils-3.2.tar.gz
cd diffutils-3.2
./configure --prefix=/tools
make -j2
make install



Kurulum bu kadar basit :) Temizlik yapalım.

cd $LFS/sources
rm -rf diffutils-3.2


File-5.11

Alıntı YapSBU: 0.2
Disk: 9.5MB

cd $LFS/sources
tar xvf file-5.11.tar.gz
cd file-5.11


Aşamalar Diffutils ile çok benzer.

./configure --prefix=/tools
make -j2
make install
cd $LFS/sources
rm -rf file-5.11



Findutils-4.4.2

Alıntı YapSBU: 0.3
Disk: 20MB

cd $LFS/sources
tar xvf findutils-4.4.2.tar.gz
cd findutils-4.4.2


İşlemler yine aynı.

./configure --prefix=/tools
make -j2
make install
cd ..
rm -rf findutils-4.4.2


Artık karıştırılmaz sanırım cd $LFS/sources olayı :) Doğrudan cd .. dedim, sabrım buraya kadarmış :)


Gawk-4.0.1

Alıntı YapSBU: 0.2
Disk: 28MB

İşlemler yine aynı.

cd $LFS/sources
tar xvf gawk-4.0.1.tar.xz
cd gawk-4.0.1
./configure --prefix=/tools
make -j2
make install
cd ..
rm -rf gawk-4.0.1



Gettext-0.18.1.1

Alıntı YapSBU: 0.8
Disk: 82MB

cd $LFS/sources
tar xvf gettext-0.18.1.1.tar.gz
cd gettext-0.18.1.1


Derleme için yapılandırmayı halledelim.

cd gettext-tools
EMACS="no" ./configure --prefix=/tools --disable-shared


Ardından derleyelim.

make -j2 -C gnulib-lib
make -j2 -C src msgfmt


Sonra da ortaya çıkan msgfmt ikilik dosyamızı kuralım, yani kopyalayalım.

cp -v src/msgfmt /tools/bin

Kurulum bu kadar temizlik yapabiliriz.

cd $LFS/sources
rm -rf gettext-0.18.1.1




Grep-2.12

Alıntı YapSBU: 0.2
Disk: 18MB

cd $LFS/sources
tar xvf grep-2.12.tar.xz
cd grep-2.12


Kolay bir kurulumu var:

./configure --prefix=/tools --disable-perl-regexp
make -j2
make install
cd ..
rm -rf grep-2.12



Gzip-1.4

Alıntı YapSBU: 0.1
Disk: 3.3MB

cd $LFS/sources
tar xvf gzip-1.4.tar.gz
cd gzip-1.4
./configure --prefix=/tools
make -j2
make install
cd ..
rm -rf gzip-1.4


Artık bu paket gibi derlemesi basit olanları hızlı hızlı geçtiğimi fark etmişsinizdir.


M4-1.4.16

Alıntı YapSBU: 0.2
Disk: 11.6MB

cd $LFS/sources
tar xvf m4-1.4.16.tar.bz2
cd m4-1.4.16
./configure --prefix=/tools
make -j2
make install
cd ..
rm -rf m4-1.4.16



Make-3.82

Alıntı YapSBU: 0.1
Disk: 9.6MB

cd $LFS/sources
tar xvf make-3.82.tar.bz2
cd make-3.82
./configure --prefix=/tools
make -j2
make install
cd ..
rm -rf make-3.82



Patch-2.6.1

Alıntı YapSBU: 0.1
Disk: 1.9MB

cd $LFS/sources
tar xvf patch-2.6.1.tar.bz2
cd patch-2.6.1


Yine elimizde kitabın bahsetmediği bir yamamız var. Ben yapmayı uygun gördüğüm için bu yamaları devam ediyorum.

Not: Gerçi yama deneme takımı ile ilgili gibi duruyor. Bu bölümde deneme takımlarını kullanmadığımız için yampaya gerek olmayabilir. Hatta bu şekilde uyandığım üzere yamaların bu bölümde gerekli olmadıklarını da anlamış bulunuyoruz :) Önceki paketlerde de ihtiyacımız yokmuş anlamına geliyor bu. Yama iyidir, zararı olmaz diyerek kendimizi avutuyoruz :) Kısacası kitabı takip etmek lazımmış :) Ben yapmış bulundum yamayı, isteyen yapmayabilir.


patch -Np1 -i ../patch-2.6.1-test_fix-1.patch
./configure --prefix=/tools
make -j2
make install
cd ..
rm -rf patch-2.6.1



Perl-5.16.0

Alıntı YapSBU: 1.8
Disk: 223MB

cd $LFS/sources

Burada bir değişiklik yapıyoruz. Başlığımızın ilk iletisinde Perl için kararlı sürümün 5.14 olduğunu söylemiştik ama biz başladıktan üç gün sonra 5.16 sürümü çıkmış. Kitap da kendini güncellemiş haliyle. Hem Perl'in son sürümünü hem de güncel sürüm için olan yamayı indirelim. Eğer bu yazıyı okuduğunuz şu sıralarda paketleri daha önceden indirmediyseniz aşağıdaki wget içeren işlemleri yapmanıza gerek yok. Zira yeni hazırlanan listeye eklemişler LFS'ci arkadaşlar bu paketleri.

wget http://www.cpan.org/src/5.0/perl-5.16.0.tar.gz
wget http://www.linuxfromscratch.org/patches/lfs/development/perl-5.16.0-libc-2.patch


Devam edelim.

tar xvf perl-5.16.0.tar.gz
cd perl-5.16.0
patch -Np1 -i ../perl-5.16.0-libc-2.patch


Tamam, tamam bu yama gerekli, kitapta da geçiyor :D

Yapılandırık derleyelim.

sh Configure -des -Dprefix=/tools
make -j2


Bu aşamada derlenen uygulamalardan sadece bazıları gerekliymiş bize, kopyalayalım onları.

cp -v perl cpan/podlators/pod2man /tools/bin
mkdir -pv /tools/lib/perl5/5.16.0
cp -Rv lib/* /tools/lib/perl5/5.16.0


Temizlik yapalım.

cd ..
rm -rf perl-5.16.0



Sed-4.2.1

Alıntı YapSBU: 0.1
Disk: 8MB

cd $LFS/sources
tar xvf sed-4.2.1.tar.bz2
cd sed-4.2.1
./configure --prefix=/tools
make -j2
make install
cd ..
rm -rf sed-4.2.1



Tar-1.26

Alıntı YapSBU: 0.3
Disk: 20.9MB

cd $LFS/sources
tar xvf tar-1.26.tar.bz2
cd tar-1.26
./configure --prefix=/tools
make -j2
make install
cd ..
rm -rf tar-1.26




Texinfo-4.13a

Alıntı YapSBU: 0.2
Disk: 20MB

cd $LFS/sources
tar xvf texinfo-4.13a.tar.gz
cd texinfo-4.13
./configure --prefix=/tools
make -j2
make install
cd ..
rm -rf texinfo-4.13



Xz-5.0.3

Alıntı YapSBU: 0.3
Disk: 14MB

cd $LFS/sources
tar xvf xz-5.0.3.tar.bz2
cd xz-5.0.3
./configure --prefix=/tools
make -j2
make install
cd ..
rm -rf xz-5.0.3




Evet, ilk bölüm için paketlerimiz bitti. Bu demektir ki geçici LFS ortamımız için gerekli olan paketlerimizi derlemeyi bitirdik. Eğer buraya kadar derleme ve kurulumları tamamlayabildiyseniz geçici LFS ortamımızı şimdilik hazır demektir. Tabi bizim görmediğimiz, farkında olmadığımız bir sorun olmamasını umuyoruz. Bu bölümü sonlandırmadan önce yapmamız gereken bir iki şey daha var.


Kazıma/Temizlik İşlemi

Kitap buna "stripping" diyor. Geçici olarak oluşturduğumuz ortamdaki çalışabilen dosyalar ve kütüphaneler bizim için artık gereksiz olan ayıklama sembollerine sahiplermiş, temizleyelim.

strip --strip-debug /tools/lib/*
strip --strip-unneeded /tools/{,s}bin/*


Bu temizlik komutlarının "File format not recognized" ve bazı diğer uyarıları vermesi normal. Yaklaşık 70MB yer kazanıyormuşuz :)

Bir diğer temizlik yapabileceğimiz şeyse belgelendirmeler.

rm -rf /tools/{,share}/{info,man,doc}

Toplamda 850MB yer kazanıyormuşuz? Gerekli mi bu temizlik? Aslında değil, isteyen yapar. LFS için çok fazla yere zaten gerek yok, diskimiz dolmayacaktır. Fakat ileride BLFS yapacaklar için gerek olabilir.


Evet, geçici LFS inşamızı tamamladık. Şu aşamada $LFS/tools dizinimizin sahipliğini lfs kullanıcısından alıyoruz. Zira bu kullanıcı bizim inşa ettiğimiz sistem üzerinde tanımlı değil, LFS'yi yaptığımız sistem üzerinde tanımlı. Buraya dikkat, LFS'yi inşa etttiğimiz kendi sistemimizde root olacağız ve bir iki işlem yapacağız. Tekrar ediyorum, LFS'yi yaptığımız sistemde yapacağız bunu, yani kullandığınız esas dağıtım neyse orada. Ben Ubuntu üzerinden anlatmaya devam ediyorum.

Öncekikle lfs yaptığımız kullanıcıyı terk edin. Bunu basitçe exit yazarak yapabilirsiniz.

exit

Şu an kendi sisteminizde olmalısınız. root'a geçiş yapalım.

sudo -i

Bu şekilde root'a geçiş yapmış oluyoruz. Şimdi root için LFS değişkenini tanımlayalım.
Önce bir denetleyelim:

whoami
pwd


İlk komutun root, ikinci komutun /root çıktısını vermesi lazım. Aksi takdirde root olamamışsınız demektir. Eğer her şey yolundaysa şunu uygulayın.


cat >> .bashrc << "EOF"
LFS=/media/lfs
export LFS
EOF


Böylece root kullanımıza LFS değişkenini tanımlamış olduk. Bir sonraki girişimizde etkin olacak. Şu an etkin kılmak için hemen şu komutu uyguluyoruz:

source .bashrc

Bu aşamadan sonra

echo $LFS

komutunun bize /media/lfs çıktısını vermesi lazım. Eğer böyleyse izinlerimizi değiştirelim.

chown -R root:root $LFS/tools


Şu komutla denetleyelim:

ls -ld $LFS/tools

Bize şuna benzer bir çıktı vermesi lazım:

Alıntı Yapdrwxr-xr-x 12 root root 4096 Haz  7 00:19 /media/lfs/tools


Kitap burada şu hatırlatmayı yapıyor. İlerideki farklı LFS'ler için geçici araçları saklamak istiyorsak bunu şu an yapmalıyız. Kısacası varsa düşünen farklı LFS'ler ya da bu aşamadan tekrar deneyecek olan tools dizinini yedekleyebilir. Zira bir sonraki bölümde bu araçlar değişecek.


Bu aşamadan sonra artık sistemdeki lfs kullanıcısı ile işimiz kalmıyor. Kendi LFS inşamız için root kullanıcısı ile mini sistemimize chroot yapacağız. Daha farklı bir sürece başlıyoruz kısacası. Bu nedenle anlatımı burada bırakıp, biraz ara vermenin zamanı geldi.
Hayattan çıkarı olmayanların, ölümden de çıkarı olmayacaktır.
Hayatlarıyla yanlış olanların ölümleriyle doğru olmalarına imkân var mıdır?


Böylece yalan, dünyanın düzenine dönüştürülüyor.