Ozan Şelte
Mühendis Adayı


LFS 1 - Geçici Sistem Oluşturma
9 Ağustos 2015 - Linux

Sıra geçici sistemi oluşturup derlemeye geldi. Geçici sistem bizim asıl LFS sistemimizin içindeki programları yani aslında LFS sisteminin kendisini derleyeceğimiz araçlardan oluşuyor. Önce geçici sistemi oluşturacak sonra o sistemin içine girip asıl sistemi oluşturacağız. Şimdi derlenecek dosyalarımızı indirip bunları derlemeye başlayabiliriz. Önce kaynak kodlarımızı indireceğiz ki bu konuda bize kolaylık olsun diye liste yapmışlar wget hemen halledecek. Sonra da bunları doğrulayacağız, isteyen doğrulamayabilir ama sonuçta sistem derliyoruz ve hatalı bir şey olursa sonra diğerleri de derlenmez, işin içinden çıkamayız. İlk olarak asıl sistemi derleyecek olan geçici sistem programlarını derleyeceğiz. Emin olun çok zevkli.

Paketleri hazırlamak

  • İlk olarak $LFS klasörümüze giriyoruz. Tabii ki önceden mount ettiniz bunları konuşmayalım.
  • Başkaları dokunmasın diye klasör yetkilerini düzenliyoruz.
  • Kaynak kodlarımızı indiriyoruz.
  • İndirdiğimiz paketleri md5sum ile kontrol ediyoruz.
1
2
3
4
5
6
7
8
9
cd $LFS
mkdir -v $LFS/sources
chmod -v a+wt $LFS/sources
wget http://www.linuxfromscratch.org/lfs/view/stable/wget-list
wget --input-file=wget-list --continue --directory-prefix=$LFS/sources
cd $LFS/sources
wget http://www.linuxfromscratch.org/lfs/view/stable/md5sums
md5sum -c md5sums
cd $LFS

Evet. İndirdik, düzenledik, açtık, kontrol ettik. Açılışımız güzel oldu. Sıra geldi diğer klasörümüzü oluşturmaya. Bu bizim paketleri derleyeceğimiz klasör olacak onun için kök klasörümüze sembolik köprü oluşturacağız.

1
2
mkdir -v $LFS/tools
ln -sv $LFS/tools /

Kullanıcı oluşturmak

Şu ana kadar her şeyi root olarak yaptık. Fakat artık iş derlemeye ve kurmaya geldi. Yapacağımız bir hata kendi kullandığımız sisteme zarar verebilir. Bu konuda herkesin düşüneceği gibi gurularımız yeni bir grup ve kullanıcı oluşturmayı uygun görmüşler.

1
2
3
4
5
6
groupadd lfs
useradd -s /bin/bash -g lfs -m -k /dev/null lfs
passwd lfs
chown -v lfs $LFS/tools
chown -v lfs $LFS/sources
su - lfs

Daha önce bu işlemleri yapmamış olanlar için açıklayayım:

  • groupadd lfs adında bir grup oluşturuyoruz.
  • useradd yine aynı isimde bir kullanıcı oluşturuyoruz.
  • -s /bin/bash lfs kullanıcısının kabuğunu bash olarak seçiyoruz.
  • -g lfs kullanıcımızı lfs grubuna ekliyoruz.
  • -m lfs kullanıcımıza ev(home) klasörü oluşturuyoruz.
  • -k /dev/null kullanıcımızın iskelet(skeleton) klasörü olarak sistem varsayılanını kullanmamasını sağlıyoruz.
  • passwd kullanıcımızın şifresini belirliyoruz. İstediğinizi yazabilirsiniz.
  • chown $LFS klasörlerimizin sahibini lfs kullanıcımız yapıyoruz.
  • su root kullanıcımızdan lfs kullanıcımıza geçiyoruz.

LFS yazarlarımız bununla kalmamışlar bizim işimizi kolaylaştırmak için birer komutla bizim dot files dediğimiz dosyaları da oluşturmuşlar.

1
2
3
cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF
1
2
3
4
5
6
7
8
9
cat > ~/.bashrc << "EOF"
set +h
umask 022
LFS=/mnt/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

Eğer siz $LFS olarak başka bir yer belirtiyorsanız bu ~/.bashrc dosyanızı düzenleyin.

1
2
3
4
5
# Eğer işlemcinizin çekirdek sayısı birden fazlaysa ~/.bashrc dosyanıza
export MAKEFLAGS='-j /çekirdeksayınız/'
# çift çekirde için örnek:
export MAKEFLAGS='-j 2'
# satırını eklemeniz hızınıza hız katar.
1
source ~/.bash_profile

Şimdi de oluşturduğumuz dosyaları aktifleştirmiş olduk.

Derleme süreleri(SBU)

Kitabımız SBU diye bir terimden bahsediyor. Diyor ki derleme süreleri her makinede değişir, ben senin makineni bilemem. Ama diyor ilk derleyeceğin paket Binutils-2.25 bunun derlenme süresine 1 SBU dersen ben sana diğer paketlerin kaç SBU sürede derleneceğini söylerim. Biz de bu sebeple ilk paketin derlenme süresini hesaplayacağız.

Kontroller

LFS gurularımızın bizi uyardığı bazı noktalar var. Hemen onları kontrol edelim.

  • $LFS değişkeninin kurulum dizinini(/mnt/lfs) işaret ettiğine emin olun.
  • Kabuk olarak bash kullandığınızdan emin olun.
  • sh komutunun bash komutunu çağırdığından emin olun.
  • /usr/bin/awk komutunun gawk komutunu çağırdığından emin olun
  • /usr/bin/yacc komutunun bison komutunu çağırdığından emin olun.

Yaklaşık olarak istisnalar hariç tüm kurulumlar aşağıdaki yolu izleyecektir. Öğrenmek hataları minimuma çekecektir bu yüzden yazıyorum.

  • Paket tar ile açılır.
  • Paketin çıkartıldığı dizine girilir.
  • Kitaptaki anlatımlar izlenir.(Genelde configure, make, make install üçlüsü)
  • Dizinden çıkılır.
  • Paketin kaynak dizini ve varsa build dizini silinir.

Derlemeye başlangıç

Şu andan itibaren kesinlik lfs kullanıcı olarak $LFS/sources/ dizininde olmalısınız. Kalkışa hazır olun.

1
2
su - lfs
cd $LFS/sources

Binutils(1.Aşama)

Derleme süresi: 1 SBU, Gerekli disk alanı: 545 MB

1
2
3
4
5
cd $LFS/sources
tar xvf binutils-2.25.tar.bz2
cd binutils-2.25
mkdir -v ../binutils-build
cd ../binutils-build

binutils paketimiz özel durumu olanlardan. Bu yüzden build klasörüne ihtiyaç duyuyor. SBU hesaplarımızı bu paket ile yapacağımız söylemiştik. time komutunu biliyorsunuzdur. Az sonra imdadımıza yetişecek.

1
2
3
4
5
# 32-bit
time { ../binutils-2.25/configure --prefix=/tools --with-sysroot=$LFS --with-lib-path=/tools/lib --target=$LFS_TGT --disable-nls --disable-werror && make && make install; }

# 64-bit
time { ../binutils-2.25/configure --prefix=/tools --with-sysroot=$LFS --with-lib-path=/tools/lib --target=$LFS_TGT --disable-nls --disable-werror && make && mkdir -v /tools/lib && ln -sv lib /tools/lib64 && make install; }

time komutu sonrası karşımıza çıkan real değeri bizim SBU’muz olmuş oluyor. Artık hangi paket ne kadar sürede derlenecek az çok biliyoruz. Benim için 1 SBU = 1dakika 5saniye

1
2
3
real    1m5.023s
user    1m39.480s
sys     0m13.000s

İlk programımız /tools dizinimize derlendi. Kontrol edebilirsiniz. Şimdi işimize yaramayan klasörleri silebiliriz.

Kesinlikle arşiv dosyalarını silmeyin.

1
2
3
cd $LFS/sources
rm -rf binutils-2.25/
rm -rf binutils-build/

GCC(1.Aşama)

Derleme süresi: 5.9 SBU, Gerekli disk alanı: 2 GB

GCC kurulumu biraz daha uzun karmaşık. Sonuçta daha kompleks bir yapısı var çok sinirlenmeden normal karşılayalım, biraz alttan alalım.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# hazırlığımızı yapıyoruz
cd $LFS/sources
tar -xvf gcc-4.9.2.tar.bz2
cd gcc-4.9.2
tar -xvf ../mpfr-3.1.2.tar.xz
mv -v mpfr-3.1.2 mpfr
cd mpfr
patch -Np1 -i ../../mpfr-3.1.2-upstream_fixes-3.patch
cd ..
tar -xvf ../gmp-6.0.0a.tar.xz
mv -v gmp-6.0.0 gmp
tar -xvf ../mpc-1.0.2.tar.gz
mv -v mpc-1.0.2 mpc

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

sed -i '/k prot/agcc_cv_libc_provides_ssp=yes' gcc/configure

# Daha yeni derlemeye başlıyoruz, az daha sabır.
mkdir -v ../gcc-build
cd ../gcc-build
../gcc-4.9.2/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-libatomic                              \
    --disable-libgomp                                \
    --disable-libitm                                 \
    --disable-libquadmath                            \
    --disable-libsanitizer                           \
    --disable-libssp                                 \
    --disable-libvtv                                 \
    --disable-libcilkrts                             \
    --disable-libstdc++-v3                           \
    --enable-languages=c,c++
make
make install

# fazlalıklarımızı siliyoruz
cd $LFS/sources
rm -rf gcc-4.9.2/
rm -rf gcc-build/

Linux API Headers

Derleme süresi: 0.1 SBU, Gerekli disk alanı: 653 MB

Basit bir API kopyalama o yüzden kısa çok da fazla sevinmeyin.

1
2
3
4
5
6
7
8
9
10
11
12
13
# paketi açıyoruz
cd $LFS/sources
tar -xvf linux-3.19.tar.xz
cd linux-3.19

# kuruyoruz
make mrproper
make INSTALL_HDR_PATH=dest headers_install
cp -rv dest/include/* /tools/include

# siliyoruz
cd $LFS/sources
rm -rf linux-3.19/

Glibc

Derleme süresi: 3.9 SBU, Gerekli disk alanı: 670 MB

Basit bir API kopyalama o yüzden kısa çok da fazla sevinmeyin.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# paketi açıyoruz
cd $LFS/sources
tar -xvf glibc-2.21.tar.xz
cd glibc-2.21
patch -Np1 -i ../glibc-2.21-fhs-1.patch

# gurularımız olası sorunlara karşı önlemler sunmuşlar.
# aşılarımızı yapıyoruz
if [ ! -r /usr/include/rpc/types.h ]; then
  su -c 'mkdir -pv /usr/include/rpc'
  su -c 'cp -v sunrpc/rpc/*.h /usr/include/rpc'
fi

sed -e '/ia32/s/^/1:/' \
    -e '/SSE2/s/^1://' \
    -i  sysdeps/i386/i686/multiarch/mempcpy_chk.S

# kurulumu hazırlıyoruz
mkdir -v ../glibc-build
cd ../glibc-build

# kuruyoruz
../glibc-2.21/configure                             \
      --prefix=/tools                               \
      --host=$LFS_TGT                               \
      --build=$(../glibc-2.21/scripts/config.guess) \
      --disable-profile                             \
      --enable-kernel=2.6.32                        \
      --with-headers=/tools/include                 \
      libc_cv_forced_unwind=yes                     \
      libc_cv_ctors_header=yes                      \
      libc_cv_c_cleanup=yes
make -j1#glibc çok çekirdek ile derlenmeyi pek sevmiyormuş
make install

# siliyoruz
cd $LFS/sources
rm -rf glibc-2.21/
rm -rf glibc-build/

Gurularımız diyorlar ki; o kadar kurdun ya sorun varsa? Kontrol et diyorlar, kontrol et. Edelim ama nasıl?

1
2
3
4
5
6
7
8
9
echo 'main(){}' > dummy.c
$LFS_TGT-gcc dummy.c
readelf -l a.out | grep ': /tools'

# aşağdakine benzer bir çıktı almamız gerekiyor /tools/lib yerine /tools/lib64 de olabilir
[Requesting program interpreter: /tools/lib/ld-linux.so.2]
# bu çıktıyı alamıyorsak sorun var demektir
# dosyayı silelim fazlalık yapmasın
rm -v dummy.c a.out

Libstdc++

Derleme süresi: 0.3 SBU, Gerekli disk alanı: 798 MB

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# paketi açıyoruz
cd $LFS/sources
tar -xvf gcc-4.9.2.tar.bz2
cd gcc-4.9.2
mkdir -pv ../gcc-build
cd ../gcc-build

# kuruyoruz
../gcc-4.9.2/libstdc++-v3/configure \
    --host=$LFS_TGT                 \
    --prefix=/tools                 \
    --disable-multilib              \
    --disable-shared                \
    --disable-nls                   \
    --disable-libstdcxx-threads     \
    --disable-libstdcxx-pch         \
    --with-gxx-include-dir=/tools/$LFS_TGT/include/c++/4.9.2
make
make install

# siliyoruz
cd $LFS/sources
rm -rf gcc-4.9.2/
rm -rf gcc-build/

Tüm parametrelerin açıklamalarını bir bir yazmıyorum hem tümünü kendim de bilmiyorum hem de zaten hepsi LFS kitabında yazıyor. Geçici sistemin temellerini başarıyla derledik.