Anda di halaman 1dari 209

Tutorial Linux From Scratch oleh: Agus H

BAB 1
Pendahuluan Linux From Scratch adalah membangun linux dari nol, dengan cara mengumpulkan kernel, library, utilitas dll, kemudian kita kompilasi dan kita konfigurasi hingga menjadi sebuah system linux. Dengan mempelajari Linux From Scratch berarti kita akan belajar meramu, mempelajari karakteristik dan cara kerja dari system linux itu sendiri. Keuntungan menggunakan Linux From Scratch adalah kita bisa membuat linux seperti keinginan kita, karena membangun linux from scratch pasti akan memberikan fleksibelitas yang sangat tinggi, dan sangat membantu kita dalam mempelajari linux lebih mendalam. Paket2 yang dibutuhkan dalam LFS Membangun LFS bukan berarti kita membangun linux minimalis, tetapi membuat sebuah system linux dari nol, menjadi sebuah system standart yang berguna bagi kita. Paket2 dalam LFS kurang lebih adalah : Autoconf Paket ini berisi program untuk menghasilkan shell script yang mana dapat dengan otomatis mengkonfigurasikan source code dari template2 pengembangan. Biasanya digunakan untuk me rebuild paket2 setelah di update. Automake Paket ini berisi program untuk menggenerate Makefiles dari template. Paket ini sering digunakan untuk proses rebuild paket setelah update, atau generate skrip kompilasi. Bash Paket ini adalah termasuk paket utama yang menyediakan fasilitas Shell pada sistem linux.

1 Linux Fundamental : Linux From Scratch

Binutils Paket ini berisi linker, assembler, dan tools2 lain untuk menangani file object. Paket2 binutils ini di butuhkan untuk melakukan kompilasi pada hampir semua paket dalam LFS. Bison Paket ini berisi yacc (Yet Another Compiler Compiler), digunakan untuk building dari beberapa paket LFS. Bzip2 Paket ini berisi program untuk melakukan kompresi dan dekompresi file, yang mana dibutuhkan di beberapa paket LFS. Coreutils Paket ini berisi beberapa esensi program untuk melakukan viewing dan manipulasi file/direktori. dll DejaGNU Paket ini berisi framework untuk melakukan testing program. Ini hanya di install di temporary toolchain. Diffutils Paket ini berisi program untuk melihat perbedaan antar filie/direktori. Program ini digunakan untuk membuat patch, juga digunakan di beberapa prosedur building paket. Expect Paket ini berisi program untuk membuat skrip dialog antar program secara interaktif. Biasanya digunakan untuk testing paket, paket ini hanya diinstall di temporary toolchain. E2fsprogs Paket ini berisi utilitas untuk menangani filesystem ext2, ext3, ext4. File Berisi paket yang berguna untuk melihat jenis/tipe file. Beberapa paket membutuhkan utilitas ini untuk proses building. Findutils Paket ini berisi program untuk melakukan pencarian file dalam filesystem.
2 Linux Fundamental : Linux From Scratch

Paket ini berguna untuk proses building dari beberapa paket. Flex paket ini berisi utilitas untuk generate program untuk mengenali pola2 tertentu dalam teks. Berguna untuk building beberapa paket LFS. Gawk Paket ini berisi program untuk melakukan manipulasi file teks. Ini adalah versi GNU dari awk. Paket ini digunakan untuk melakukan proses building pada beberapa paket dalam LFS. Gcc Paket ini berisi GNU Compiler Collection. Didalamnya berisi Kompiler C dan C++ Paket ini digunakan untuk melakukan kompilasi pada hampir semua paket2 dalam LFS yang di tulis dalam bahasa C. GDBM Paket ini berisi Library Manager Database. Digunakan oleh paket lain dalam LFS, yaitu Man-DB Gettext Paket ini berisi librari dan utility untuk internasionalisasi dan lokalisasi dari beberapa paket di LFS. Glibc Berisi Library utama program2 yang dihasilkan dari bahasa C. Linux tidak akan jalan tanpa lib ini. GMP Paket ini berisi library matematika yang berguna untuk menghasilkan fungsi2 untuk operasi aritmatika dengan ketepatan tinggi. Paket ini digunakan untuk building Gcc. Grep Paket ini berisi program untuk mencari pola2 teks tertentu dalam file, Paket ini digunakan hampir pada semua building script. Groff Paket ini berisi program untuk melakukan prosesing dan formating teks. Fungsi penting dari program ini adalah untuk melakukan formatting pada man pages.
3 Linux Fundamental : Linux From Scratch

GRUB Ini adalah Boot Loader yang paling fleksibel diantara boot loader2 lain yang ada. Gzip Paket ini berisi program untuk melakukan kompresi dan dekompresi file. Paket ini di butuhkan untuk melakukan dekompresipada banyak paket2 di LFS. Iana-etc Paket ini menyediakan data untuk network services dan protokol. Berguna untuk membuat aplikasi network dengan kapabilitas tinggi. Inetutils This package contains programs for basic network administration. Paket ini berisi program untuk dasar administrasi network. IProute2 . Paket ini berisi program untuk administrasi networking dari yang bersifat dasar sampai advance pada Ipv4 dan Ipv6. Iproute2 hampir digunakan pada kebanyakan paket network-tools. Kbd Paket ini berisi utilitas untuk keyboard, yang berisi tabel key pada jenis2 keyboard tertentu, juga beberapa jenis font console. Kmod Paket ini berisi program yang dibutuhkan untuk administrasi/pengaturan pada modul2 kernel. Less Paket ini berisi tool untuk melihat isi file teks, dan memungkinkan kita untuk scrolling up dan down dalam melihat isinya. Paket ini digunakan oleh Man-DB dalam menampilkan manpages. Libtool Paket ini berisi skrip2 pendukung pada Librari umum, juga untuk mengkonfigurasikan kompleksitas dari penggunaan shared library. Paket ini dibutuhkan oleh keperluan test dari paket2 other dari LFS. Linux Kernel Ini adalah Operating system yang sebenarnya. Sebenarnya linux adalah kernel ini yang di bangun atas GNU/Linux environment
4 Linux Fundamental : Linux From Scratch

M4 Paket ini berisi prosesor dari script makro2 umum, paket ini berguna untuk proses building dari program. Make Paket ini berisi program yang berguna untuk melakukan direct building dari paket2 tertentu. Hampir semua paket membutuhkan utilitas ini untuk melakukan proses kompilasi dan building. Man-DB Paket ini berisi Program yang berfungsi untuk melakukan proses pencarian dan menampilkan man pages. Paket ini adalah paket pendukung dari man-pages. Man-pages Paket ini berisi isi yang sebenarnya dari basic halaman manual linux. MPC Paket ini berisi fungsi2 yang berguna untuk melakukan perhitungan aritmatika dari bilangan2 yang kompleks, paket ini di butuhkan oleh GCC. MPFR Paket ini berisi fungsi2 dari perhitungan aritmatika multi presisi. Paket ini digunakan oleh GCC. Ncurses Paket ini berisi library untuk penanganan karakter2 layar pada terminal. Lib ini juga sering digunakan untuk kontrol kursor pada systeem menu. Ncurses dibutuhkan oleh banyak paket dalam LFS. Patch Paket ini berisi program untuk melakukan modifikasi atau menciptakan files dengan cara memasangkan sisipan/patch tertentu yang biasanya di hasilkan oleh program diff, Paket ini digunakan untuk membangun prosedur2 untuk beberapa paket dalam LFS. Perl Paket ini berisi interpreter untuk bahasa pemrograman PERL. Dalam LFS paket ini dibutuhkan untuk proses installasi dan test dari beberapa paket.
5 Linux Fundamental : Linux From Scratch

Procps Paket ini berisi program untuk melakukan monitoring proses. Program ini berguna untuk melakukan system administrasi dan dibutuhkan juga pada LFS Bootscripts. Psmisc Paket ini berisi program untuk melakukan display informasi tentang proses yang sedang berjalan, paket ini berguna untuk melakukan administrasi system. Readline Paket ini berisi satu set library yang memberikan fasilitas manajemen dan editing command-line, dan history Paket ini digunakan oleh bash. Sed Paket ini digunakan untuk melakukan editing teks secara command line, tanpa harus membuka program editor. Paket ini digunakan oleh hampir semua dari script configure. Shadow This package contains programs for handling passwords in a secure way. Paket ini berisi program untuk melakukan shadowing password, yang berguna untuk meningkatkan keamanan di system linux kita. Sysklogd Paket ini berisi program untuk melakukan pencatatan/logging terhadap proses2 dalam system, seperti yang di berikan oleh kernel, atau daemon2/proses tertentu (biasanya dicatat apabila ada sesuatu kejadian tertentu yang bersifat tidak biasa terjadi) Sysvinit Paket ini berisi program inisialisasi, yang mana ini merupakan induk dari proses2 lain dalam system linux. Tar Paket ini berfungsi untuk melakukan pengarsipan (membentuk file .tar) dan ekstrak dari file .tar Digunakan hampir pada semua paket LFS. Tcl Paket ini berisi Tool Command Language yang berguna pada pengetestan dalam paket2 LFS.
6 Linux Fundamental : Linux From Scratch

TCL hanya di install pada temporary toolchain. Texinfo Paket ini berisi program untuk melakukan pembacaan, penulisan dan konversi ke dalam suatu halaman, Paket ini digunakan pada prosedur installasi pada banyak paket LFS Udev of static devices in the /dev directory. Paket ini berisi program untuk membuat file devices dengan nomor node2 tertentu pada direktori /dev. Util-linux Paket ini berisi program utility, biasanya untuk menangani system console, partisi, dan massages. Vim Paket ini berisi editor, yang kompatibel dengan editor classic vi, tetapi dengan penambahan fitur2 yang sangat powerfull dalam melakukan editing teks. XZ Utils Paket ini berisi program untuk melakukan kompresi dan dekompresi files. XZ utils ini memberikan kompresi yang sangat tinggi. File2 kompresinya berformat .xz atau .lzma. Zlib Paket ini berisi library rutin2 tertentu untuk melakukan kompresi dan dekompresi, zlib di butuhkan oleh beberapa program lain.

Kebutuhan minimal Host untuk membangun LFS versi 7.1 Untuk bisa membangun LFS (versi 7.1) system anda harus memiliki paket2 dibawah ini, sebenarnya untuk distribusi linux2 baru saat ini biasanya tidak menjadi masalah, karena paket2 yang ada malah banyak yang lebih baru dari minimum persyaratan berikut. Ada kemungkinan untuk versi2 sebelumnya tetap bisa di gunakan, tapi belum dilakukan test secara detail. Adapun paket2 yang di butuhkan adalah : Bash-3.2 (/bin/sh harus di symlink ke bash) Binutils-2.17 (Versions greater than 2.22 are not recommended as they have not been tested)
7 Linux Fundamental : Linux From Scratch

Bison-2.3 (/usr/bin/yacc should be a link to bison or small script that executes bison) Bzip2-1.0.4 Coreutils-6.9 Diffutils-2.8.1 Findutils-4.2.31 Gawk-3.1.5 (/usr/bin/awk should be a link to gawk) Gcc-4.1.2 (Versions greater than 4.6.2 are not recommended as they have not been tested) Glibc-2.5.1 (Versions greater than 2.14.1 are not recommended as they have not been tested) Grep-2.5.1a Gzip-1.3.12 Linux Kernel-2.6.25 (having been compiled with GCC-4.1.2 or greater) M4-1.4.10 Make-3.81 Patch-2.5.4 Perl-5.8.8 Sed-4.1.5 Tar-1.18 Texinfo-4.9 Xz-5.0.3 Anda bisa juga membuat sebuah script bash, yang berisi sbb (misal di beri nama cekversi.sh) :
#!/bin/bash # Simple script to list version numbers of critical development tools export LC_ALL=C bash --version | head -n1 | cut -d" " -f2-4 echo "/bin/sh -> `readlink -f /bin/sh`" echo -n "Binutils: "; ld --version | head -n1 | cut -d" " -f3bison --version | head -n1 if [ -e /usr/bin/yacc ]; then echo "/usr/bin/yacc -> `readlink -f /usr/bin/yacc`";
8 Linux Fundamental : Linux From Scratch

else echo "yacc not found"; fi bzip2 --version 2>&1 < /dev/null | head -n1 | cut -d" " -f1,6echo -n "Coreutils: "; chown --version | head -n1 | cut -d")" -f2 diff --version | head -n1 find --version | head -n1 gawk --version | head -n1 if [ -e /usr/bin/awk ]; then echo "/usr/bin/awk -> `readlink -f /usr/bin/awk`"; else echo "awk not found"; fi gcc --version | head -n1 ldd --version | head -n1 | cut -d" " -f2- # glibc version grep --version | head -n1 gzip --version | head -n1 cat /proc/version m4 --version | head -n1 make --version | head -n1 patch --version | head -n1 echo Perl `perl -V:version` sed --version | head -n1 tar --version | head -n1 echo "Texinfo: `makeinfo --version | head -n1`" xz --version | head -n1 echo 'main(){}' > dummy.c && gcc -o dummy dummy.c if [ -x dummy ] then echo "gcc compilation OK"; else echo "gcc compilation failed"; fi rm -f dummy.c dummy

kemudian jalankan :
# chmod 755 ./cek-versi.sh # ./cek-versi.sh bash, version 4.2.10(1)-release /bin/sh -> /bin/bash Binutils: version 2.21.51.0.6-2.fc15 20110118 bison (GNU Bison) 2.4.3 /usr/bin/yacc -> /usr/bin/yacc
9 Linux Fundamental : Linux From Scratch

bzip2, Version 1.0.6, 6-Sept-2010. Coreutils: 8.10 diff (GNU diffutils) 2.8.1 find (GNU findutils) 4.5.9 GNU Awk 3.1.8 /usr/bin/awk -> /bin/gawk gcc (GCC) 4.6.0 20110428 (Red Hat 4.6.0-6) (GNU libc) 2.13.90 grep (GNU grep) 2.7 gzip 1.4 Linux version 2.6.38.6-26.rc1.fc15.i686.PAE (mockbuild@x8614.phx2.fedoraproject.org) (gcc version 4.6.0 20110428 (Red Hat 4.6.0-6) (GCC) ) #1 SMP Mon May 9 20:36:50 UTC 2011 m4 (GNU M4) 1.4.16 GNU Make 3.82 patch 2.6.1 Perl version='5.12.3'; GNU sed version 4.2.1 tar (GNU tar) 1.25 Texinfo: makeinfo (GNU texinfo) 4.13 xz (XZ Utils) 5.0.1 gcc compilation OK

10 Linux Fundamental : Linux From Scratch

BAB 2 BUILDING LFS LFS dibangun dengan menggunakan system linux yang sudah ada terlebih dahulu (seperti Redhat, Fedora, Debian dll), kemudian dari situ kita lakukan proses2 pembuatan partisi, building dan kompilasi dll hingga menghasilkan sebuah system linux baru. Secara garis besar tahapan membangun LFS adalah sbb : 1. Mempersiapkan linux yang sudah ada dahulu, dengan prasyarat spt yg di sebutkan diatas. 2. Menyiapkan partisi linux baru tempat membangun LFS. 3. Menyiapkan paket2 dan patch yang akan di kompilasi dan diinstall. 4. Menyiapkan tempat kerja spt pengaturan direktori, environment variabel dll untuk proses building dan compile paket2 dalam LFS. 5. Installasi paket2 yang membentuk dasar dari development suit (toolchain) yang nantinya akan digunakan untuk membangun system yang sebenarnya. 6. Melakukan kompilasi dan installasi dari paket2 yang sebenarnya 7. Setelah LFS System terbentuk semua dilakukan boot up/uji coba. PERSIAPAN MEMBANGUN LFS MEMBUAT PARTISI BARU Seperti sistem operasi pada umumnya LFS juga di install pada partisi tertentu yang telah kita persiapkan terlebih dahulu. Kapasitas minimal untuk melakukan semua proses pembangunan LFS kira2 2.8 GB. Yang nantinya akan di gunakan untuk menyimpan semua tarball, dan melakukan proses2 kompilasi dan installasi. Namun apabila anda bisa menyiapkan partisi kira2 10GB, hal ini akan lebih memberikan banyak kemudahan bagi kita dalam melakukan eksplorasi dan pengembangan dari paket2 LFS yang akan kita install. Sedangkan untuk proses kompilasi dll, kita mungkin membutuhkan swap dengan kapasitas yang cukup untuk bisa di gunakan oleh kernel untuk menyimpan data2 yang jarang di gunakan dan menggunakan RAM untuk melakukan proses2 yang sedang berjalan.
11 Linux Fundamental : Linux From Scratch

Dalam membuat partisi baru anda bisa menggunakan program cfdisk atau fdisk. Minimal anda harus mempersiapkan partisi yang nantinya akan di jadikan sebagai partisi root (/), dan swap. Setelah dibuat pertisi tsb di buat, ada baiknya juga kalau anda juga memisah hirarki direktori2 sbb
/boot /home /usr /opt /tmp /usr/src

sebagai partisi terpisah, namun hal ini tidaklah wajib. Setelah partisi dibuat, kemudian kita membuat filesystem linux : dengan perintah :
mke2fs -jv /dev/<xxx>

contoh :
[root@localhost ~]# mke2fs -jv /dev/sda5 mke2fs 1.41.14 (22-Dec-2010) fs_types for mke2fs.conf resolution: 'ext3' Calling BLKDISCARD from 0 to 10485760000 failed. Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 640848 inodes, 2560000 blocks 128000 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=2621440000 79 block groups 32768 blocks per group, 32768 fragments per group 8112 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632 Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done
12 Linux Fundamental : Linux From Scratch

This filesystem will be automatically checked every 22 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.

kemudian kita ketik :


debugfs -R feature /dev/<xxx>

untuk menghindari terjadinya error pada beberapa distribusi linux yang melakukan custom2 tertentu pada e2fsprog nya
[root@localhost ~]# debugfs -R feature /dev/sda5 debugfs 1.41.14 (22-Dec-2010) Filesystem features: has_journal ext_attr resize_inode dir_index filetype sparse_super large_file

apabila munculnya fitur selain :


has_journal, ext_attr, resize_inode, dir_index, filetype, sparse_super, large_file atau needs_recover

berarti anda perlu melakukan kompilasi paket e2fsprogs yang ada dalam paket LFS 7.1 ini, dan silakan anda buat kembali partisinya menggunakan e2fsprogs tersebut. Hal ini untuk menghindari kemungkinan terjadinya error kelak. MOUNTING PARTISI BARU Setelah partisi kita buat, partisi tersebut kemudian kita mounting, langkah2nya adalah : Kita setting environment variabel bernama LFS
[root@localhost ~]# export LFS=/mnt/lfs

kemudian kita buat direktorinya :


[root@localhost ~]# mkdir -pv $LFS mkdir: created directory `/mnt/lfs'

setelah itu kita mounting :


[root@localhost ~]# mount -v -t ext3 /dev/sda5 $LFS /dev/sda5 on /mnt/lfs type ext3 (rw)
13 Linux Fundamental : Linux From Scratch

kemudian kita aktifkan swapnya :


/sbin/swapon -v /dev/<zzz>

BAB 3 PAKET2 DAN PATCH MENYIAPKAN DIREKTORI Setelah kita mounting kemudian kita siapkan direktori2 yang akan kita pergunakan untuk melakukan building, dan kompilasi.
[root@localhost ~]# mkdir -v $LFS/sources mkdir: created directory `/mnt/lfs/sources' [root@localhost ~]# chmod -v a+wt $LFS/sources mode of `/mnt/lfs/sources' changed to 1777 (rwxrwxrwt)

kemudian paket2 LFS 7.1 nya kita letakkan pada direktori ini
/mnt/lfs/sources

kalau anda belum mempunyai, anda bisa mendownloadnya pada alamat2 berikut : http://ftp.gnu.org/gnu/autoconf/autoconf-2.68.tar.bz2 http://ftp.gnu.org/gnu/automake/automake-1.11.3.tar.xz http://ftp.gnu.org/gnu/bash/bash-4.2.tar.gz http://ftp.gnu.org/gnu/binutils/binutils-2.22.tar.bz2 http://ftp.gnu.org/gnu/bison/bison-2.5.tar.bz2 http://www.bzip.org/1.0.6/bzip2-1.0.6.tar.gz http://sourceforge.net/projects/check/files/check/0.9.8/check-0.9.8.tar.gz http://ftp.gnu.org/gnu/coreutils/coreutils-8.15.tar.xz http://ftp.gnu.org/gnu/dejagnu/dejagnu-1.5.tar.gz http://ftp.gnu.org/gnu/diffutils/diffutils-3.2.tar.gz http://prdownloads.sourceforge.net/e2fsprogs/e2fsprogs-1.42.tar.gz http://prdownloads.sourceforge.net/expect/expect5.45.tar.gz ftp://ftp.astron.com/pub/file/file-5.10.tar.gz http://ftp.gnu.org/gnu/findutils/findutils-4.4.2.tar.gz http://prdownloads.sourceforge.net/flex/flex-2.5.35.tar.bz2 http://ftp.gnu.org/gnu/gawk/gawk-4.0.0.tar.bz2
14 Linux Fundamental : Linux From Scratch

http://ftp.gnu.org/gnu/gcc/gcc-4.6.2/gcc-4.6.2.tar.bz2 http://ftp.gnu.org/gnu/gdbm/gdbm-1.10.tar.gz http://ftp.gnu.org/gnu/gettext/gettext-0.18.1.1.tar.gz http://ftp.gnu.org/gnu/glibc/glibc-2.14.1.tar.bz2 http://ftp.gnu.org/gnu/gmp/gmp-5.0.4.tar.xz http://ftp.gnu.org/gnu/grep/grep-2.10.tar.xz http://ftp.gnu.org/gnu/groff/groff-1.21.tar.gz http://ftp.gnu.org/gnu/grub/grub-1.99.tar.gz http://ftp.gnu.org/gnu/gzip/gzip-1.4.tar.gz http://anduin.linuxfromscratch.org/sources/LFS/lfs-packages/conglomeration//ianaetc/iana-etc-2.30.tar.bz2 http://ftp.gnu.org/gnu/inetutils/inetutils-1.9.1.tar.gz http://www.kernel.org/pub/linux/utils/net/iproute2/iproute2-3.2.0.tar.xz http://anduin.linuxfromscratch.org/sources/LFS/lfs-packages/conglomeration/kbd/kbd1.15.2.tar.gz http://packages.profusion.mobi/kmod/kmod-5.tar.xz http://www.greenwoodsoftware.com/less/less-444.tar.gz http://www.linuxfromscratch.org/lfs/downloads/7.1/lfs-bootscripts-20120229.tar.bz2 http://download.savannah.gnu.org/releases/libpipeline/libpipeline-1.2.0.tar.gz http://ftp.gnu.org/gnu/libtool/libtool-2.4.2.tar.gz http://www.kernel.org/pub/linux/kernel/v3.x/linux-3.2.6.tar.xz http://ftp.gnu.org/gnu/m4/m4-1.4.16.tar.bz2 http://ftp.gnu.org/gnu/make/make-3.82.tar.bz2 http://download.savannah.gnu.org/releases/man-db/man-db-2.6.1.tar.gz http://man7.org/linux/download/man-pages/man-pages-3.35.tar.gz http://www.multiprecision.org/mpc/download/mpc-0.9.tar.gz http://www.mpfr.org/mpfr-3.1.0/mpfr-3.1.0.tar.bz2 ftp://ftp.gnu.org/gnu/ncurses/ncurses-5.9.tar.gz http://ftp.gnu.org/gnu/patch/patch-2.6.1.tar.bz2 http://www.cpan.org/src/5.0/perl-5.14.2.tar.bz2 http://procps.sourceforge.net/procps-3.2.8.tar.gz http://prdownloads.sourceforge.net/psmisc/psmisc-22.15.tar.gz http://ftp.gnu.org/gnu/readline/readline-6.2.tar.gz http://ftp.gnu.org/gnu/sed/sed-4.2.1.tar.bz2 http://pkg-shadow.alioth.debian.org/releases/shadow-4.1.5.tar.bz2 http://www.infodrom.org/projects/sysklogd/download/sysklogd-1.5.tar.gz http://download.savannah.gnu.org/releases/sysvinit/sysvinit-2.88dsf.tar.bz2 http://ftp.gnu.org/gnu/tar/tar-1.26.tar.bz2 http://prdownloads.sourceforge.net/tcl/tcl8.5.11-src.tar.gz http://ftp.gnu.org/gnu/texinfo/texinfo-4.13a.tar.gz http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev-181.tar.xz
15 Linux Fundamental : Linux From Scratch

http://www.linuxfromscratch.org/lfs/downloads/7.1/udev-config-20100128.tar.bz2 http://www.kernel.org/pub/linux/utils/util-linux/v2.20/util-linux-2.20.1.tar.bz2 ftp://ftp.vim.org/pub/vim/unix/vim-7.3.tar.bz2 http://tukaani.org/xz/xz-5.0.3.tar.bz2 http://www.zlib.net/zlib-1.2.6.tar.bz2 http://www.linuxfromscratch.org/patches/lfs/7.1/bash-4.2-fixes-4.patch http://www.linuxfromscratch.org/patches/lfs/7.1/bzip2-1.0.6-install_docs-1.patch http://www.linuxfromscratch.org/patches/lfs/7.1/coreutils-8.15-i18n-1.patch http://www.linuxfromscratch.org/patches/lfs/7.1/coreutils-8.15-uname-1.patch http://www.linuxfromscratch.org/patches/lfs/7.1/flex-2.5.35-gcc44-1.patch http://www.linuxfromscratch.org/patches/lfs/7.1/gcc-4.6.2-cross_compile-1.patch http://www.linuxfromscratch.org/patches/lfs/7.1/gcc-4.6.2-startfiles_fix-1.patch http://www.linuxfromscratch.org/patches/lfs/7.1/glibc-2.14.1-fixes-1.patch http://www.linuxfromscratch.org/patches/lfs/7.1/glibc-2.14.1-sort-1.patch http://www.linuxfromscratch.org/patches/lfs/7.1/glibc-2.14.1-gcc_fix-1.patch http://www.linuxfromscratch.org/patches/lfs/7.1/glibc-2.14.1-cpuid-1.patch http://www.linuxfromscratch.org/patches/lfs/7.1/kbd-1.15.2-backspace-1.patch http://www.linuxfromscratch.org/patches/lfs/7.1/mpfr-3.1.0-fixes-1.patch http://www.linuxfromscratch.org/patches/lfs/7.1/patch-2.6.1-test_fix-1.patch http://www.linuxfromscratch.org/patches/lfs/7.1/perl-5.14.2-libc-1.patch http://www.linuxfromscratch.org/patches/lfs/7.1/perl-5.14.2-security_fix-1.patch http://www.linuxfromscratch.org/patches/lfs/7.1/procps-3.2.8-fix_HZ_errors-1.patch http://www.linuxfromscratch.org/patches/lfs/7.1/procps-3.2.8-watch_unicode-1.patch http://www.linuxfromscratch.org/patches/lfs/7.1/readline-6.2-fixes-1.patch http://www.linuxfromscratch.org/patches/lfs/7.1/shadow-4.1.5-nscd-1.patch

anda bisa juga mendownload dengan berbagai macam style, misalnya dengan membuat file wget-list berisi alamat2 tersebut diatas, dan kemudian mengetikkan perintah :
wget -i wget-list -P $LFS/sources

atau dengan cara lain, silakan anda sesuaikan sendiri, yang penting file2 tersebut ada pada direktori :
/mnt/lfs/sources

kira2 kalau di listing jadi sbb :


[root@localhost sources]# pwd /mnt/lfs/sources
16 Linux Fundamental : Linux From Scratch

[root@localhost sources]# ls autoconf-2.68.tar.bz2 gawk-4.0.0.tar.bz2 less-444.tar.gz procps-3.2.8-watch_unicode1.patch automake-1.11.3.tar.xz gcc-4.6.2-cross_compile-1.patch lfs-bootscripts-20120229.tar.bz2 psmisc-22.15.tar.gz bash-4.2-fixes-4.patch gcc-4.6.2-startfiles_fix-1.patch lfs-packages-7.1.tar readline-6.2-fixes-1.patch bash-4.2.tar.gz gcc-4.6.2.tar.bz2 libpipeline-1.2.0.tar.gz readline-6.2.tar.gz binutils-2.22.tar.bz2 gdbm-1.10.tar.gz libtool-2.4.2.tar.gz sed-4.2.1.tar.bz2 bison-2.5.tar.bz2 gettext-0.18.1.1.tar.gz linux-3.2.6.tar.xz shadow-4.1.5-nscd-1.patch bzip2-1.0.6-install_docs-1.patch glibc-2.14.1-cpuid-1.patch m4-1.4.16.tar.bz2 shadow-4.1.5.tar.bz2 bzip2-1.0.6.tar.gz glibc-2.14.1-fixes-1.patch make-3.82.tar.bz2 sysklogd-1.5.tar.gz check-0.9.8.tar.gz glibc-2.14.1-gcc_fix-1.patch man-db-2.6.1.tar.gz sysvinit-2.88dsf.tar.bz2 check.sh glibc-2.14.1-sort-1.patch man-pages-3.35.tar.gz tar-1.26.tar.bz2 coreutils-8.15-i18n-1.patch glibc-2.14.1.tar.bz2 md5sums tcl8.5.11-src.tar.gz coreutils-8.15.tar.xz gmp-5.0.4.tar.xz mpc-0.9.tar.gz texinfo-4.13a.tar.gz coreutils-8.15-uname-1.patch grep-2.10.tar.xz mpfr-3.1.0-fixes-1.patch udev-181.tar.xz dejagnu-1.5.tar.gz groff-1.21.tar.gz mpfr-3.1.0.tar.bz2 udev-config-20100128.tar.bz2 diffutils-3.2.tar.gz grub-1.99.tar.gz ncurses-5.9.tar.gz util-linux-2.20.1.tar.bz2 e2fsprogs-1.42.tar.gz gzip-1.4.tar.gz patch-2.6.1.tar.bz2 vim-7.3.tar.bz2 expect5.45.tar.gz iana-etc-2.30.tar.bz2 patch-2.6.1-test_fix-1.patch wget-list extra.sh inetutils-1.9.1.tar.gz perl-5.14.2-libc-1.patch xz-5.0.3.tar.bz2 file-5.10.tar.gz iproute2-3.2.0.tar.xz perl-5.14.2-security_fix-1.patch zlib-1.2.6.tar.bz2 findutils-4.4.2.tar.gz kbd-1.15.2-backspace-1.patch perl-5.14.2.tar.bz2 flex-2.5.35-gcc44-1.patch kbd-1.15.2.tar.gz procps-3.2.8-fix_HZ_errors-1.patch flex-2.5.35.tar.bz2 kmod-5.tar.xz procps-3.2.8.tar.gz

kemudian anda bisa melakukan pengecekan keaslian dan kondisi dari file2 yang anda
17 Linux Fundamental : Linux From Scratch

download tsb dengan cek md5sum nya :


[root@localhost sources]# pushd $LFS/sources /mnt/lfs/sources /mnt/lfs/sources [root@localhost sources]# md5sum -c md5sums autoconf-2.68.tar.bz2: OK automake-1.11.3.tar.xz: OK bash-4.2.tar.gz: OK binutils-2.22.tar.bz2: OK bison-2.5.tar.bz2: OK bzip2-1.0.6.tar.gz: OK check-0.9.8.tar.gz: OK coreutils-8.15.tar.xz: OK dejagnu-1.5.tar.gz: OK diffutils-3.2.tar.gz: OK e2fsprogs-1.42.tar.gz: OK expect5.45.tar.gz: OK file-5.10.tar.gz: OK findutils-4.4.2.tar.gz: OK flex-2.5.35.tar.bz2: OK gawk-4.0.0.tar.bz2: OK gcc-4.6.2.tar.bz2: OK gdbm-1.10.tar.gz: OK gettext-0.18.1.1.tar.gz: OK glibc-2.14.1.tar.bz2: OK gmp-5.0.4.tar.xz: OK grep-2.10.tar.xz: OK groff-1.21.tar.gz: OK grub-1.99.tar.gz: OK gzip-1.4.tar.gz: OK iana-etc-2.30.tar.bz2: OK inetutils-1.9.1.tar.gz: OK iproute2-3.2.0.tar.xz: OK kbd-1.15.2.tar.gz: OK kmod-5.tar.xz: OK less-444.tar.gz: OK lfs-bootscripts-20120229.tar.bz2: OK libpipeline-1.2.0.tar.gz: OK libtool-2.4.2.tar.gz: OK linux-3.2.6.tar.xz: OK m4-1.4.16.tar.bz2: OK make-3.82.tar.bz2: OK man-db-2.6.1.tar.gz: OK man-pages-3.35.tar.gz: OK mpc-0.9.tar.gz: OK mpfr-3.1.0.tar.bz2: OK ncurses-5.9.tar.gz: OK patch-2.6.1.tar.bz2: OK perl-5.14.2.tar.bz2: OK
18 Linux Fundamental : Linux From Scratch

procps-3.2.8.tar.gz: OK psmisc-22.15.tar.gz: OK readline-6.2.tar.gz: OK sed-4.2.1.tar.bz2: OK shadow-4.1.5.tar.bz2: OK sysklogd-1.5.tar.gz: OK sysvinit-2.88dsf.tar.bz2: OK tar-1.26.tar.bz2: OK tcl8.5.11-src.tar.gz: OK texinfo-4.13a.tar.gz: OK udev-181.tar.xz: OK udev-config-20100128.tar.bz2: OK util-linux-2.20.1.tar.bz2: OK vim-7.3.tar.bz2: OK xz-5.0.3.tar.bz2: OK zlib-1.2.6.tar.bz2: OK bash-4.2-fixes-4.patch: OK bzip2-1.0.6-install_docs-1.patch: OK coreutils-8.15-i18n-1.patch: OK coreutils-8.15-uname-1.patch: OK flex-2.5.35-gcc44-1.patch: OK gcc-4.6.2-cross_compile-1.patch: OK gcc-4.6.2-startfiles_fix-1.patch: OK glibc-2.14.1-fixes-1.patch: OK glibc-2.14.1-sort-1.patch: OK glibc-2.14.1-gcc_fix-1.patch: OK glibc-2.14.1-cpuid-1.patch: OK kbd-1.15.2-backspace-1.patch: OK mpfr-3.1.0-fixes-1.patch: OK patch-2.6.1-test_fix-1.patch: OK perl-5.14.2-libc-1.patch: OK perl-5.14.2-security_fix-1.patch: OK procps-3.2.8-fix_HZ_errors-1.patch: OK procps-3.2.8-watch_unicode-1.patch: OK readline-6.2-fixes-1.patch: OK shadow-4.1.5-nscd-1.patch: OK [root@localhost sources]# popd /mnt/lfs/sources

19 Linux Fundamental : Linux From Scratch

BAB 4 PERSIAPAN AKHIR

BUAT DIREKTORI tools dalam $LFS, kemudian kita symlink kan ke /tools
[root@localhost sources]# mkdir -v $LFS/tools mkdir: created directory `/mnt/lfs/tools' [root@localhost sources]# ln -sv $LFS/tools / `/tools' -> `/mnt/lfs/tools'

MENAMBAHKAN USER UNTUK LFS hal ini untuk mencegah terjadinya kerusakan pada system kita (yg sedang running) apabila kita kelak melakukan kesalahan.
# groupadd lfs # useradd -s /bin/bash -g lfs -m -k /dev/null lfs

Setelah kita password :


# passwd lfs

Kemudian kita rubah kepemilikan dari direktori LFS nya :


[root@localhost sources]# chown -v lfs $LFS/tools changed ownership of `/mnt/lfs/tools' to lfs [root@localhost sources]# chown -v lfs $LFS/sources changed ownership of `/mnt/lfs/sources' to lfs [root@localhost sources]# su - lfs -bash-4.2$

SETTING UP ENVIRONTMENT
20 Linux Fundamental : Linux From Scratch

Tambahkan baris :
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash

pada .bash_profile dari user lfs dengan perintah :


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

kemudian pada /etc/profile di tambahkan baris :


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

dengan perintah :
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

21 Linux Fundamental : Linux From Scratch

BAB 5 INSTALLASI TOOLCHAINS Toolchain adalah tempat alat2 yang nantinya akan kita perlukan untuk membangun LFS, saat kita memasuki tahap kompilasi dan installasi paket yang sebenarnya, di lingkungan chroot. INSTALLASI BINUTILS TAHAP 1 Binutils haruslah di install/di kompile pertama kali, karena digunakan oleh glibc dan gcc untuk melakukan proses test pada saat linker dan assembly, untuk menentukan fitur mana saja yang akan diaktifkan. Untuk melakukan kompilasi, buat direktori lain, misalnya :
binutils-build,

kemudian masuk ke direktori tsb, dan lakukan tahapan dari proses building dan kompilasi, perintahnya kurang lebih sbb :
# mkdir -v ../binutils-build # cd ../binutils-build

kemudian :
../binutils-2.22/configure \ --target=$LFS_TGT --prefix=/tools \ --disable-nls --disable-werror

skrip configure di panggil dari dalam direktori binutils-build


22 Linux Fundamental : Linux From Scratch

arti dari : --target=$LFS_TGT adalah untuk memberitahu deskripsi dari mesin anda (diambil dari variabel yang kita tentukan yaitu
bash-4.2$ env | grep LFS_TGT LFS_TGT=i686-lfs-linux-gnu

bukan dihasilkan dari config.guess --prefix=/tools berarti kita install pada direktori tools dari $LFS --disable-nls berarti kita disable internasionalisasi sebagai i18n, krn tidak dibutuhkan utk temporary tools --disable-werror walaupun hasil dari config.pass(nama mesin kita saat kompilasi) berbeda dgn yg kita tentukan di target, proses kompilasi tetap dilanjutkan.

Kemudian ketik : $ make $ make install INSTALLASI GCC Pass 1 Sebelum installasi gcc, kita harus mengekstrak paket : mpfr gmp mpc kegunaan dari paket2 ini sudah kita jelaskan di bahasan sebelumnya. Langkah2nya : extract source dari gcc nya, dan buat direktori utk building, mis: gcc-build :
$ mkdir gcc-build $ tar jxvf gcc-4.6.2.tar.bz2

kemudian extract ketiga paket tsb ke dalam direktori hasil extract-an gcc-4.6.2 tadi, dan rename menjadi nama yg singkat :
23 Linux Fundamental : Linux From Scratch

$ $ $ $ $ $

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

kemudian patch gcc nya :


$ patch -Np1 -i ../gcc-4.6.2-cross_compile-1.patch

patching file configure Hunk #1 succeeded at 2800 (offset -1 lines). patching file configure.ac Hunk #1 succeeded at 261 (offset -1 lines). kemudian dari dalam direktori gcc-build jalankan script configure, untuk persiapan kompilasi :
$ cd gcc-build $ ../gcc-4.6.2/configure \ --target=$LFS_TGT --prefix=/tools \ --disable-nls --disable-shared --disable-multilib \ --disable-decimal-float --disable-threads \ --disable-libmudflap --disable-libssp \ --disable-libgomp --disable-libquadmath \ --disable-target-libiberty --disable-target-zlib \ --enable-languages=c --without-ppl --without-cloog \ --with-mpfr-include=$(pwd)/../gcc-4.6.2/mpfr/src \ --with-mpfr-lib=$(pwd)/mpfr/src/.libs

setelah itu jalankan kompilasi, dan installasi :


$ make $ make install

buat symlink dari libgcc_eh.a ke libgcc.a


$ ln -vs libgcc.a `$LFS_TGT-gcc -print-libgcc-file-name | \ > sed 's/libgcc/&_eh/'` `/mnt/lfs/tools/bin/../lib/gcc/i686-lfs-linuxgnu/4.6.2/libgcc_eh.a' -> `libgcc.a'
24 Linux Fundamental : Linux From Scratch

INSTALLASI LINUX-API (Application Programming Interface) HEADER Linux API header sendiri dipakai oleh Kernel-API untuk di gunakan pada glibc, langkah2nya : - ekstrak paket linux-3.2.6.tar.xz :
$ tar Jxvf linux-3.2.6.tar.xz

- kemudian kita make, dan kita copy ke /toos/include


$ make headers_check $ make INSTALL_HDR_PATH=dest headers_install $ cp -rv dest/include/* /tools/include

INSTALLASI GLIBC Glibc adalah library utama di dalam system linux, di dalamnya terdapat rutin2 basic, spt untuk alokasi memori, pencarian direktori, buka/tutup file, baca/tulis file, penanganan string, pencarian pola2 tertentu, aritmatika dll. Tanpa glibc linux anda tidak dapat berjalan.

Langkah2 installasinya : extract glibc :


$ tar jxvf glibc-2.14.1.tar.bz2
25 Linux Fundamental : Linux From Scratch

Masuk ke dalam direktori glibc, kemudian lakukan patching terhadap bug2 glibc :
bash-4.2$ cd glibc-2.14.1 bash-4.2$ patch -Np1 -i ../glibc-2.14.1-gcc_fix-1.patch patching file nptl/sysdeps/pthread/pt-initfini.c patching file sysdeps/unix/sysv/linux/i386/sysdep.h bash-4.2$ patch -Np1 -i ../glibc-2.14.1-cpuid-1.patch ... ...

bikin direktori untuk building glibc, misal : glibc-build, kemudian masuk ke direktori tsb :
bash-4.2$ mkdir ../glibc-build/ bash-4.2$ cd ../glibc-build/

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

siapkan proses kompilasi :


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

lakukan kompilasi, dan installasi glibc :


$ make $ make install

26 Linux Fundamental : Linux From Scratch

AJUSTING THE TOOLCHAINS Sampai dengan langkah diatas, library C sudah terinstall, setiap tools yang di kompilasi dalam langkah2 selanjutnya harus di link melalui library tersebut, untuk itu crosscompiler specs files harus di pointing ke dinamic linker yang baru, yaitu di /tools semua dapat dilakukan dengan cara mengatur supaya spec files by default berpindah ke lokasi baru, perintahnya adalah sbb :
SPECS=`dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/specs \ $LFS_TGT-gcc -dumpspecs | sed \ -e 's@/lib\(64\)\?/ld@/tools&@g' \ -e "/^\*cpp:$/{n;s,$, -isystem /tools/include,}" > $SPECS \ echo "New specs file is: $SPECS unset SPECS New specs file is: /mnt/lfs/tools/bin/../lib/gcc/i686-lfs-linuxgnu/4.6.2/specs

untuk melakukan pengetestan apakah semua telah di lakukan dengan benar berikan perintah :
bash-4.2$ echo 'main(){}' > dummy.c bash-4.2$ $LFS_TGT-gcc -B/tools/lib dummy.c bash-4.2$ readelf -l a.out | grep ': /tools'

system akan memberi jawaban sbb :


[Requesting program interpreter: /tools/lib/ld-linux.so.2]

INSTALLASI BINUTILS TAHAP 2 Paket binutils mengandung linker, assembler, dan tools-tools lain untuk menangani file object. Buat direktori binutils-build pada direktori source, kemudian masuk ke direktori tsb :
# mkdir -v ../binutils-build # cd ../binutils-build
27 Linux Fundamental : Linux From Scratch

kemudian lakukan persiapan kompilasi :


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

setelah itu lakukan kompilasi dan installasi :


$ make $ make install

kemudian ketikkan perintah berikut utk adjust :


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

INSTALLASI GCC TAHAP 2 GCC versi 4.3 keatas, tidak memperbolehkan kita utk memulai mencari file dari root direktori tertentu yang di sebutkan dengan opsi : --prefix padahal startfile kita ada di direktori : /tools oleh sebab itu kita harus melakukan patch ke gcc tsb supaya mau kita arahkan dengan prefix. Perintah patch nya adalah :
bash-4.2$ patch -Np1 -i ../gcc-4.6.2-startfiles_fix-1.patch patching file gcc/gcc.c Hunk #1 succeeded at 6390 with fuzz 1 (offset 20 lines).

untuk menghindari kegagalan dalam mencari header, ketikkan :


cp -v gcc/Makefile.in{,.orig} sed 's@\./fixinc\.sh@-c true@' gcc/Makefile.in.orig > gcc/Makefile.in
28 Linux Fundamental : Linux From Scratch

kemudian ketikkan :
cp -v gcc/Makefile.in{,.orig} sed 's@\./fixinc\.sh@-c true@' gcc/Makefile.in.orig > gcc/Makefile.in

kemudian ketikkan :
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_INCLUDE_DIR #define STANDARD_INCLUDE_DIR 0 #define STANDARD_STARTFILE_PREFIX_1 "" #define STANDARD_STARTFILE_PREFIX_2 ""' >> $file touch $file.orig done

bila semua benar, maka system akan merespon :


`gcc/config/sparc/linux64.h' -> `gcc/config/sparc/linux64.h.orig' `gcc/config/sparc/linux.h' -> `gcc/config/sparc/linux.h.orig' `gcc/config/sparc/sysv4.h' -> `gcc/config/sparc/sysv4.h.orig' `gcc/config/i386/linux64.h' -> `gcc/config/i386/linux64.h.orig' `gcc/config/i386/linux.h' -> `gcc/config/i386/linux.h.orig' `gcc/config/i386/sysv4.h' -> `gcc/config/i386/sysv4.h.orig' `gcc/config/frv/linux.h' -> `gcc/config/frv/linux.h.orig' `gcc/config/vax/linux.h' -> `gcc/config/vax/linux.h.orig' `gcc/config/m68k/linux.h' -> `gcc/config/m68k/linux.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/cris/linux.h' -> `gcc/config/cris/linux.h.orig' `gcc/config/mips/linux64.h' -> `gcc/config/mips/linux64.h.orig' `gcc/config/mips/linux.h' -> `gcc/config/mips/linux.h.orig' `gcc/config/linux.h' -> `gcc/config/linux.h.orig' `gcc/config/microblaze/linux.h' -> `gcc/config/microblaze/linux.h.orig' `gcc/config/bfin/linux.h' -> `gcc/config/bfin/linux.h.orig' `gcc/config/alpha/linux.h' -> `gcc/config/alpha/linux.h.orig' `gcc/config/m32r/linux.h' -> `gcc/config/m32r/linux.h.orig' `gcc/config/sh/linux.h' -> `gcc/config/sh/linux.h.orig'
29 Linux Fundamental : Linux From Scratch

`gcc/config/mn10300/linux.h' -> `gcc/config/mn10300/linux.h.orig' `gcc/config/rs6000/linux64.h' -> `gcc/config/rs6000/linux64.h.orig' `gcc/config/rs6000/linux.h' -> `gcc/config/rs6000/linux.h.orig' `gcc/config/rs6000/sysv4.h' -> `gcc/config/rs6000/sysv4.h.orig' `gcc/config/s390/linux.h' -> `gcc/config/s390/linux.h.orig' `gcc/config/xtensa/linux.h' -> `gcc/config/xtensa/linux.h.orig'

bila mesin anda adalah x86_64, silakan unset multilib spec utk gcc, dan pastikan dia tidak terkoneksi dengan library dalam host, tempat anda melakukan kompilasi:
case $(uname -m) in x86_64) for file in $(find gcc/config -name t-linux64) ; do \ cp -v $file{,.orig} sed '/MULTILIB_OSDIRNAMES/d' $file.orig > $file done ;; esac

kemudian, silakan anda extract paket2 GMP, MPFR, dan MPC, letakkan dalam direktori gcc, dan kemudian rename direktori tsb menjadi nama yang pendek, perintahnya adalah :
$ tar -jxf ../mpfr-3.1.0.tar.bz2 $ mv -v mpfr-3.1.0 mpfr $ tar -Jxf ../gmp-5.0.4.tar.xz $ mv -v gmp-5.0.4 gmp $ tar -zxf ../mpc-0.9.tar.gz $ mv -v mpc-0.9 mpc

setelah itu, anda buat direktori untuk building, misalnya gcc-build, dan masuk ke dalam direktori tsb :
$ mkdir -v ../gcc-build $ cd ../gcc-build

setelah itu, lakukan tahapan persiapan kompilasi :


CC="$LFS_TGT-gcc -B/tools/lib/" \ AR=$LFS_TGT-ar RANLIB=$LFS_TGT-ranlib \ ../gcc-4.6.2/configure --prefix=/tools \ --with-local-prefix=/tools --enable-clocale=gnu \ --enable-shared --enable-threads=posix \ --enable-__cxa_atexit --enable-languages=c,c++ \ --disable-libstdcxx-pch --disable-multilib \
30 Linux Fundamental : Linux From Scratch

--disable-bootstrap --disable-libgomp \ --without-ppl --without-cloog \ --with-mpfr-include=$(pwd)/../gcc-4.6.2/mpfr/src \ --with-mpfr-lib=$(pwd)/mpfr/src/.libs

kemudian lakukan kompilasi :


$ make

dan installasi :
$ make install

setelah itu buat symlink :


bash-4.2$ ln -vs gcc /tools/bin/cc `/tools/bin/cc' -> `gcc'

untuk memastikan lagi, apakah interpreter lib nya sudah benar arahnya (/tools/lib/ldlinux.so.2) silakan ketikkan :
echo 'main(){}' > dummy.c cc dummy.c readelf -l a.out | grep ': /tools'

system akan merespon :


[Requesting program interpreter: /tools/lib/ld-linux.so.2]

setelah pengecekan, file dummy.c dan a.out utk test tadi bisa anda hapus :
$ rm -v dummy.c a.out

INSTALLASI TCL Paket ini (tcl), dan 3 paket berikutnya (Expect, DejaGNU, dan Check) diinstall untuk mendukung running-test dari gcc, binutils dan beberapa paket lainnya. Untuk installasi TCL, ikuti langkah2 berikut : extract paket tcl, kemudian masuk ke dalam direktori tcl8.5.11/unix, dan lakukan tahap tahap persiapan installasi :
$ tar zxvf tcl8.5.11-src.tar.gz
31 Linux Fundamental : Linux From Scratch

$ cd tcl8.5.11/unix/ $ ./configure prefix=/tools/

kemudian lakukan kompilasi :


$ make

Setelah proses kompilasi selesai lakukan test :


$ TZ=UTC make test

respon dari system akan spt ini :


Tests ended at Mon Jun 04 16:39:41 UTC 2012 all.tcl: Total 27009 Passed 25894 Failed 0 Sourced 137 Test Files. Number of tests skipped for each constraint: 9 !ieeeFloatingPoint 3 asyncPipeChan 76 bigEndian 5 bug-3057639 4 dontCopyLinks 61 emptyTest 2 hasIsoLocale 1 impossible 1 knownBadTest 31 knownBug 2 largefileSupport 100 localeRegexp 12 longIs64bit 14 macosxFileAttr 17 memory 42 nonPortable 5 notNetworkFilesystem 8 nt 4 readonlyAttr 1 testWinCPUID 7 testaccessproc 1 testexprparser && !ieeeFloatingPoint 8 testopenfilechannelproc 7 teststatproc 128 testthread 1 testwinclock 21 testwordend 3 threaded 3 unknownFailure 525 win
Linux Fundamental : Linux From Scratch

Skipped

1115

32

win2000orXP

kemudian lakukan installasi :


$ make install

buat library hasil kompilasi jadi writeable bagi usernya :


bash-4.2$ chmod -v u+w /tools/lib/libtcl8.5.so mode of `/tools/lib/libtcl8.5.so' changed to 0755 (rwxr-xr-x)

kemudian, install private headernya :


bash-4.2$ make install-private-headers

Installing private header files kemudian buat symlink spt ini :


bash-4.2$ ln -sv tclsh8.5 /tools/bin/tclsh `/tools/bin/tclsh' -> `tclsh8.5'

berikut adalah summary dari yg kita install :


tclsh8.5 --> Tcl command shell tclsh ---> A link to tclsh8.5 ---> The Tcl library libtcl8.5.so

libtclstub8.5.a ---> The Tcl Stub library

INSTALLASI EXPECT Program ini berguna untuk membuat script dialog dengan program lain. Langkah2 installasinya adalah : seperti biasa extract dan masuk ke direktori expect :
$ tar zxvf expect5.45.tar.gz $ cd expect5.45

buatlah supaya skrip konfigurasi untuk menggunakan /bin/stty sebagai pengganti dari /usr/local/bin/stty, yang mungkin ada dalam system anda. cp -v configure{,.orig}
33 Linux Fundamental : Linux From Scratch

sed 's:/usr/local/bin:/bin:' configure.orig > configure

kemudian jalankan configure untuk persiapan proses kompilasi :


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

setelah itu lakukan kompilasi, testing, dan installasi :


$ make $ make test $ make SCRIPTS="" install

parameter SCRIPTS="" berguna tidak usah menginstall paket expect tambahan yang tidak kita butuhkan. INSTALLASI DEJAGNU Paket ini berisi framework untuk melakukan testing dari program2 lain. Langkah2nya adalah : extract, dan masuk ke dalam direktori hasil extract :
$ tar zxvf dejagnu-1.5.tar.gz $ cd dejagnu-1.5

kemudian lakukan proses building, installasi dan testing :


$ make install $ make test

hasil dari installasi diatas adalah runtest, yaitu wrapper script yang berguna utk melakukan testing dari program2 tertentu. INSTALLASI CHECK Check adalah framework unit testing untuk bahasa C. Langkah2 installasinya adalah : extract file check :
34 Linux Fundamental : Linux From Scratch

$ tar zxvf check-0.9.8.tar.gz

setelah di extract kemudian masuk ke direktori check :


$ cd check-0.9.8

lakukan tahap persiapan installasi :


$ ./configure --prefix=/tools

lalu lakukan kompilasi, check dan installasi :


$ make $ make check $ make install

hasil installasinya adalah :


libcheck.{a,so} --> lib ini berisi fungsi2 yg bisa di panggil dari program2

pengetestan. INSTALLASI NCURSES Paket ini berisi library untuk menangani terminal dan karakter2nya secara independent. Langkah2 installasinya : extract file ncurses, dan masuk ke direktori hasil extractnya :
$ tar zxvf ncurses-5.9.tar.gz $ cd ncurses-5.9

lakukan tahapan persiapan installasi dan ./configure --prefix=/tools --with-shared \


--without-debug --without-ada --enable-overwrite

lakukan kompilasi dan installasi :


$ make $ make install
35 Linux Fundamental : Linux From Scratch

INSTALLASI BASH Berisi paket Bourne-Again SHell. Yaitu shell unix standart. Lakukan extract paket bash, dan masuk ke direktori bash hasil extract :
$ tar zxvf bash-4.2.tar.gz $ cd bash-4.2

setelah itu lakukan patch terhadap bash :


bash-4.2$ patch -Np1 -i ../bash-4.2-fixes-4.patch patching file assoc.c patching file builtins/declare.def patching file builtins/fc.def patching file builtins/printf.def patching file builtins/read.def patching file execute_cmd.c patching file expr.c patching file lib/glob/gmisc.c patching file lib/readline/callback.c patching file lib/readline/vi_mode.c patching file parse.y patching file patchlevel.h patching file pathexp.c patching file print_cmd.c patching file shell.h patching file sig.c patching file subst.c patching file subst.h patching file support/shobj-conf patching file variables.c patching file variables.h

setelah patching selesai, lakukan tahap persiapan installasi :


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

kemudian lakukan kompilasi :


$ make $ make test
36 Linux Fundamental : Linux From Scratch

$ make install

- setelah itu buat symlink bash ke /tools/bin/sh


$ ln -vs bash /tools/bin/sh

INSTALLASI BZIP2 Fungsi dari paket bzip2 adalah tools untuk melakukan compressing dan decompressing file (bz2), langkah2nya : - Extract source code bzip2, dan masuk ke dalam direktori hasil extract :
$ tar zxvf bzip2-1.0.6.tar.gz $ cd bzip2-1.0.6

kemudian lakukan kompilasi dan installasi :


$ make

install make dengan prefix pada direktori /tools


$ make PREFIX=/tools install

INSTALLASI COREUTILS Paket ini berisi utility untuk menampilkan dan basic setting system. Langkah2 installasi seperti biasa : - Extract source code dari coreutils, dan masuk ke dalam direktori coreutils :
$ tar Jxvf coreutils-8.15.tar.xz $ cd coreutils-8.15

- kemudian lakukan tahapan persiapan kompilasi :


$ ./configure --prefix=/tools --enable-install-program=hostname
37 Linux Fundamental : Linux From Scratch

- kemudian lakukan kompilasi :


$ make

- kemudian lakukan testing :


$ make RUN_EXPENSIVE_TESTS=yes check

- kemudian lakukan installasi paket :


$ make install

- kemudian kopikan su ke dalam /tools/bin/su-tools, karena perintah diatas menolak installasi su dengan user biasa (lfs), maka harus kopikan secara manual :
$ cp -v src/su /tools/bin/su-tools

INSTALLASI DIFFUTILS Paket ini berisi program untuk melihat perbedaan dari file atau direktori, langkah2 installasinya : - Extract source code dari diffutils :
$ tar zxvf diffutils-3.2.tar.gz $ cd diffutils-3.2

- kemudian lakukan tahapan persiapan installasi :


$ ./configure --prefix=/tools

- kemudian lakukan kompilasi, test, dan installasi :


$ make $ make check $ make install

INSTALLASI PAKET FILE


38 Linux Fundamental : Linux From Scratch

Paket ini berisi program untuk melihat jenis file. Langkah2 installasinya : - lakukan extract dari source code, dan masuk ke dalam direktorinya : $ tar zxvf file-5.10.tar.gz $ cd file-5.10 - kemudian seperti biasa lakukan tahapan persiapan installasi dengan menyebutkan prefix installasinya di /toos :
$ ./configure --prefix=/tools

- kemudian lakukan kompilasi, check, dan installasi dengan perintah :


$ make $ make check $ make install

INSTALLASI PAKET FINDUTILS Paket ini berisi program utility yang berfungsi untuk melakukan pencarian files, termasuk pencarian secara rekursif. Langkah2 installasinya : - lakukan extract dari source code, dan masuk ke dalam direktorinya :
$ tar zxvf findutils-4.4.2.tar.gz $ cd findutils-4.4.2

- kemudian seperti biasa lakukan tahapan persiapan installasi dengan menyebutkan prefix installasinya di /toos :
$ ./configure --prefix=/tools

- kemudian lakukan kompilasi, check, dan installasi dengan perintah :


$ make $ make check $ make install
39 Linux Fundamental : Linux From Scratch

INSTALLASI GAWK GAWK berisi program untuk melakukan manipulasi text file : Langkah2 installasinya : - lakukan extract dari source code, dan masuk ke dalam direktorinya :
bash-4.2$ tar jxf gawk-4.0.0.tar.bz2 bash-4.2$ cd gawk-4.0.0

- kemudian seperti biasa lakukan tahapan persiapan installasi dengan menyebutkan prefix installasinya di /toos :
$ ./configure --prefix=/tools

- kemudian lakukan kompilasi, check, dan installasi dengan perintah :


$ make $ make check $ make install

INSTALLASI GETTEXT Program ini berisi paket/utility untuk internasionalisasi dan lokalisasi, Memungkinkan untuk sebuah program di kompilasi dengan NLS (Native Language Support), dengan demikian memungkinkan untuk menampilkan bahasa asli dari masing2 user. Langkah2 installasinya :

- lakukan extract dari source code, dan masuk ke dalam direktorinya :


bash-4.2$ tar zxf gettext-0.18.1.1.tar.gz bash-4.2$ cd gettext-0.18.1.1 /gettext-tools

- kemudian lakukan tahapan persiapan installasi :


./configure --prefix=/tools --disable-shared
40 Linux Fundamental : Linux From Scratch

- kemudian lakukan kompilasi paket dengan perintah :


$ make -C gnulib-lib $ make -C src msgfmt

- karena anda tidak melakukan installasi sebagai root, maka kopikan file hasil kompilasi : msgfmt ke dalam direktori /tools/bin :
$ cp -v src/msgfmt /tools/bin

INSTALLASI GREP Grep berisi program untuk melakukan pencarian terhadap pola2 tertentu pada files, atau text tertentu.

Langkah2 installasinya :

- lakukan extract dari source code, dan masuk ke dalam direktorinya :


bash-4.2$ tar Jxf grep-2.10.tar.xz bash-4.2$ cd grep-2.10

- lakukan tahapan persiapan installasi grep :


./configure --prefix=/tools \ --disable-perl-regexp

- kemudian lakukan kompilasi, check, dan installasi dengan perintah :


$ make $ make check $ make install

INSTALLASI GZIP Berisi program untuk melakukan kompresi dan dekompresi terhadap files,
41 Linux Fundamental : Linux From Scratch

Langkah2 installasinya : - lakukan extract dari source code, dan masuk ke dalam direktorinya :
bash-4.2$ tar zxf gzip-1.4.tar.gz bash-4.2$ cd gzip-1.4

- kemudian seperti biasa lakukan tahapan persiapan installasi dengan menyebutkan prefix installasinya di /toos :
$ ./configure --prefix=/tools

- kemudian lakukan kompilasi, check, dan installasi dengan perintah :


$ make $ make check $ make install

INSTALLASI PAKET M4 Paket ini berisi macro processor.

Langkah2 installasinya : - lakukan extract dari source code, dan masuk ke dalam direktorinya :
bash-4.2$ tar jxf m4-1.4.16.tar.bz2 bash-4.2$ cd m4-1.4.16

- kemudian seperti biasa lakukan tahapan persiapan installasi dengan menyebutkan prefix installasinya di /toos :
$ ./configure --prefix=/tools

- kemudian lakukan kompilasi, check, dan installasi dengan perintah :


$ make $ make check
42 Linux Fundamental : Linux From Scratch

$ make install

INSTALLASI PAKET MAKE Make berisi program/tools untuk melakukan kompilasi file,

Langkah2 installasinya : - lakukan extract dari source code, dan masuk ke dalam direktorinya :
bash-4.2$ tar jxf make-3.82.tar.bz2 bash-4.2$ cd make-3.82

- kemudian seperti biasa lakukan tahapan persiapan installasi dengan menyebutkan prefix installasinya di /toos :
$ ./configure --prefix=/tools

- kemudian lakukan kompilasi, check, dan installasi dengan perintah :


$ make $ make check $ make install

INSTALLASI PAKET PATCH Paket ini berisi program untuk melakukan modifikasi, atau pembuatan files baru dengan cara memasang patch, patch ini membutuhkan diff Langkah2 installasinya : - lakukan extract dari source code, dan masuk ke dalam direktorinya :
bash-4.2$ tar jxf patch-2.6.1.tar.bz2 bash-4.2$ cd patch-2.6.1

- kemudian seperti biasa lakukan tahapan persiapan installasi dengan menyebutkan prefix installasinya di /toos : $ ./configure --prefix=/tools
43 Linux Fundamental : Linux From Scratch

- kemudian lakukan kompilasi, check, dan installasi dengan perintah :


$ make $ make check $ make install

INSTALLASI PERL Paket ini berisi interpreter PERL (Practical Extraction and Report Language) Langkah2 installasi : - seperti biasa extract source code dari perl, dan masuk ke dalam direktori hasil extract :
bash-4.2$ tar jxf perl-5.14.2.tar.bz2 bash-4.2$ cd perl-5.14.2

- kemudian lakukan patch :


bash-4.2$ patch -Np1 -i ../perl-5.14.2-libc-1.patch patching file hints/linux.sh

- setelah itu lakukan tahapan persiapan installasi dengan menjalankan configure :


$ sh Configure -des -Dprefix=/tools

- kemudian lakukan building :


$ make

- setelah kompilasi selesai, silakan kopikan interpreternya, yaitu :


perl cpan/podlators/pod2man

ke dalam direktori /tools/bin


$ cp -v perl cpan/podlators/pod2man /tools/bin

- lalu buat direktori lib/perl5/5.14.2 di dalam tools untuk menyimpan library dari perl, dan kopikan lib hasil kompilasi ke dalamnya :
44 Linux Fundamental : Linux From Scratch

$ mkdir -pv /tools/lib/perl5/5.14.2 $ cp -Rv lib/* /tools/lib/perl5/5.14.2

INSTALLASI PAKET SED Paket ini berisi program untuk melakukan modifikasi secara streaming (langsung tanpa membuka editor) terhadap files, Langkah2 installasinya : - lakukan extract dari source code, dan masuk ke dalam direktorinya :
bash-4.2$ tar jxf sed-4.2.1.tar.bz2 bash-4.2$ cd sed-4.2.1

- kemudian seperti biasa lakukan tahapan persiapan installasi dengan menyebutkan prefix installasinya di /toos :
$ ./configure --prefix=/tools

- kemudian lakukan kompilasi, check, dan installasi dengan perintah :


$ make $ make check $ make install

INSTALLASI PAKET TAR Paket ini berisi program untuk melakukan pengarsipan files2 kedalam satu file berekstensi .tar

Langkah2 installasinya : - lakukan extract dari source code, dan masuk ke dalam direktorinya : bash-4.2$ tar jxf tar-1.26.tar.bz2 bash-4.2$ cd tar-1.26 - kemudian seperti biasa lakukan tahapan persiapan installasi dengan menyebutkan
45 Linux Fundamental : Linux From Scratch

prefix installasinya di /toos : $ ./configure --prefix=/tools - kemudian lakukan kompilasi, check, dan installasi dengan perintah :
$ make $ make check $ make install

INSTALLASI PAKET TEXTINFO Text info berisi paket program untuk melakukan pembacaan, penulisan dan konversi dari halaman info manual. Langkah2 installasinya : - lakukan extract dari source code, dan masuk ke dalam direktorinya :

- kemudian seperti biasa lakukan tahapan persiapan installasi dengan menyebutkan prefix installasinya di /toos :
$ ./configure --prefix=/tools

- kemudian lakukan kompilasi, check, dan installasi dengan perintah :


$ make $ make check $ make install

INSTALLASI PAKET XZ Text info berisi paket program kompresi, dekompresi files dengan format file .xz

Langkah2 installasinya : - lakukan extract dari source code, dan masuk ke dalam direktorinya :
46 Linux Fundamental : Linux From Scratch

bash-4.2$ tar jxf xz-5.0.3.tar.bz2 bash-4.2$ cd xz-5.0.3

- kemudian seperti biasa lakukan tahapan persiapan installasi dengan menyebutkan prefix installasinya di /toos :
$ ./configure --prefix=/tools

- kemudian lakukan kompilasi, check, dan installasi dengan perintah :


$ make $ make check $ make install

STRIPPING Langkah berikutnya adalah melakukan stripping, langkah ini sebenernya bersifat optional, akan tetapi akan membuat LFS anda menjadi lebih ramping, dan memerlukan lebih sedikit kapasitas harddisk, bila dibandingkan dengan dengan tanpa di stripping. Untuk membuang library debug, dan membuang yang tidak dibutuhkan ketikkan perintah :
$ strip --strip-debug /tools/lib/* $ strip --strip-unneeded /tools/{,s}bin/*

kemudian untuk memberikan ruang lebih banyak lagi anda bisa juga menjalankan perintah :
$ rm -rf /tools/{,share}/{info,man,doc}

MERUBAH KEPEMILIKAN DARI DIREKTORI /tools Saat ini, direktori $LFS/tools dimiliki oleh user lfs , user yang hanya ada pada sistem host saat melakukan kompilasi. Jika $LFS/tools direktori disimpan sebagai lfs, maka file2 dan direktori tersebut dimiliki oleh userID yang tidak terdaftar kelak pada system LFS. Ini berbahaya karena user yang dibuat kemudian bisa mendapatkan ID yang sama dgn yg dimiliki $LFS/tools dan semua file di dalamnya, sehingga bisa mengakses file-file.
47 Linux Fundamental : Linux From Scratch

Untuk menghindari masalah ini, Anda bisa menambahkan pengguna lfs ke sistem LFS baru kemudian saat membuat file /etc/passwd, hal ini bisa juga diatasi dengan cara menetapkan ID pengguna dan ID group yang sama dgn yg ada pada host saat melakukan kompilasi. Namun bila anda tidak mau repot2 dan beresiko, anda bisa merubah kepemilikannya menjadi root, karena dimana2 nomor userID dan groupID utk root, selalu bernomor 0.
$ su # chown -R root:root $LFS/tools

BAB 6 MENGINSTALL SYSTEM DASAR LFS

Dalam bahasan kita kini, kita memasuki tahap membangun sistem LFS yang sesungguhnya. Artinya, kita akan melakukan chroot ke dalam sistem Linux mini sementara, membuat sedikit persiapan akhir, dan kemudian mulai menginstal paketnya. Instalasi software ini sebenarnya sangatlah mudah. Meskipun dalam banyak kasus petunjuk instalasi bisa dibuat lebih pendek/lebih ringkas, tapi kami memilih untuk menyediakan petunjuk lengkap untuk setiap paket untuk meminimalkan kemungkinan terjadinya kesalahan. Kuncinya anda harus belajar dan mengetahui fungsi dan kerja dari setiap paket, dan mengapa kita membutuhkan paket tersebut. Kami tidak menyarankan menggunakan optimasi. Mungkin dengan optimasi dapat membuat sebuah program berjalan sedikit lebih cepat, tetapi mereka juga dapat
48 Linux Fundamental : Linux From Scratch

menyebabkan kesulitan pada saat kompilasi dan masalah ketika program tersebut dijalankan. Lakukan kompilasi pada paket2 itu secara satu persatu, dan ikuti petunjuknya dengan seksama, jangan melakukan kompilasi secara bersamaan pada beberapa paket, walau itu akan menghemat waktu, tapi ada kemungkinan akan terjadi error, dan LFS kita tidak dapat berjalan

MEMPERSIAPKAN FILESYSTEM VIRTUAL KERNEL Beberapa file dari system di export oleh kernel, diakses dari dan ke kernel sendiri melalui file2 tersebut (ingat konsep unix everythins is files). File2 ini langsung terhubung ke memory dan tidak memerlukan space pada harddisk. Langkah pertama buatlah direktori dev, proc dan sys :
# mkdir -v $LFS/{dev,proc,sys}

kemudian buatlah file /dev/console dan /dev/null dengan nomor node tertentu, karena kedua file tsb dibutuhkan saat system kernel melakukan boot up, perintahnya adalah :
# mknod -m 600 $LFS/dev/console c 5 1 # mknod -m 666 $LFS/dev/null c 1 3

kemudian lakukan mounting mirroring dari /dev (device aktif dari linux host), ke dalam $LFS/dev
# mount -v --bind /dev $LFS/dev

setelah itu silakan mounting semua filesystem virtual kernel yang lain : # mount -vt devpts devpts $LFS/dev/pts
# mount -vt tmpfs shm $LFS/dev/shm # mount -vt proc proc $LFS/proc # mount -vt sysfs sysfs $LFS/sys

PAKET MANAJEMEN Manajemen Paket merupakan tambahan sering kali diminta dalam LFS. Sebuah Package Manager memungkinkan pelacakan instalasi file-file sehingga mudah untuk menghapus dan meng-upgrade paket2, file2 biner dan library, Bagian ini tidak akan berbicara dan merekomendasikan paket manajer paket tertentu (spt
49 Linux Fundamental : Linux From Scratch

rpm, deb dll). Tapi teknik bagaimana mereka bekerja. Teknik manajemen paket Teknik Dihafal Teknik ini biasanya dimiliki oleh orang2 tertentu yang memang sudah ahli dan mengenali file2 apa saja yang diinstall. Teknik diinstall pada direktori terpisah Setiap paket di install pada direktori2 terpisah, sehingga mudah untuk di kenali dan dipisah2kan. Teknik Symlink Untuk mengatur dan memanajemen paket2 yang diinstall, anda bisa juga menginstall pada direktori tertentu, kemudian di symlink ke direktori tertentu, agar hasil kompilasinya dapat di eksekusi dengan baik. Teknik Timestamp Dalam teknik ini, file2 yang di install akan di catat time stamp nya, sebelum di install, kemudian di masukkan dalam log tertentu, supaya di kemudian hari kita dapat dengan mudah menemukan file2 mana yang diinstall. Teknik skrip installasi Dalam teknik ini kita mengandalkan skrip installasi, dan merecord apa saja yang di lakukan, sehingga manajemen paket dapat dilakukan. Anda bisa menggunakan environment variable LD_PRELOAD, untuk di arahkan ke library tertentu sebelum installasi. Library yang di panggil ini melakukan tracking dan pencatatan terhadap paket2 yang diinstall (mis dgn perintah cp, install, mv dll) Teknik Menggunakan Paket Archive Ini adalah cara umum, yang banyak digunakan pada distro2 umum, spt RPM, DEB dll.

Teknik menggunakan User Based Disini paket2 diinstall berdasarkan user2 tertentu, dan pada direktori2 tertentu. Sehingga hasil installasinya mudah untuk di manages berdasar user yang menginstall.

50 Linux Fundamental : Linux From Scratch

MASUK KE CHROOT ENVIRONTMENT Setelah semua kompilasi, dan installasi pada langkah2 sebelumnya berhasil semua, kita sekarang masuk ke chroot, perintahnya adalah :
# chroot "$LFS" /tools/bin/env -i \ HOME=/root TERM="$TERM" PS1='\u:\w\$ ' \ PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \ /tools/bin/bash --login +h

dan anda akan memasuki lingkungan baru, kira2 jadi spt ini :
I have no name!:/# ls a.out dev lost+found proc sources spek.sh sys tools binutils-build dummy.c I have no name!:/# pwd /

setelah ini anda siap untuk melanjutkan pada langkah berikutnya MEMBUAT DIREKTORI Setelah anda memasuki lingkungan chroot, langkah selanjutnya adalah membuat direktori standart, perintahnya adalah :
mkdir -pv /{bin,boot,etc/{opt,sysconfig},home,lib,mnt,opt,run} mkdir -pv /{media/{floppy,cdrom},sbin,srv,var} install -dv -m 0750 /root install -dv -m 1777 /tmp /var/tmp mkdir -pv /usr/{,local/}{bin,include,lib,sbin,src} mkdir -pv /usr/{,local/}share/{doc,info,locale,man} mkdir -v /usr/{,local/}share/{misc,terminfo,zoneinfo} mkdir -pv /usr/{,local/}share/man/man{1..8} for dir in /usr /usr/local; do ln -sv share/{man,doc,info} $dir done case $(uname -m) in x86_64) ln -sv lib /lib64 && ln -sv lib /usr/lib64 ;;
51 Linux Fundamental : Linux From Scratch

esac mkdir -v /var/{log,mail,spool} ln -sv /run /var/run ln -sv /run/lock /var/lock mkdir -pv /var/{opt,cache,lib/{misc,locate},local}

Secara default direktori2 tersebut mempunyai permission 755, jadi direktori2 tertentu harus kita rubah sesuai dengan peruntukannya, sebagai contoh : /root --> semua user tidak di perbolehkan akses kecuali superuser/root /tmp , /var/tmp --> seharusnya semua bisa mengakses(baca tulis) ke direktori ini , karena direktori ini disediakan untuk proses temporary. Membuat File Essensial dan symlink Beberapa program dan library2 tertentu terinstall pada direktori yang belum seharusnya (sesuai dengan path standart), untuk itu kita perlu membuat symlink dari bebarapa executable program menuju direktori2 tertentu, silakan anda ketikkan perintah :
ln -sv /tools/bin/{bash,cat,echo,pwd,stty} /bin ln -sv /tools/bin/perl /usr/bin ln -sv /tools/lib/libgcc_s.so{,.1} /usr/lib ln -sv /tools/lib/libstdc++.so{,.6} /usr/lib sed 's/tools/usr/' /tools/lib/libstdc++.la > /usr/lib/libstdc++.la ln -sv bash /bin/sh

Beberapa system linux mengatur list dan filesystem yang di mountingnya melalui file /etc/mtab. Secara normal file ini sebenarnya otomatis tercipta ketika kita melakukan mounting terhadap suatu filesystem, tetapi karena kita tidak memounting apa2 pada lingkungan chroot , maka kita harus membuat file /etc/mtab kosong. Perintahnya adalah :
touch /etc/mtab

Setelah itu kita juga harus membuat file /etc/passwd yang berisi user2 dasar, yaitu root, bin, dan nobody , perintahnya kurang lebih :
cat > /etc/passwd << "EOF" root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/dev/null:/bin/false nobody:x:99:99:Unprivileged User:/dev/null:/bin/false EOF
52 Linux Fundamental : Linux From Scratch

tanda x, bukanlah password yg sebenarnya, password yg sebenarnya akan kita set kemudian. Setelah kita membuat /etc/passwd, kita harus membuat /etc/group untuk mendefinisikan group2 dasar terlebih dahulu, perintahnya adalah :
cat > /etc/group << "EOF" root:x:0: bin:x:1: sys:x:2: kmem:x:3: tty:x:4: tape:x:5: daemon:x:6: floppy:x:7: disk:x:8: lp:x:9: dialout:x:10: audio:x:11: video:x:12: utmp:x:13: usb:x:14: cdrom:x:15: mail:x:34: nogroup:x:99: EOF

kemudian untuk merubah prompt I have no name!, saat kita memasuki chroot, silakan ketik :
exec /tools/bin/bash --login +h

kemudian buat file2 btmp, lastlog, wtmp) dan ubah kepemilikannya sesuai dengan peruntukannya, jalankan perintah berikut :
touch chgrp chmod chmod /var/run/utmp /var/log/{btmp,lastlog,wtmp} -v utmp /var/run/utmp /var/log/lastlog -v 664 /var/run/utmp /var/log/lastlog -v 600 /var/log/btmp

kegunaan dari file tersebut adalah : /var/run/utmp mencatat user yang sedang aktif login /var/run/wtmp mencatat aktifitas login dan logout dari user
53 Linux Fundamental : Linux From Scratch

/var/run/btmp mencatat aktifitas kegagalan login LINUX API HEADER Linux API Header menyediakan kernel API, yang digunakan oleh glibc. Untuk melakukan installasi API Header, masuk ke dalam direktori source dari kernel :
cd /sources/linux-3.2.6

kemudian ketikkan perintah :


make mrproper

setelah itu lakukan installasi, dan pengkopian ke include direktori, dengan mengetik perintah :
make headers_check make INSTALL_HDR_PATH=dest headers_install find dest/include \( -name .install -o -name ..install.cmd \) delete cp -rv dest/include/* /usr/include

Ringkasan dari API Header adalah : header yg terinstall :


/usr/include/asm/*.h, /usr/include/asm-generic/*.h, /usr/include/drm/*.h, /usr/include/linux/*.h, /usr/include/mtd/*.h, /usr/include/rdma/*.h, /usr/include/scsi/*.h, /usr/include/sound/*.h,

/usr/include/video/*.h, /usr/include/xen/*.h direktori terinstall :


/usr/include/asm, /usr/include/asm-generic, /usr/include/drm, /usr/include/linux, /usr/include/mtd, /usr/include/rdma, /usr/include/scsi, /usr/include/sound, /usr/include/video, /usr/include/xen

keterangan : /usr/include/asm/*.h The Linux API ASM Headers /usr/include/asm-generic/*.h The Linux API ASM Generic Headers /usr/include/drm/*.h The Linux API DRM Headers /usr/include/linux/*.h The Linux API Linux Headers /usr/include/mtd/*.h The Linux API MTD Headers /usr/include/rdma/*.h The Linux API RDMA Headers /usr/include/scsi/*.h The Linux API SCSI Headers
54 Linux Fundamental : Linux From Scratch

/usr/include/sound/*.h The Linux API Sound Headers /usr/include/video/*.h The Linux API Video Headers /usr/include/xen/*.h The Linux API Xen Headers

INSTALLASI MANPAGES Man pages berisi pengolahan dan penampilan halaman manual dari linux, untuk menginstallnya langkah2nya adalah :

- Extract source code dan masuk ke dalam direktorinya :


root:/sources# tar zxf man-pages-3.35.tar.gz root:/sources# cd man-pages-3.35 root:/sources/man-pages-3.35#

- kemudian lakukan kompilasi, dan installasi :


# make install

GLIBC

Glibc merupakan library dasar dalam linux, INSTALLASI GLIBC System building glibc sebenarnya akan bisa terinstall dengan baik Meskipun spec file dari compiler sudah diarahkan ke /tools, tapi specs dan linker tidak dapat di setting sebelum glibc di install, karena glibc autoconf test akan memberikan hasil yang salah membuat proses build menjadi gagal.

55 Linux Fundamental : Linux From Scratch

ketika menjalankan make install, script memanggil test-installation.pl untuk melakukan test dari glibc baru yg terinstall, tapi karena toolchains masih di pointing ke direktori /tools, test tersebut akan membawa kita menuju pada glibc yang salah. Kita dapat memaksa skrip tersebut untuk melakukan pemeriksaan glibc yang kita install dengan perintah :
DL=$(readelf -l /bin/sh | sed -n 's@.*interpret.*/tools\(.*\)]$@\1@p') sed -i "s|libs -o|libs -L/usr/lib -Wl,-dynamic-linker=$DL -o|" \ scripts/test-installation.pl unset DL

kemudian utk mengatasi bug pada skrip test-installation.pl yang mana skrip ini mencoba untuk melakukan link ke library yang tidak terinstall pada saat make install, maka perintahnya dirubah menjadi :
sed -i -e 's/"db1"/& \&\& $name ne "nss_test1"/' scripts/testinstallation.pl

ldd shell script juga berisi sintaks bash yang spesifik, rubahlah default interpreter jadi /bin/bash , krn dalam kasus lain /bin/sh juga terinstall, maka berilah perintah :
sed -i 's|@BASH@|/bin/bash|' elf/ldd.bash.in

setelah itu pasang beberapa patch berikut untuk memperbaiki bug dalam glibc (yg kemungkinan bisa menyebabkan crash/core dump), jalankan perintah
patch -Np1 -i ../glibc-2.14.1-fixes-1.patch patch -Np1 -i ../glibc-2.14.1-sort-1.patch

juga pasang patch berikut, untuk mencegah terjadinya bug, karena di kompilasi dengan gcc 4.6.2 :
patch -Np1 -i ../glibc-2.14.1-gcc_fix-1.patch

utk menghindari terjadinya stack imbalance, jalankan :


sed -i '195,213 s/PRIVATE_FUTEX/FUTEX_CLOCK_REALTIME/' \ nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timed{rd,wr}lock.S

BUILDING GLIBC
56 Linux Fundamental : Linux From Scratch

Dokumentasi dalam glibc, menyarankan kita untuk membuat direktori lain saat proses building, untuk itu buatlah direktori baru, dan masuk ke dalamnya :
mkdir -v ../glibc-build cd ../glibc-build

kemudian, seperti sebelumnya, pada saat kita installasi glibc untuk /tools, kita juga harus menambahkan compiler cflag sesuai dengan mesin kita, dengan menjalankan perintah :
case `uname -m` in i?86) echo "CFLAGS += -march=i486 -mtune=native -O3 -pipe" > configparms ;; esac

langkah selanjutnya kita persiapkan proses kompilasi glibc :


../glibc-2.14.1/configure --prefix=/usr \ --disable-profile --enable-add-ons \ --enable-kernel=2.6.25 --libexecdir=/usr/lib/glibc

opsi libexecdir=/usr/lib/glibc berguna untuk memberitahu lokasi dari pt_chown program, dari defaultnya di /usr/libexec berubah ke /usr/lib/glibc setelah itu jalankan proses kompilasi :
make

sebelum menjalankan test, copy file dari source nya ke build directory , dan kemudian jalankan testnya :
cp -v ../glibc-2.14.1/iconvdata/gconv-modules iconvdata make -k check 2>&1 | tee glibc-check-log grep Error glibc-check-log

kemudian buat file /etc/ld.so.conf :


touch /etc/ld.so.conf

setelah itu install glibc, dengan perintah :


make install

apabila semua berhasil, maka akan ada baris kurang lebih spt ini, diakhir installasi :
57 Linux Fundamental : Linux From Scratch

Your new glibc installation seems to be ok. make[1]: Leaving directory `/sources/glibc-2.14.1'

kemudian install NIS dan RPC header,


cp -v ../glibc-2.14.1/sunrpc/rpc/*.h /usr/include/rpc cp -v ../glibc-2.14.1/sunrpc/rpcsvc/*.h /usr/include/rpcsvc cp -v ../glibc-2.14.1/nis/rpcsvc/*.h /usr/include/rpcsvc

kemudian, untuk setting lokal anda dapat ketikkan :


mkdir -pv localedef localedef localedef localedef localedef localedef localedef localedef localedef localedef localedef localedef localedef localedef localedef localedef localedef /usr/lib/locale -i cs_CZ -f UTF-8 cs_CZ.UTF-8 -i de_DE -f ISO-8859-1 de_DE -i de_DE@euro -f ISO-8859-15 de_DE@euro -i de_DE -f UTF-8 de_DE.UTF-8 -i en_HK -f ISO-8859-1 en_HK -i en_PH -f ISO-8859-1 en_PH -i en_US -f ISO-8859-1 en_US -i en_US -f UTF-8 en_US.UTF-8 -i es_MX -f ISO-8859-1 es_MX -i fa_IR -f UTF-8 fa_IR -i fr_FR -f ISO-8859-1 fr_FR -i fr_FR@euro -f ISO-8859-15 fr_FR@euro -i fr_FR -f UTF-8 fr_FR.UTF-8 -i it_IT -f ISO-8859-1 it_IT -i ja_JP -f EUC-JP ja_JP -i tr_TR -f UTF-8 tr_TR.UTF-8 -i zh_CN -f GB18030 zh_CN.GB18030

atau bisa juga anda menginstall semua yg ada di : glibc-2.14.1/localedata/SUPPORTED dengan mengetikkan :
make localedata/install-locales

kemudian anda bisa menggunakan perintah localdef untuk create dan install yg tidak terdaftar di : glibc-2.14.1/localedata/SUPPORTED
58 Linux Fundamental : Linux From Scratch

MENGKONFIGURASIKAN GLIBC /etc/nsswitch.conf harus di buat dan di tentukan, karena kalau tidak glibc akan membuatnya secara default, dan dan biasanya tidak dapat berjalan dengan baik pada lingkungan jaringan. Untuk membuat file /ec/nsswitch.conf berikut isinya sesuai dengan kebutuhan kita, ketikkan perintah :
cat > /etc/nsswitch.conf << "EOF" # Begin /etc/nsswitch.conf passwd: files group: files shadow: files hosts: files dns networks: files protocols: files services: files ethers: files rpc: files # End /etc/nsswitch.conf EOF

kemudian tentukan lokal time nya dengan perintah :


tzselect

Please identify a location so that time zone rules can be set correctly. Please select a continent or ocean. 1) Africa 2) Americas 3) Antarctica 4) Arctic Ocean 5) Asia 6) Atlantic Ocean 7) Australia 8) Europe 9) Indian Ocean 10) Pacific Ocean
59 Linux Fundamental : Linux From Scratch

11) none - I want to specify the time zone using the Posix TZ format. pilih sesuai dengan tempat anda.

MENGKONFIGURASIKAN DYNAMIC LIBRARY by default, glibc (/lib/ld-linux.so.2) akan mencari dynamic library ke /lib, /usr/lib, ketika sebuah program yang dijalankan mencari library tertentu, akan tetapi kita bisa juga meletakkan library lain pada direktori selain itu, dengan cara memberitahukan path nya di file /etc/ld.so.conf utk kebutuhan kita, karena ada library yg di letakkan di direktori selain di sebut diatas, maka kita harus mengetikkan perintah :
cat > /etc/ld.so.conf << "EOF" # Begin /etc/ld.so.conf /usr/local/lib /opt/lib EOF

Anda bisa juga membuat daftar file2 lain yg berisi path library, dan anda letakkan di dalam direktori tertentu misalnya /etc/ld.so.conf.d/*.conf , sesuai dengan nama program dsb utk mempermudah manajemen library, tapi di /etc/ld.so.conf harus anda tambahkan baris include, perintahnya adalah :
cat >> /etc/ld.so.conf << "EOF" # Add an include directory include /etc/ld.so.conf.d/*.conf EOF mkdir /etc/ld.so.conf.d

REAJUSTING TOOLCHAINS Sampai dengan langkah diatas, library C sudah terinstall, sekarang kita harus adust kembali toolschains nya,
60 Linux Fundamental : Linux From Scratch

langkah pertama backup linkers /tools , kemudian replace dengan linker yang di buat pada bab sebelum ini, kemudian buat link, perintahnya :
mv mv mv ln -v /tools/bin/{ld,ld-old} -v /tools/$(gcc -dumpmachine)/bin/{ld,ld-old} -v /tools/bin/{ld-new,ld} -sv /tools/bin/ld /tools/$(gcc -dumpmachine)/bin/ld

kemudian jalankan :
gcc -dumpspecs | sed -e 's@/tools@@g' \ -e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' \ -e '/\*cpp:/{n;s@$@ -isystem /usr/include@}' > \ `dirname $(gcc --print-libgcc-file-name)`/specs

untuk melakukan testing ketikkan :


readelf -l a.out | grep ': /lib'

kalau semua langkah anda berhasil, maka akan muncul :


[Requesting program interpreter: /lib/ld-linux.so.2]

artinya librarynya sudah mengarah pada glibc yg kita install yaitu di /lib/ld-linux.so.2

kemudian jalankan :
grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log

seharusnya akan muncul :


/usr/lib/crt1.o succeeded /usr/lib/crti.o succeeded /usr/lib/crtn.o succeeded

yg artinya ketiga library tsb tidak ditemukan error. Kemudian jalankan :


grep -B1 '^ /usr/include' dummy.log

harusnya system akan muncul :


61 Linux Fundamental : Linux From Scratch

#include <...> search starts here: /usr/include

Selanjutnya, verifikasi bahwa linker baru sedang digunakan dengan pencarian yang benar:
grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'

Jika semuanya bekerja dengan benar, tidak boleh ada kesalahan, dan output dari perintah terakhir akan menjadi:
SEARCH_DIR("/tools/i686-pc-linux-gnu/lib") SEARCH_DIR("/usr/lib") SEARCH_DIR("/lib");

Selanjutnya pastikan bahwa kita sedang menggunakan libc yang benar: grep "/lib.*/libc.so.6 " dummy.log

Jika semuanya bekerja dengan benar, tidak boleh ada kesalahan, dan output dari perintah terakhir akan menjadi: attempt to open /lib/libc.so.6 succeeded
Terakhir, pastikan GCC menggunakan linker dinamis yang benar: grep found dummy.log

Jika semuanya bekerja dengan benar, tidak boleh ada kesalahan, dan output dari perintah terakhir akan:
found ld-linux.so.2 at /lib/ld-linux.so.2

Setelah semuanya bekerja dengan benar, bersihkan file test:


rm -v dummy.c a.out dummy.log 6.11. Zlib-1.2.6 6.11.1. Instalasi zlib

Persiapkan zlib untuk compile:


./configure --prefix=/usr

Compile paket:
62 Linux Fundamental : Linux From Scratch

make

Untuk mengetes kesalahan:


make check

Install paket:
make install

Tahap berikutnya dalah memindahkan library:


mv -v /usr/lib/libz.so.* /lib ln -sfv ../../lib/libz.so.1.2.6 /usr/lib/libz.so

6.11.2. Contents of Zlib Library terinstall:. Libz {, jadi} Deskripsi pendak libz :Berisi fungsi kompresi dan dekompresi yang digunakan

6.12. File-5.10 6.12.1. Instalasi File Persiapkan file untuk proses compile:
./configure --prefix=/usr

Compile paket:
make

Untuk mengetes kesalahan:


make check

Install paket:
make install

6.12.2. Isi dari File Program terinstall : file Library terinstall :. Libmagic {, jadi} Deskripsi pendek File :Mencoba untuk mengklasifikasikan setiap file yang diberikan, melainkan melakukan hal ini dengan melakukan tes beberapa sistem tes-file, tes angka ajaib, dan tes bahasa libmagic :Berisi rutinitas untuk pengenalan angka , yang digunakan oleh file
63 Linux Fundamental : Linux From Scratch

program

6.13. Binutils-2.22 6.13.1. Installasi Binutils Verifikasi bahwa ptys bekerja dengan benar di dalam lingkungan chroot dengan melakukan tes sederhana:
expect -c "spawn ls"

Perintah ini harus menghasilkan output sebagai berikut:


spawn ls

Apabila terdapat pesan di bawah ini maka perlu adanya perbaikan:


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

Menekan installasi file usang standard.info karena lebih dahulu terinstall dengan petunjuk di autoconf:
rm -fv etc/standards.info sed -i.bak '/^INFO/s/standards.info //' etc/Makefile.in

Perbaiki beberapa tes, yang gagal ketika menggunakan GCC-4.6.2:


sed -i "/exception_defines.h/d" ld/testsuite/ld-elf/new.cc sed -i "s/-fvtable-gc //" ld/testsuite/ld-selective/selective.exp

Dokumentasi binutils merekomendasikan membangun binutils di luar direktori sumber tetapi masih pada direktori khusus:
mkdir -v ../binutils-build cd ../binutils-build

Siapkan binutils untuk kompilasi:


../binutils-2.22/configure --prefix=/usr --enable-shared

Kompilasi paket:
make tooldir=/usr

NOTE: Dalam hal ini pmbuatan binutils sangatlah penting untuk itu jangan lewatkan satupun.
64 Linux Fundamental : Linux From Scratch

Pengujian hasil:
Test the results:

Install paket:
make tooldir=/usr install

Instal file libiberty header yang dibutuhkan oleh beberapa paket:


cp -v ../binutils-2.22/include/libiberty.h /usr/include

6.13.2. Isi binutils Progra terinstall : addr2line, ar, seperti, c + + filt, elfedit, gprof, ld, ld.bfd, nm, objcopy, objdump, ranlib, readelf, ukuran, string, dan strip library terinstall :.. Libiberty.a, libbfd {, jadi}, dan {libopcodes, jadi} direktori terpasang : / usr / lib / ldscripts Deskripsi pendek: addr2line Menerjemahkan Program alamat untuk mengajukan nama dan nomor baris; diberikan alamat: dan nama executable, menggunakan informasi debug dalam eksekusi untuk menentukan sumber file dan nomor baris yang berhubungan dengan alamat ar :Menciptakan, memodifikasi, dan ekstrak dari arsip as :Sebuah assembler yang merakit output dari gcc dalam berkas objek c + + filt :Digunakan oleh linker untuk de-mangle C + + dan simbol-simbol Jawa dan untuk menjaga fungsi kelebihan beban dari bentrok elfedit :Update header ELF file ELF gprof :Menampilkan memanggil data grafik profi ld :Sebuah linker yang menggabungkan beberapa file objek dan arsip ke dalam satu file, relokasi data mereka dan mengikat referensi simbol ld.bfd :Sulit link ke ld nm :Daftar simbol yang terjadi dalam file objek yang diberikan objcopy :Menerjemahkan satu jenis objek file ke lain objdump :Menampilkan informasi tentang file objek yang diberikan, dengan pilihan mengendalikan informasi tertentu untuk menampilkan; informasi yang ditampilkan berguna untuk programmer yang bekerja pada alat kompilasi ranlib :Menghasilkan indeks dari isi arsip dan menyimpannya dalam arsip; indeks berisi semua simbol yang didefinisikan oleh anggota arsip yang objek file relocatable readelf :Menampilkan informasi tentang jenis ELF binari
65 Linux Fundamental : Linux From Scratch

size :Daftar ukuran bagian dan ukuran total untuk file-file objek yang diberikan string :Output, untuk setiap file yang diberikan, urutan dari karakter yang dapat dicetak yang minimal panjang ditentukan (default ke empat), karena objek file, mencetak, secara default, hanya string dari bagian inisialisasi dan loading sedangkan untuk jenis lain file, scan seluruh file strip :Membuang simbol dari file objek Libiberty :Berisi rutinitas digunakan oleh program GNU berbagai, termasuk getopt, obstack, strerror, strtol, dan strtoul libbfd :File Binary DESKRIPSI perpustakaan libopcodes :Sebuah perpustakaan untuk menangani opkode-versi "teks yang dapat dibaca" instruksi untuk prosesor, melainkan digunakan untuk membangun utilitas seperti objdump.

6.14. GMP-5.0.4 6.14.1. Pemasangan GMP Persiapan kompilasi GMP


./configure --prefix=/usr --enable-cxx --enable-mpbsd

Kompilasi paket
make check 2>&1 | tee gmp-check-log

Periksa hasil kompilasi


awk '/tests passed/{total+=$2} ; END{print total}' gmp-check-log

Install paket
make install

Install dokumentasi
mkdir -v /usr/share/doc/gmp-5.0.4 cp -v doc/{isa_abi_headache,configuration} doc/*.html \ /usr/share/doc/gmp-5.0.4

6.15. MPFR-3.1.0 6.15.1 Instaalasi MPFR Terapkan patch untuk sejumlah bug di MPFR-3.1.0
66 Linux Fundamental : Linux From Scratch

patch -Np1 -i ../mpfr-3.1.0-fixes-1.patch

Persiapan untuk kompilasi MPFR


./configure --prefix=/usr --enable-thread-safe \ --docdir=/usr/share/doc/mpfr-3.1.0

Kompilasi paket
make

Uji hasil dan pastikan bahwa semua tes lulus


make check

Install paket
make install

Install dokumentasi
make html make install-html

6.16. MPC-0.9 6.16.1 Installasi MPC-0.9 Persiapan kompilasi MPC-0.9


./configure --prefix=/usr

Kompile paket
make

Pengecekan kemungkinan kesalahan


make check

Install paket
make install

6.17. GCC-4.6.2 6.17.1. Instalasi GCC Gunakan substitusi sed yang akan menekan instalasi libiberty.a. Versi libiberty.a
67 Linux Fundamental : Linux From Scratch

disediakan oleh binutils ini akan digunakan sebagai gantinya:


sed -i 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in

Seperti dalam Bab 5.10, "GCC-4.6.2 - Pass 2", penerapkan sed berikut ini memaksa menggunakan -fomit-frame-pointer flag compiler untuk memastikan compiler konsisten membangun installasi:
case `uname -m` in i?86) sed -i 's/^T_CFLAGS =$/& -fomit-frame-pointer/' \ gcc/Makefile.in ;; esac

Script fixincludes diketahui kadang-kadang keliru mencoba "memperbaiki" header sistem yang terinstal sejauh ini. akukan perintah berikut untuk mencegah script fixincludes dari berjalan:
sed -i 's@\./fixinc\.sh@-c true@' gcc/Makefile.in

Dokumentasi GCC merekomendasikan membangun GCC luar direktori sumber


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

persiapan kompilasi GCC


../gcc-4.6.2/configure --prefix=/usr \ --libexecdir=/usr/lib --enable-shared \ --enable-threads=posix --enable-__cxa_atexit \ --enable-clocale=gnu --enable-languages=c,c++ \ --disable-multilib --disable-bootstrap --with-system-zlib

Yang dimaksud dengan opsi configure baru:


- with-system-zlib

Switch ini memberitahu GCC untuk link ke salinan sistem terinstal perpustakaan zlib, bukan salinan internal sendiri. Kompilasi paket
make

meningkatkan ukuran stack untuk tes GCC


ulimit -s 16384

Pengujian hasil
make -k check

Untuk menerima ringkasan dari hasil test suite, jalankan:


../gcc-4.6.2/contrib/test_summary

Installasi paket
68 Linux Fundamental : Linux From Scratch

make install

Beberapa paket mengharapkan C preprocessor untuk diinstal di direktori / lib. Untuk mendukung paket tersebut, buat symlink ini:
ln -sv ../usr/bin/cpp /lib

Banyak paket menggunakan cc nama untuk memanggil compiler C. Untuk memenuhi paket tersebut, buat symlink:
ln -sv gcc /usr/bin/cc

Hasil pengecekan seperti pada bab sebelumnya


echo 'main(){}' > dummy.c cc dummy.c -v -Wl,--verbose &> dummy.log readelf -l a.out | grep ': /lib'

Jika semua benar maka akan muncul pesan


[Requesting program interpreter: /lib/ld-linux.so.2]

Sekarang pastikan bahwa setup kita untuk startfiles yang benar:


grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log

Jika semua benar maka akan muncul pesan


/usr/lib/gcc/i686-pc-linux-gnu/4.6.2/../../../crt1.o succeeded /usr/lib/gcc/i686-pc-linux-gnu/4.6.2/../../../crti.o succeeded /usr/lib/gcc/i686-pc-linux-gnu/4.6.2/../../../crtn.o succeeded

Verifikasi bahwa kompiler mencari file header yang benar:


grep -B4 '^ /usr/include' dummy.log

jika berhasil maka akan muncul pesan


#include <...> search starts here: /usr/local/include /usr/lib/gcc/i686-pc-linux-gnu/4.6.2/include /usr/lib/gcc/i686-pc-linux-gnu/4.6.2/include-fixed /usr/include

Selanjutnya, pastikan bahwa linker baru sedang dipakai dengan jalur pencarian yang benar:
grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'

jika semua benar maka akan muncul pesan


SEARCH_DIR("/usr/i686-pc-linux-gnu/lib") SEARCH_DIR("/usr/local/lib") SEARCH_DIR("/lib") SEARCH_DIR("/usr/lib");

System 64-bit mungkin mendeteksi adanya direktori baru.sebagai contoh berikut tampilannya
SEARCH_DIR("/usr/x86_64-unknown-linux-gnu/lib64")
69 Linux Fundamental : Linux From Scratch

SEARCH_DIR("/usr/local/lib64") SEARCH_DIR("/lib64") SEARCH_DIR("/usr/lib64") SEARCH_DIR("/usr/x86_64-unknown-linux-gnu/lib") SEARCH_DIR("/usr/local/lib") SEARCH_DIR("/lib") SEARCH_DIR("/usr/lib");

Selanjutnya pastikan bahwa kita sedang menggunakan libc yang benar


grep "/lib.*/libc.so.6 " dummy.log

jika semua benar maka tampilan akan menjadi


attempt to open /lib/libc.so.6 succeeded

Terakhir, pastikan GCC menggunakan linker dinamis yang benar: grep found dummy.log jika semua benar maka akan muncul pesan
found ld-linux.so.2 at /lib/ld-linux.so.2

lakukan pembersihan file tes


rm -v dummy.c a.out dummy.log

6.18. Sed-4.2.1 6.18.1 installasi Sed Persiapan kompilasi sed


./configure --prefix=/usr --bindir=/bin --htmldir=/usr/share/doc/sed4.2.1

Kompilasi paket
make

pembuatan dokumen html


make html

pengecekan kesalahan
make check

installasi paket
make install

installasi dokumen html


make -C doc install-html

6.19. Bzip2-1.0.6
70 Linux Fundamental : Linux From Scratch

6.19.1. Installasi Bzip2 Terapkan patch dokumentasi yang akan diinstall untuk paket ini
patch -Np1 -i ../bzip2-1.0.6-install_docs-1.patch

Perintah berikut untuk memastikan pemasangan link simbolik relatif:


sed -i 's@\(ln -s -f \)$(PREFIX)/bin/@\1@' Makefile

persiapan kompilasi bzip2


make -f Makefile-libbz2_so make clean

kompilasi dan tes paket


make

install program
make PREFIX=/usr install

Instal biner bzip2 ke dalam direktori / bin


cp cp ln rm ln ln -v bzip2-shared /bin/bzip2 -av libbz2.so* /lib -sv ../../lib/libbz2.so.1.0 /usr/lib/libbz2.so -v /usr/bin/{bunzip2,bzcat,bzip2} -sv bzip2 /bin/bunzip2 -sv bzip2 /bin/bzcat

6.20. Ncurses-5.9 6.20.1 Installasi Ncurses Persiapan kompilasi Ncurses


./configure --prefix=/usr --with-shared --without-debug --enablewidec

Kompilasi paket
make

Install paket
make install

Pindahkan shared library ke direktori / lib


mv -v /usr/lib/libncursesw.so.5* /lib

karena library telah di pindahkan maka symlink harus di buat kembali


71 Linux Fundamental : Linux From Scratch

ln -sfv ../../lib/libncursesw.so.5 /usr/lib/libncursesw.so

Banyak aplikasi masih mengharapkan linker untuk bisa menemukan non-wide-character library ncurses. Untuk mengakali aplikasi tersebut agar terhubung dengan non-widecharacter library melalui symlink dan script linker:
for lib in ncurses form panel menu ; do \ rm -vf /usr/lib/lib${lib}.so ; \ echo "INPUT(-l${lib}w)" >/usr/lib/lib${lib}.so ; \ ln -sfv lib${lib}w.a /usr/lib/lib${lib}.a ; \ done ln -sfv libncurses++w.a /usr/lib/libncurses++.a

Akhirnya, pastikan bahwa aplikasi lama yang mencari -lcurses ketika kompilasi masih buildable:
rm -vf /usr/lib/libcursesw.so echo "INPUT(-lncursesw)" >/usr/lib/libcursesw.so ln -sfv libncurses.so /usr/lib/libcurses.so ln -sfv libncursesw.a /usr/lib/libcursesw.a ln -sfv libncurses.a /usr/lib/libcurses.a

Jika diinginkan, instal dokumentasi ncurses


mkdir -v /usr/share/doc/ncurses-5.9 cp -v -R doc/* /usr/share/doc/ncurses-5.9

6.21. Util-linux-2.20.1 6.21.1. FHS ketaatan catatan Buat program hwclock FHS-compliant, jalankan berikut:
sed -e 's@etc/adjtime@var/lib/hwclock/adjtime@g' \ -i $(grep -rl '/etc/adjtime' .) mkdir -pv /var/lib/hwclock

6.21.2. Installasi Util-linux


./configure --enable-arch --enable-partx --enable-write

Kompilasi paket
make
72 Linux Fundamental : Linux From Scratch

Install paket
make install

6.22. Psmisc-22.15 6.22.1 Installasi Psmisc Persiapan kompilasi Psmisc


./configure --prefix=/usr Kompilasi paket make

Install paket
make install

Terakhir, memindahkan program killall dan fuser ke lokasi yang ditentukan oleh FHS:
mv -v /usr/bin/fuser /bin mv -v /usr/bin/killall /bin

6.23. E2fsprogs-1.42 6.23.1 installasi E2fsprogs Dokumentasi e2fsprogs merekomendasikan bahwa paket tersebut akan dibangun di sebuah subdirektori
mkdir -v build cd build

Persiapan kompilasi E2fsprogs


PKG_CONFIG=/tools/bin/true LDFLAGS="-lblkid -luuid" \ ../configure --prefix=/usr --with-root-prefix="" \ --enable-elf-shlibs --disable-libblkid --disable-libuuid \ --disable-uuidd --disable-fsck

Kompilasi paket
73 Linux Fundamental : Linux From Scratch

Make

Pengecekan kesalahan
make check

Instal binari, dokumentasi, dan shared library:


make install

Instal library statis dan header:


make install-libs

pembuatan library statis sehingga bug dapat dihapus


chmod -v u+w /usr/lib/{libcom_err,libe2p,libext2fs,libss}.a

Perbarui director dengan


gunzip -v /usr/share/info/libext2fs.info.gz install-info --dir-file=/usr/share/info/dir \ /usr/share/info/libext2fs.info

Gunakan perintah berikut jika ingin menginstal dokumen tambahan


makeinfo -o doc/com_err.info ../lib/et/com_err.texinfo install -v -m644 doc/com_err.info /usr/share/info install-info --dir-file=/usr/share/info/dir \ /usr/share/info/com_err.info

6.24. Coreutils-8.15 6.24.1 Installasi Coreutils Berikut adalah perintah apabila terjadi kesalahan pada system intel
case `uname -m` in i?86 | x86_64) patch -Np1 -i ../coreutils-8.15-uname-1.patch ;; esac

Berikut adalah perbaikan apabila terjadi bug


patch -Np1 -i ../coreutils-8.15-i18n-1.patch
74 Linux Fundamental : Linux From Scratch

Persiapan kompilasi coreutils


./configure --prefix=/usr \ --libexecdir=/usr/lib \ --enable-no-install-program=kill,uptime

Kompilasi paket
make

Sekarang test suite siap untuk dijalankan. Pertama, menjalankan tes pada root user
make NON_ROOT_USERNAME=nobody check-root

Kita akan menjalankan sisa dari tes sebagai user nobody atau memiliki lebih dari satu kelompok:
echo "dummy:x:1000:nobody" >> /etc/group

Perbaiki beberapa hak akses sehingga pengguna non-root dapat mengkompilasi dan menjalankan tes:
chown -Rv nobody .

lakukan pengecekan
su-tools nobody -s /bin/bash -c "make RUN_EXPENSIVE_TESTS=yes check"

Penghapusan temporary grup


sed -i '/dummy/d' /etc/group

Install paket make install Pindahkan program ke lokasi yang ditentukan oleh FHS:
mv -v /usr/bin/{cat,chgrp,chmod,chown,cp,date,dd,df,echo} /bin mv -v /usr/bin/{false,ln,ls,mkdir,mknod,mv,pwd,rm} /bin mv -v /usr/bin/{rmdir,stty,sync,true,uname} /bin
75 Linux Fundamental : Linux From Scratch

mv -v /usr/bin/chroot /usr/sbin mv -v /usr/share/man/man1/chroot.1 /usr/share/man/man8/chroot.8 sed -i s/\"1\"/\"8\"/1 /usr/share/man/man8/chroot.8

penggunaan partisi root


mv -v /usr/bin/{head,sleep,nice} /bin

6.25. Iana-Etc-2.30 6.25.1 Installasi Iana-Etc Perintah berikut mengubah data mentah yang diberikan oleh IANA ke dalam format yang benar untuk /etc/protocols dan /etc/services data files: Install paket
make install

6.26. M4-1.4.16 6.26.1. Installasi M4 Persiapan kompilasi M4


./configure --prefix=/usr

Kompilasi paket
make

lakukan pengujian program


sed -i -e '41s/ENOENT/& || errno == EINVAL/' tests/test-readlink.h make check

Install paket
make install

76 Linux Fundamental : Linux From Scratch

6.27. Bison-2.5 6.27.1. Installasi Bison Persiapan kompilasi Bison


./configure --prefix=/usr

Penambahan path pada Bison


echo '#define YYENABLE_NLS 1' >> lib/config.h

Kompilasi paket
make

Pengujian masalah
make check

Install paket
make install

6.28. Procps-3.2.8 6.28.1 Installasi PROCPS Lakukan patch untuk menghindari kesalahan pada penggunaan kernel jam
patch -Np1 -i ../procps-3.2.8-fix_HZ_errors-1.patch

Menerapkan patch untuk memperbaiki masalah terkait unicode dalam program


patch -Np1 -i ../procps-3.2.8-watch_unicode-1.patch

Perbaiki bug dalam Makefile,


sed -i -e 's@\*/module.mk@proc/module.mk ps/module.mk@' Makefile

Kompilasi paket
make

Installasi paket
77 Linux Fundamental : Linux From Scratch

make install

6.29. Grep-2.10 6.29.1. Installasi Grep Lakukan perbaikan masalah dengan script
sed -i 's/cp/#&/' tests/unibyte-bracket-expr

Persiapkan kompilasi grep


./configure --prefix=/usr --bindir=/bin

Kompilasi paket
make

Pengecekan kesalahan
make check

Install paket
make install

6.30. Readline-6.2 6.30.1 Installasi Readline Menghindarkan pemindahan library lama


sed -i '/MV.*old/d' Makefile.in sed -i '/{OLDSUFF}/c:' support/shlib-install

Menerapkan patch untuk memperbaiki bug yang dikenal


patch -Np1 -i ../readline-6.2-fixes-1.patch

Persiapan Readline untuk kompilasi


./configure --prefix=/usr --libdir=/lib

Kompilasi paket
make SHLIB_LIBS=-lncurses
78 Linux Fundamental : Linux From Scratch

Installasi paket
make install

Sekarang memindahkan library statis ke lokasi yang lebih tepat:


mv -v /lib/lib{readline,history}.a /usr/lib

Berikutnya, hapus sehingga file di / lib dan relink mereka ke / usr / lib.:
rm -v /lib/lib{readline,history}.so ln -sfv ../../lib/libreadline.so.6 /usr/lib/libreadline.so ln -sfv ../../lib/libhistory.so.6 /usr/lib/libhistory.so

Jika diinginkan, install dokumentasi:


mkdir -v /usr/share/doc/readline-6.2 install -v -m644 doc/*.{ps,pdf,html,dvi} \ /usr/share/doc/readline-6.2

6.31. Bash-4.2 6.31.1. Installasion bash Pertama gunakan patch berikut untuk memperbaiki bug
patch -Np1 -i ../bash-4.2-fixes-4.patch

Persiapan kompilasi bash


./configure --prefix=/usr --bindir=/bin \ --htmldir=/usr/share/doc/bash-4.2 --without-bash-malloc \ --with-installed-readline

Kompilasi paket
make

Untuk mempersiapkan tes, memastikan bahwa pengguna tidak ada yang bisa mengedit root
79 Linux Fundamental : Linux From Scratch

chown -Rv nobody .

lakukan pengecekan
su-tools nobody -s /bin/bash -c "make tests"

Install paket
make install

Coba jalankan hasil kompilasi


exec /bin/bash --login +h

6.32. Libtool-2.4.2 6.32.1 Installasi Libtool Persiapan kompilasi libtool


./configure --prefix=/usr

Kompilasi paket
make

Lakukan pengujian hasil


make check

Install paket
make install

6.33. GDBM-1.10 6.33.1 Installasi GDBM Persiapan kompilasi GDBM


./configure --prefix=/usr --enable-libgdbm-compat

Kompilasi paket
80 Linux Fundamental : Linux From Scratch

make

Lakukan pengecekan
make check

Install paket
make install

6.34. Inetutils-1.9.1 6.34.1. Installasi Inetutils


./configure --prefix=/usr --libexecdir=/usr/sbin \ --localstatedir=/var --disable-ifconfig \ --disable-logger --disable-syslogd --disable-whois \ --disable-servers

Kompilasi paket
make

Tahap pengecekan
make check

Install paket
make install make -C doc html make -C doc install-html docdir=/usr/share/doc/inetutils-1.9.1

Pindahkan beberapa program untuk FHS-compliant


mv -v /usr/bin/{hostname,ping,ping6} /bin mv -v /usr/bin/traceroute /sbin

6.35. Perl-5.14.2 6.35.1 Installasi Perl Pertama buatlah dasar / etc / hosts file yang akan dirujuk dalam salah satu file
81 Linux Fundamental : Linux From Scratch

konfigurasi Perl
echo "127.0.0.1 localhost $(hostname)" > /etc/hosts

Terapkan patch untuk memperbaiki kerentanan keamanan di Perl:


patch -Np1 -i ../perl-5.14.2-security_fix-1.patch

Gunakan perintah berikut sehingga Perl akan menggunakan perpustakaan zlib pada sistem:
sed -i -e "s|BUILD_ZLIB\s*= True|BUILD_ZLIB = False|" \ -e "s|INCLUDE\s*= ./zlib-src|INCLUDE = /usr/include|" \ -e "s|LIB\s*= ./zlib-src|LIB = /usr/lib|" \ cpan/Compress-Raw-Zlib/config.in

Untuk memiliki kontrol penuh atas cara Perl, Anda dapat menghapus "-des" pilihan dari perintah berikut dan hand-pick cara paket ini dibangun. Atau, gunakan perintah persis seperti di bawah ini :
sh Configure -des -Dprefix=/usr \ -Dvendorprefix=/usr -Dman1dir=/usr/share/man/man1 -Dman3dir=/usr/share/man/man3 -Dpager="/usr/bin/less -isR" \ \ \ \

Kompilasi paket
make

Untuk menguji hasil (sekitar 2,5 SBU) :


make test

Install paket
make install

6.36. Autoconf-2.68 6.36.1. Installasi Autoconf Persiapan kompilasi Autoconf


82 Linux Fundamental : Linux From Scratch

./configure --prefix=/usr Kompilasi paket


make

pengecekan kesalahan
make check

Install paket
make install

6.37. Automake-1.11.3 6.37.1. Installasi Automake Persiapan kompilasi automake


./configure --prefix=/usr --docdir=/usr/share/doc/automake-1.11.3

Kompilasi paket
make

Pengecekan kesalahan
make check

Installasi paket
make check

6.38. Diffutils-3.2 6.38.1 Installasi Diffutils Persiapan kompilasi diffutils


./configure --prefix=/usr

Kompilasi paket
83 Linux Fundamental : Linux From Scratch

make

Pengecekan kesalahan
make check

Install paket
make install

6.39. Gawk-4.0.0 6.39.1 Installasi Gawak Persiapan kompilasi


make

Pengecekan kesalahan
make check

Installasi paket
make install

jika diinginkan silahkan install dokumen


mkdir -v /usr/share/doc/gawk-4.0.0 cp -v doc/{awkforai.txt,*.{eps,pdf,jpg}} \ /usr/share/doc/gawk-4.0.0

INSTALLASI FINDUTILS Tahap persiapan installasi :


./configure --prefix=/usr --libexecdir=/usr/lib/findutils \ --localstatedir=/var/lib/locate

kompilasi :
84 Linux Fundamental : Linux From Scratch

make

testing hasil kompilasi :


make check

install hasil kompilasi :


make install

kopi hasil installasi :


mv -v /usr/bin/find /bin sed -i 's/find:=${BINDIR}/find:=\/bin/' /usr/bin/updatedb

INSTALLASI FLEX Lakukan patch :


patch -Np1 -i ../flex-2.5.35-gcc44-1.patch

Tahap persiapan installasi :


./configure --prefix=/usr

Tahap kompilsi :
make

Cek hasil kompilasi :


make check

Install hasil kompilasinya :


make install

85 Linux Fundamental : Linux From Scratch

lakukan symlink :
ln -sv libfl.a /usr/lib/libl.a

buat file utk skrip :


cat > /usr/bin/lex << "EOF" #!/bin/sh # Begin /usr/bin/lex exec /usr/bin/flex -l "$@" # End /usr/bin/lex EOF chmod -v 755 /usr/bin/lex

kopi hasil installasi :


mkdir -v /usr/share/doc/flex-2.5.35 cp -v doc/flex.pdf \ /usr/share/doc/flex-2.5.35

INSTALLASI GETTEXT Tahap persiapan installasi :


./configure --prefix=/usr \ --docdir=/usr/share/doc/gettext-0.18.1.1

tahap kompilasi :
make

tahap pengecekan hasil kompilasi:


make check

Tahap installasi :
make install

INSTALLASI GROFF
86 Linux Fundamental : Linux From Scratch

Tahap persiapan installasi :


PAGE=<paper_size> ./configure --prefix=/usr

Tahap kompilasi :
make

Tahap installasi :
make install

buat symlink :
ln -sv eqn /usr/bin/geqn ln -sv tbl /usr/bin/gtbl

INSTALLASI XZ Tahap persiapan installasi :


./configure --prefix=/usr --libdir=/lib --docdir=/usr/share/doc/xz5.0.3

Tahap kompilasi :
make

Tahap pengecekan hasil kompilasi :


make check

Tahap installasi :
make pkgconfigdir=/usr/lib/pkgconfig install

INSTALLASI GRUB

Tahap persiapan installasi :


./configure --prefix=/usr --sysconfdir=/etc
Linux Fundamental : Linux From Scratch

\ \
87

--disable-grub-emu-usb \ --disable-efiemu \ --disable-werror

Tahap kompilasi :
make

Tahap installasi :
make install

INSTALLASI GZIP Tahap persiapan installasi :


./configure --prefix=/usr --bindir=/bin

Tahap kompilasi :
make

Tahap pengecekan hasil kompilasi :


make check

Tahap installasi :
make install

Move hasil installasi :


mv -v /bin/{gzexe,uncompress,zcmp,zdiff,zegrep} /usr/bin mv -v /bin/{zfgrep,zforce,zgrep,zless,zmore,znew} /usr/bin

INSTALLASI IPROUTE2 Tahap persiapan installasi :


sed -i '/^TARGETS/s@arpd@@g' misc/Makefile sed -i /ARPD/d Makefile
88 Linux Fundamental : Linux From Scratch

rm man/man8/arpd.8 sed -i -e '/netlink\//d' ip/ipl2tp.c

Tahap kompilasi :
make DESTDIR=

Tahap installasi :
make DESTDIR= MANDIR=/usr/share/man \ DOCDIR=/usr/share/doc/iproute2-3.2.0 install

INSTALLASI KBD

Tahap patching :
patch -Np1 -i ../kbd-1.15.2-backspace-1.patch

Tahap persiapan installasi :


./configure --prefix=/usr --datadir=/lib/kbd

Tahap kompilasi :
make

Tahap installasi :
make install

Tahap akhir installasi :


mv -v /usr/bin/{kbd_mode,loadkeys,openvt,setfont} /bin mkdir -v /usr/share/doc/kbd-1.15.2 cp -R -v doc/* \ /usr/share/doc/kbd-1.15.2
89 Linux Fundamental : Linux From Scratch

INSTALLASI KMOD Tahap persiapan installasi :


liblzma_CFLAGS="-I/usr/include" \ liblzma_LIBS="-L/lib -llzma" \ zlib_CFLAGS="-I/usr/include" \ zlib_LIBS="-L/lib -lz" \ ./configure --prefix=/usr --bindir=/bin --libdir=/lib -sysconfdir=/etc \ --with-xz --with-zlib

Tahap kompilasi :
make

Tahap pengecekan hasil kompilasi :


make check

Tahap installasi :
make pkgconfigdir=/usr/lib/pkgconfig install for target in depmod insmod modinfo modprobe rmmod; do ln -sv ../bin/kmod /sbin/$target done

lakukan symlink :
ln -sv kmod /bin/lsmod

INSTALLASI LESS Tahap persiapan installasi :


./configure --prefix=/usr sysconfdir=/etc

Tahap kompilasi :
make

Tahap installasi :
90 Linux Fundamental : Linux From Scratch

make install

INSTALLASI LIBPIPELINE Tahap persiapan installasi :


./configure CHECK_CFLAGS=-I/tools/include \ CHECK_LIBS="-L/tools/lib -lcheck" --prefix=/usr

Tahap kompilasi :
make

Tahap pengecekan hasil kompilasi :


make check

Tahap installasi :
make install

INSTALLASI MAKE Tahap persiapan installasi :


./configure --prefix=/usr

Tahap kompilasi :
make

Tahap pengecekan hasil kompilasi :


make check

Tahap installasi :
91 Linux Fundamental : Linux From Scratch

make install

INSTALLASI MAN-DB

Tahap persiapan installasi :


PKG_CONFIG=/tools/bin/true \ libpipeline_CFLAGS='' \ libpipeline_LIBS='-lpipeline' \ ./configure --prefix=/usr --libexecdir=/usr/lib \ --docdir=/usr/share/doc/man-db-2.6.1 --sysconfdir=/etc \ --disable-setuid --with-browser=/usr/bin/lynx \ --with-vgrind=/usr/bin/vgrind --with-grap=/usr/bin/grap

Tahap kompilasi :
make

Tahap pengecekan hasil installasi :


make check

Tahap installasi :
make install

INSTALLASI PATCH Tahap patch :


patch -Np1 -i ../patch-2.6.1-test_fix-1.patch

Tahap persiapan installasi :


./configure --prefix=/usr

Tahap kompilasi :
make
92 Linux Fundamental : Linux From Scratch

Tahap pengecekan hasil kompilasi :


make check

Tahap installasi :
make install

INSTALLASI SHADOW Tahap patching :


patch -Np1 -i ../shadow-4.1.5-nscd-1.patch

Disable installasi program group :


sed -i 's/groups$(EXEEXT) //' src/Makefile.in find man -name Makefile.in -exec sed -i 's/groups\.1 / /' {} \;

Menggunakan SHA512 utk metode enkripsi, yg mengijinkan password lebih dari 8 karakter, ketikkan perintah :
sed -i -e 's@#ENCRYPT_METHOD DES@ENCRYPT_METHOD SHA512@' \ -e 's@/var/spool/mail@/var/mail@' etc/login.defs

utk membangun cracklib support , ketikkan :


sed -i 's@DICTPATH.*@DICTPATH\t/lib/cracklib/pw_dict@' \ etc/login.defs

Tahap persiapan installasi :


./configure --sysconfdir=/etc

Tahap kompilasi :
make
93 Linux Fundamental : Linux From Scratch

Tahap installasi :
make install

Moving passwd ke /bin


mv -v /usr/bin/passwd /bin

KONFIGURASI SHADOW Utk enable shadow password :


pwconv

Utk enable shadow group password :


grpconv

Utk membuat user baru yg dibuat langsung memiliki mailbox di /var/spool/mail silakan ketikkan :
sed -i 's/yes/no/' /etc/default/useradd

utk setting password root, ketikkan :


passwd root

INSTALLASI SYSLOGKD Tahap kompilasi :


make

Tahap installasi :
make BINDIR=/sbin install

94 Linux Fundamental : Linux From Scratch

Membuat file konfigurasi syslogkd :


cat > /etc/syslog.conf << "EOF" # Begin /etc/syslog.conf auth,authpriv.* -/var/log/auth.log *.*;auth,authpriv.none -/var/log/sys.log daemon.* -/var/log/daemon.log kern.* -/var/log/kern.log mail.* -/var/log/mail.log user.* -/var/log/user.log *.emerg * # End /etc/syslog.conf EOF

INSTALLASI SYSVINIT

Setting init, dibaca melalui /etc/inittab :


sed -i 's@Sending processes@& configured via /etc/inittab@g' \ src/init.c

wall, dan mountpoint sudah diinstall oleh util-linux :


sed -i -e 's/utmpdump wall/utmpdump/' \ -e '/= mountpoint/d' \ -e 's/mountpoint.1 wall.1//' src/Makefile

Lakukan tahap kompilasi :


make -C src

Lakukan tahap installasi :


make -C src install

INSTALLASI TAR
95 Linux Fundamental : Linux From Scratch

Lakukan tahap persiapan installasi :


FORCE_UNSAFE_CONFIGURE=1 ./configure --prefix=/usr \ --bindir=/bin --libexecdir=/usr/sbin

Lakukan tahap kompilasi :


make

Lakukan tahap pengecekan kompilasi :


make check

Lakukan tahap installasi :


make install make -C doc install-html docdir=/usr/share/doc/tar-1.26

INSTALLASI TEXTINFO Lakukan tahap persiapan installasi :


./configure --prefix=/usr

Lakukan kompilasi :
make

Lakukan pengecekan hasil kompilasi :


make check

Lakukan installasi :
make install make TEXMF=/usr/share/texmf install-tex
96 Linux Fundamental : Linux From Scratch

Utk menghindari terjadinya tumpang tindih antar manual yg di install oleh paket2 tertentu, ketikkan :
cd /usr/share/info rm -v dir for f in * do install-info $f dir 2>/dev/null done

INSTALLASI UDEV Extract paket udev-config di dalam source code udev :


tar -xvf ../udev-config-20100128.tar.bz2

buat beberapa device :


install -dv /lib/{firmware,udev/devices/pts} mknod -m0666 /lib/udev/devices/null c 1 3

Tahap persiapan kompilasi :


BLKID_CFLAGS="-I/usr/include/blkid" \ BLKID_LIBS="-L/lib -lblkid" \ KMOD_CFLAGS="-I/usr/include" \ KMOD_LIBS="-L/lib -lkmod" \ ./configure --prefix=/usr \ --with-rootprefix='' \ --bindir=/sbin \ --sysconfdir=/etc \ --libexecdir=/lib \ --enable-rule_generator \ --disable-introspection \ --disable-keymap \ --disable-gudev \ --with-usb-ids-path=no \ --with-pci-ids-path=no \ --with-systemdsystemunitdir=no

Tahap kompilasi : make


97 Linux Fundamental : Linux From Scratch

Tahap pengecekan hasil kompilasi : make check Tahap installasi : make install Hapus direktori kosong :
rmdir -v /usr/share/doc/udev

Install udev-config :
cd udev-config-20100128 make install make install-doc

INSTALLASI VIM Rubah default installasi vimrc ke /etc/ :


98 Linux Fundamental : Linux From Scratch

echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >> src/feature.h Tahap persiapan kompilasi : ./configure --prefix=/usr --enable-multibyte Tahap kompilasi : make Tahap pengecekan hasil kompilasi : make test Tahap installasi : make install Buat symlink vim menjadi vi, berikut manual2nya : ln -sv vim /usr/bin/vi for L in /usr/share/man/{,*/}man1/vim.1; do ln -sv vim.1 $(dirname $L)/vi.1 done Buat symlink utk dokumentasinya juga : ln -sv ../vim/vim73/doc /usr/share/doc/vim-7.3

KONFIGURASI VIM Isi file konfig dari vi (/etc/vimrc) : cat > /etc/vimrc << "EOF" " Begin /etc/vimrc
99 Linux Fundamental : Linux From Scratch

set nocompatible set backspace=2 syntax on if (&term == "iterm") || (&term == "putty") set background=dark endif " End /etc/vimrc EOF Dokumentasi utk option2 vi bisa anda lihat dgn perintah : vim -c ':options'

Tambahkan pula spelling di /etc/vimrc : set spelllang=en,ru set spell

100 Linux Fundamental : Linux From Scratch

Chapter 7. Setting Up System Bootscripts 7.1 Pendahuluan Bab ini membahas file konfigurasi dan skrip boot. Pertama, file konfigurasi umum yang diperlukan untuk mengatur jaringan.

Section 7.2, General Network Configuration. Section 7.3, Customizing the /etc/hosts File.

Kedua, masalah yang mempengaruhi pengaturan yang tepat dari perangkat yang dibahas.

Section 7.4, Device and Module Handling on an LFS System. Section 7.5, Creating Custom Symlinks to Devices.

Berikut cara menginstal dan mengkonfigurasi script sistem LFS yang dibutuhkan selama proses boot. Sebagian besar skrip ini akan bekerja tanpa modifikasi, tapi beberapa memerlukan file konfigurasi tambahan karena mereka berurusan dengan hardware-dependent informasi. Script style System-V init banyak digunakan dan relatif sederhana. Untuk opsi tambahan, style BSD init tersedia di http://www.linuxfromscratch.org/hints/downloads/files/bsdinit.txt. Mencari milis LFS untuk depinit, upstart, atau systemd juga menawarkan informasi tambahan. Jika menggunakan gaya alternatif untuk init script, lewati bagian ini. Sebuah daftar dari boot script dapat dicari di Appendix D.

Section 7.6, LFS-Bootscripts-20120229. Section 7.7, How Do These Bootscripts Work?. Section 7.8, Configuring the system hostname. Section 7.9, Configuring the setclock Script. Section 7.10, Configuring the Linux Console. Section 7.11, Configuring the sysklogd Script.

Tahap akhir, pengenalan singkat ke script dan file konfigurasi yang digunakan
101 Linux Fundamental : Linux From Scratch

ketika pengguna log ke dalam sistem.


Section 7.13, The Bash Shell Startup Files. Section 7.14, Creating the /etc/inputrc File.

7.2 Configurasi Network Secara Umum Bagian ini hanya berlaku jika kartu jaringan akan dikonfigurasi. Jika kartu jaringan tidak akan digunakan, ada kemungkinan tidak perlu untuk membuat file konfigurasi apapun yang berkaitan dengan kartu jaringan. Jika kasusnya ini, hapus symilinknetwork dari semua run-level direktori (/etc/rc.d/rc*.d). 7.2.1 Membuat nama untuk network interfaces Jika hanya ada satu antarmuka jaringan dalam sistem yang akan dikonfigurasi, bagian ini adalah opsional, meskipun tidak akan pernah terjadi kesalahan untuk melakukannya. Dalam banyak kasus (misalnya laptop dengan nirkabel dan antarmuka kabel), diperlukan konfigurasi pada bagian ini. Dengan Udev dan driver jaringan modular, jaringan antarmuka penomoran tidak persisten di reboot secara default, karena driver yang dimuat secara paralel dan dengan demikian dalam urutan acak. Sebagai contoh, pada komputer yang memiliki dua kartu jaringan yang dibuat oleh Intel dan Realtek, kartu jaringan yang diproduksi oleh Intel dapat menjadi eth0 dan kartu Realtek menjadi eth1 . Dalam beberapa kasus, setelah reboot kartu mendapatkan nomor sebaliknya. Untuk menghindarinya, Udev dilengkapi dengan script dan beberapa aturan untuk menetapkan nama stabil untuk kartu jaringan berdasarkan alamat MAC mereka. Untuk memastikan nama yang sama pada setiap perangkat setiap boot, maka digunakan script berikut: for NIC in /sys/class/net/* ; do INTERFACE=${NIC##*/} udevadm test --action=add $NIC done Sekarang, memeriksa file / etc/udev/rules.d/70-persistent-net.rules, untuk
102 Linux Fundamental : Linux From Scratch

mengetahui nama yang ditugaskan untuk perangkat jaringan: cat /etc/udev/rules.d/70-persistent-net.rules File ini dimulai dengan blok komentar diikuti oleh dua baris untuk setiap NIC. Baris pertama untuk setiap NIC merupakan deskripsi komentar untuk menampilkan ID perangkat keras (misalnya PCI Vendor dan ID perangkat, apakah itu kartu PCI), bersama dengan drivernya dalam tanda kurung, jika driver dapat ditemukan. Baik ID perangkat keras atau driver digunakan untuk menentukan nama untuk memberikan interface. Baris kedua adalah aturan Udev yang cocok dengan NIC ini dan benar-benar memberikan nama. Semua aturan Udev terdiri dari beberapa kunci, dipisahkan oleh koma dan spasi opsional. Kunci Aturan dan penjelasan tentang masing-masing adalah sebagai berikut: SUBSYSTEM == "net" - ini memberitahu Udev mengabaikan perangkat yang bukan kartu jaringan. ACTION == "add" - ini memberitahu Udev untuk mengabaikan aturan uevent yang bukan add ("remove" dan "change" uevents juga terjadi, tetapi tidak perlu untuk mengubah nama antarmuka jaringan). DRIVER == "? *" - Ini ada begitu Udev yang akan mengabaikan VLAN atau bridge sub-interface (karena sub-interface tidak memiliki driver). Sub-interface melewati ini karena nama yang akan ditugaskan akan bertabrakan dengan perangkat induknya. ATTR {address} - Nilai kunci ini adalah alamat NIC MAC. ATTR {type} == "1" - Hal ini memastikan aturan tersebut hanya cocok antarmuka utama dalam kasus driver nirkabel tertentu, yang membuat antarmuka virtual. Interface sekunder yang melewatkan untuk alasan yang sama bahwa VLAN danbridge subinterface yang dilewati: akan ada tabrakan nama lain. KERNEL == "eth *" - kunci ini ditambahkan ke generator aturan Udev untuk menangani mesin yang memiliki beberapa antarmuka jaringan, semua dengan alamat MAC yang sama (PS3 adalah satu mesin tersebut). Jika antarmuka independen memiliki basenames berbeda, kunci ini akan memungkinkan Udev untuk membedakan mereka. Hal ini umumnya tidak diperlukan bagi sebagian Linux From Scratch pengguna, tetapi tidak merugikan. NAME - Nilai kunci ini adalah nama yang Udev akan tetapkan untuk interface ini. Nilai NAME adalah bagian penting. Pastikan Anda tahu mana nama telah ditetapkan untuk masing-masing kartu jaringan Anda sebelum melanjutkan, dan pastikan untuk menggunakan nilai NAME saat membuat file konfigurasi Anda di bawah ini. 7.2.2 Membuat File Konfigurasi Network Interface
103 Linux Fundamental : Linux From Scratch

Interface dibawa naik turun oleh script jaringan tergantung pada file di / etc / sysconfig /. Direktori ini seharusnya berisi file untuk setiap antarmuka yang akan dikonfigurasi, seperti ifconfig.xyz, dimana "xyz" bermakna bagi administrator seperti nama perangkat (misalnya eth0). Di dalam file ini adalah atribut untuk antarmuka, seperti alamat IP (es), subnet mask, dan sebagainya. Perintah berikut membuat contoh file untuk perangkat eth0 dengan alamat IP statis: cd /etc/sysconfig/ cat > ifconfig.eth0 << "EOF" ONBOOT=yes IFACE=eth0 SERVICE=ipv4-static IP=192.168.1.1 GATEWAY=192.168.1.2 PREFIX=24 BROADCAST=192.168.1.255 EOF Nilai dari variabel-variabel ini harus diubah di setiap file agar sesuai dengan setup yang tepat. Jika variabel ONBOOT diatur ke "yes" script jaringan akan memunculkan Network Interface Card (NIC) pada saat booting sistem. Jika diatur ke sesuatu tetapi "Yes" NIC akan diabaikan oleh script jaringan dan tidak secara otomatis dibesarkan. Interface dapat secara manual dimulai atau dihentikan dengan ifup dan ifdown perintah. Variabel IFACE mendefinisikan nama interface, misalnya, eth0. Hal ini diperlukan untuk semua file konfigurasi perangkat jaringan. Variabel SERVICE mendefinisikan metode yang digunakan untuk mendapatkan alamat IP. Paket LFS-Bootscripts memiliki tugas format IP modular, dan membuat file tambahan dalam / lib / services / direktory memungkinkan metode IP tugas lainnya. Hal ini umumnya digunakan untuk Dynamic Host Configuration Protocol (DHCP), yang dibahas dalam buku BLFS. Variabel GATEWAY harus berisi alamat default IP gateway, jika ada yang hadir. Jika tidak, maka komentar variabel sepenuhnya.

104 Linux Fundamental : Linux From Scratch

Variabel PREFIX harus berisi jumlah bit yang digunakan dalam subnet. Setiap oktet dalam sebuah alamat IP adalah 8 bit. Jika netmask subnet adalah 255.255.255.0, maka menggunakan tiga oktet pertama (24 bit) untuk menentukan nomor jaringan. Jika netmask 255.255.255.240, itu akan menggunakan 28 bit pertama. Awalan lebih dari 24 bit yang umum digunakan oleh DSL dan kabel berbasis Internet Service Provider (ISP). Dalam contoh ini (PREFIX = 24), netmask adalah 255.255.255.0. Mengatur variabel PREFIX menurut subnet spesifik Anda. 7.2.3 Membuat file /etc/resolv.conf Jika sistem ini akan terhubung ke Internet, akan memerlukan beberapa sarana Domain Name Service (DNS) resolusi nama untuk menyelesaikan nama domain internet ke alamat IP, dan sebaliknya. Hal ini paling baik dicapai dengan menempatkan alamat IP dari server DNS, tersedia dari administrator ISP atau jaringan, ke / etc / resolv.conf. Buat file dengan menjalankan berikut: cat > /etc/resolv.conf << "EOF" # Begin /etc/resolv.conf domain <Your Domain Name> nameserver <IP address of your primary nameserver> nameserver <IP address of your secondary nameserver> # End /etc/resolv.conf EOF Pernyataan domain dapat dihilangkan atau diganti dengan pernyataan search. Lihat halaman manual untuk resolv.conf untuk lebih jelasnya. Ganti alamat <IP address of the nameserver> dengan alamat IP dari DNS yang paling tepat untuk setup. Ada akan sering lebih dari satu entri (persyaratan menuntut server sekunder untuk kemampuan fallback). Jika Anda hanya perlu atau ingin satu server DNS, hapus baris nameserver kedua dari file. Alamat IP juga dapat menjadi router pada jaringan lokal. Note: Google Public IPv4 DNS addresses adalah 8.8.8.8 dan 8.8.4.4.

105 Linux Fundamental : Linux From Scratch

7.3. Customizing the /etc/hosts File Jika kartu jaringan akan dikonfigurasi,tentukan alamat IP sepenuhnya memenuhi syarat nama domain (FQDN), dan alias mungkin untuk digunakan dalam file / etc / hosts. Sintaksnya adalah: IP_address myhost.example.org aliases Jika komputer tersebut akan terhubung dengan Internet (yaitu, ada domain yang terdaftar dan sebuah blok valid IP yang diberikan, sebagian besar pengguna tidak memiliki ini), pastikan bahwa alamat IP dalam rentang alamat IP jaringan pribadi. Rentang yang valid adalah: Private Network Address Range 10.0.0.1 - 10.255.255.254 172.x.0.1 - 172.x.255.254 192.168.y.1 - 192.168.y.254 8 16 24 Normal Prefix

x dapat diganti dalam rentang 16-31. y dapat berupa nomor dalam kisaran 0-255. Sebuah alamat private IP yang valid bisa menjadi 192.168.1.1. Sebuah FQDN yang valid untuk IP ini bisa menjadi lfs.example.org. Bahkan jika tidak menggunakan kartu jaringan, FQDN yang valid masih diperlukan. Hal ini diperlukan untuk program tertentu untuk beroperasi dengan benar. Buat file / etc / hosts dengan menjalankan: cat > /etc/hosts << "EOF" # Begin /etc/hosts (network card version) 127.0.0.1 localhost <192.168.1.1> <HOSTNAME.example.org> [alias1] [alias2 ...] # End /etc/hosts (network card version) EOF <192.168.1.1> dan <HOSTNAME.example.org> nilai yang perlu diubah untuk keperluan atau persyaratan tertentu (jika diberi alamat IP oleh administrator network / system dan mesin akan terhubung dengan jaringan yang ada). Nama alias opsional (s) dapat dihilangkan.
106 Linux Fundamental : Linux From Scratch

Jika kartu jaringan tidak akan dikonfigurasi, buat / etc / hosts dengan menjalankan: cat > /etc/hosts << "EOF" # Begin /etc/hosts (no network card version) 127.0.0.1 <HOSTNAME.example.org> <HOSTNAME> localhost # End /etc/hosts (no network card version) EOF

7.4 Perangkat dan Penanganan Modul pada Sistem LFS Dalam Bab 6, kita menginstal paket Udev. Sebelum kita masuk ke rincian tentang bagaimana paket udev ini berjalan, sejarah singkat mengenai metode penggunaan paket udev. Sistem Linux sejak awal menggunakan metode penciptaan perangkat statis, dimana node perangkat besar banyak yang dibuat di dasar / dev (kadang-kadang ribuan node), terlepas dari apakah perangkat keras yang sesuai itu benar-benar ada. Hal ini biasanya dilakukan melalui script MAKEDEV, yang berisi jumlah panggilan ke program mknod dengan angka perangkat major dan minor yang relevan untuk setiap perangkat yang mungkin ada di dunia. Dengan menggunakan metode Udev, hanya perangkat yang terdeteksi oleh kernel yang mendapatkan node perangkat yang memang khusus diciptakan untuk mereka. Karena node perangkat akan dibuat setiap kali sistem booting, mereka akan disimpan pada sistem file devtmpfs (sistem berkas virtual yang berada sepenuhnya di memori sistem). Node device tidak memerlukan banyak ruang, sehingga memori yang digunakan tidak terlalu di utamakan. 7.4.1. Sejarah Pada Februari Tahun 2000, filesystem baru yang disebut devfs dilebur ke dalam kernel 2.3.46 dan dibuat tersedia untuk versi 2.4 dengan kernel stabil. Meskipun berada di dalam kernel itu sendiri, metode menciptakan perangkat dinamis tidak pernah mendapatkan dukungan luar biasa dari para pengembang inti kernel. Masalah utama dengan pendekatan yang dilakukan oleh devfs adalah cara mereka menangani deteksi perangkat, penciptaan, dan penamaan. Isu terakhir, bahwa penamaan perangkat node, adalah mungkin yang paling kritis. Secara umum diketahui bahwa jika
107 Linux Fundamental : Linux From Scratch

nama perangkat yang boleh dikonfigurasi, maka kebijakan penamaan perangkat harus sampai ke administrator sistem, tidak dikenakan kepada para pengembang. Sistem file devfs juga terbatas dari kondisi system yang melekat dalam desain dan tidak bisa diperbaiki tanpa revisi substansial untuk kernel. Hal itu ditandai sebagai kesalahan dalam waktu yang panjang - karena kurangnya pemeliharaan - dan akhirnya dihapus dari kernel pada bulan Juni, 2006. Dengan perkembangan varian 2,5 kernel yang tidak stabil, kemudian dirilis sistem kernel seri 2,6 yang lebih stabil, virtual filesystem baru yang disebut sysfs muncul. Tugas sysfs adalah untuk mengirim pandangan dari konfigurasi perangkat keras sistem untuk proses userspace. Dengan representasi tampilan userspace, kemungkinan melihat pengganti userspace untuk devfs menjadi jauh lebih realistis. 7.4.2. Penerapan Udev 7.4.2.1. sysfs Filesystem sysfs disebutkan secara singkat di atas. Orang mungkin heran bagaimana sysfs tahu tentang perangkat baru pada sistem dan penomoran mana yang cocok dengan perangkat baru tersebut. Driver yang telah dikompilasi ke kernel langsung mendaftarkan perangkat tersebut dengan sysfs seperti yang terdeteksi oleh kernel. Oleh driver dikompilasi sebagai modul, pendaftaran ini akan terjadi ketika modul dimuat. Setelah filesystem sysfs sudah terpasang (on / sys), data yang memiliki driver akan terdaftar di filesystem sysfs lalu di ambil userspace dan udevd untuk diproses (termasuk modifikasi node device). 7.4.2.2. Udev Bootscripts Skrip Init / etc / rc.d / init.d / udev menangani penggunaan node device ketika Linux diboot. Script unsets pengendali uevent dari default / sbin / hotplug. Hal ini dilakukan karena kernel tidak lagi perlu memanggil ke biner eksternal. Sebaliknya udevd akan mendengarkan pada soket netlink untuk uevents bahwa kernel menimbulkan. Selanjutnya, bootscript salinan setiap node perangkat statis yang ada di / lib / udev / perangkat ke / dev. Hal ini diperlukan karena beberapa perangkat, direktori, dan symlink diperlukan sebelum proses perangkat penanganan dinamis tersedia selama tahap awal boot sistem, atau diwajibkan oleh udevd itu sendiri. Menciptakan node perangkat statis di / lib / udev / perangkat juga menyediakan solusi mudah untuk perangkat yang tidak didukung oleh infrastruktur penanganan perangkat dinamis. Para bootscript kemudian mulai daemon Udev, udevd, yang akan bertindak atas suatu uevents yang diterimanya. Akhirnya, bootscript memaksa kernel untuk memutar ulang uevents untuk setiap perangkat yang telah terdaftar dan kemudian menunggu udevd untuk menangani mereka.
108 Linux Fundamental : Linux From Scratch

/ Etc / rc.d / init.d / udev_retry Skrip Init mengurus kembali memicu aktivitas untuk subsistem yang aturan dapat mengandalkan filesystem yang tidak dipasang sampai script mountfs dijalankan (khususnya, / usr dan / var dapat menyebabkan ini). Script ini berjalan setelah script mountfs, sehingga aturan-aturan (jika kembali dipicu) harus berhasil untuk kedua kalinya. Hal ini dikonfigurasi dari file / etc / sysconfig / udev_retry; setiap kata dalam file ini selain komentar dianggap nama subsistem untuk memicu di coba lagi waktu. (Untuk mengetahui subsistem perangkat, menggunakan info udevadm -. Atribut-berjalan kaki)

7.4.2.3. Penciptaan Perangkat Node Pada Udev-181, udevd tidak lagi menciptakan file device di / dev. Sebaliknya, ini harus ditangani di kernel, oleh filesystem devtmpfs. Setiap pengemudi yang ingin mendaftarkan node device akan melalui devtmpfs (melalui inti driver) untuk melakukannya. Ketika contoh devtmpfs di mount ke / dev, node perangkat awalnya akan dibuat dengan nama tetap, hak akses, dan pemilik. Beberapa waktu kemudian, kernel akan mengirimkan uevent untuk udevd. Berdasarkan aturan yang ditetapkan dalam file di dalam / etc / udev / rules.d, / udev / lib / rules.d, dan / run / udev / rules.d direktori, udevd akan menciptakan symlink tambahan ke node perangkat, atau ganti perizinannya, pemilik, atau kelompok, atau memodifikasi entri database internal udevd untuk objek tersebut. Aturan dalam tiga direktori diberi nomor dengan cara yang sama dengan paket LFSBootscripts, dan ketiga direktori digabung bersama. Jika udevd tidak dapat menemukan aturan untuk perangkat itu adalah menciptakan, maka akan meninggalkan hak akses dan kepemilikan pada apa pun devtmpfs digunakan pada awalnya.

7.4.2.4. Memuat Modul

7.4.2.5. Penanganan Perangkat Dinamis / Hotpluggable Saat Anda menyambungkan perangkat, seperti Universal Serial Bus (USB) MP3 player, kernel mengenali bahwa perangkat tersebut kini terhubung dan menghasilkan suatu uevent. Uevent ini kemudian ditangani oleh udev seperti dijelaskan di atas.
109 Linux Fundamental : Linux From Scratch

7.4.3. Masalah dalam Memuat Modul dan Membuat Perangkat Ada beberapa kemungkinan masalah ketika secara otomatis module menciptakan node device. 7.4.3.1. Modul kernel tidak dimuat secara otomatis Udev hanya akan memuat modul jika module memiliki sebuah bus khusus dan driver bus dengan benar mengekspor semua yang diperlukan oleh sysfs. Dalam kasus lain, pengguna harus mengatur pemuatan modul dengan cara lain. Dengan Linux-3.2.6, Udev dapat memuat driver-dengan benar untuk INPUT, IDE, PCI, USB, SCSI, Serio, dan perangkat FireWire. Untuk menentukan apakah driver perangkat yang Anda butuhkan telah di dukung oleh Udev, jalankan modinfo dengan nama modul sebagai argumen. Sekarang coba cari direktori perangkat / sys / bus dan periksa apakah ada file modalias di sana. Jika file modalias ada di sysfs, driver mendukung perangkat dan dapat terhubung secara langsung, tetapi tidak memiliki nama alias, itu adalah bug di driver. ka tidak ada file modalias di direktori / sys / bus, ini berarti bahwa pengembang kernel belum menambahkan dukungan untuk jenis bus. Dengan Linux-3.2.6, hal ini terjadi pada bus ISA. Udev tidak dimaksudkan untuk memuat "wrapper" driver seperti snd-pcm-oss dan nonhardware driver misalnya pengulangan . 7.4.3.2. Sebuah modul kernel tidak dimuat secara otomatis, dan Udev tidak dimaksudkan untuk memuatnya Jika "wrapper" modul hanya meningkatkan fungsionalitas yang disediakan oleh beberapa modul lain (misalnya, snd-pcm-oss meningkatkan fungsi snd-pcm dengan membuat sound card yang tersedia untuk aplikasi OSS), mengkonfigurasi modprobe untuk memuat wrapper setelah beban Udev modul wrapper. Untuk melakukan ini, tambahkan "softdep" baris dalam file / etc / modprobe.d / <filename>. Conf. Sebagai contoh: softdep snd-pcm post: snd-pcm-oss Perhatikan bahwa perintah "softdep" juga memungkinkan pra: dependensi, atau campuran keduanya pra: dan post:. Lihat modprobe.d (5) halaman manual untuk informasi lebih lanjut tentang sintaks "softdep" dan kemampuannya. Jika modul yang dimaksud bukan wrapper dan berfungsi dengan sendirinya, konfigurasi modul bootscript untuk memuat modul ini pada sistem boot. Untuk melakukan ini,
110 Linux Fundamental : Linux From Scratch

tambahkan nama modul ke file / etc / sysconfig / modules di baris yang terpisah. Ini berlaku untuk modul wrapper juga, tetapi suboptimal dalam kasus itu. 7.4.3.3. Udev memuat beberapa modul yang tidak diinginkan Mungkin modul tidak dapat dibangun , atau blacklist dalam file / etc / modprobe.d / blacklist.conf sebagaimana terjadi pad modul forte dalam contoh di bawah ini: blacklist forte Modul blacklist masih dapat dimuat secara manual dengan perintah modprobe eksplisit. 7.4.3.4. Udev menciptakan sebuah perangkat atau membuat symlink yang salah Hal ini biasanya terjadi jika aturan tak terduga cocok dengan sebuah perangkat. Sebagai contoh, aturan yang salah dapat mencocokkan dua disk SCSI (yang diinginkan) dan perangkat SCSI generik yang sesuai (salah) oleh vendor. Cari aturan yang bermasalah itu dan rubah menjadi lebih spesifik, dengan bantuan dari perintah udevadm info. 7.4.3.5. Aturan udev bekerja unreliably Ini mungkin manifestasi lain dari masalah sebelumnya. Jika tidak dan aturan Anda menggunakan atribut sysfs, mungkin masalah pada kernel, yang harus diperbaiki nanti. Untuk saat ini, Anda dapat bekerja di sekitar itu dengan membuat aturan yang digunakan sebagai atribut sysfs dan menambahkan ke file etc/udev/rules.d/10-wait_for_sysfs.rules / (membuat file ini jika tidak ada). 7.4.3.6. Udev tidak membuat perangkat Bagian lebih lanjut mengasumsikan bahwa driver dibangun statis ke dalam kernel atau sudah dimuat sebagai modul. Udev tidak memiliki informasi yang dibutuhkan untuk membuat sebuah node perangkat jika driver kernel tidak mengekspor data untuk sysfs. Ini sering terjadi dengan driver pihak ketiga dari luar kernel. Buat sebuah node perangkat statis di / lib / udev /devicesdengan nomor mayor / minor yang sesuai (lihat device.txt file dalam dokumentasi kernel atau dokumentasi yang disediakan oleh vendor Driver pihak ketiga). Node perangkatstatis akan disalin ke / dev oleh bootscript udev. 7.4.3.7. Perangkat perubahan urutan penamaan secara acak setelah reboot Hal ini disebabkan oleh kenyataan bahwa Udevdengan desain, yang menangani uevents dan modul load secara paralel, sehingga dalam urutan yang tidak terduga. Ini tidak akan pernah "diperbaiki". Anda seharusnya tidak bergantung pada nama kernel karena perangkat akan menjadi tidak stabil. Sebaliknya, membuat aturan sendiri yang membuat symlink dengan nama yang stabil berdasarkan beberapa atribut perangkat, seperti nomor serial atau output dari utilitas various *_id yang diinstal oleh Udev.
111 Linux Fundamental : Linux From Scratch

7.5. Menciptakan symlink Custom untuk Perangkat 7.5.1. CD-ROM symlink Beberapa perangkat lunak yang mungkin ingin Anda instal (misalnya, berbagai media player) berharap / dev / cdrom dan / dev / dvd symlink ada, dan untuk menunjuk ke perangkat CD-ROM atau DVD-ROM. Juga hal yang sangat mudah untuk menempatkan referensi ke CD-ROM atau DVD-rom symlink ke / etc / fstab. Udev dilengkapi dengan script yang akan menghasilkan file aturan untuk membuat symlink ini untuk Anda, tergantung pada kemampuan masing-masing perangkat, tetapi Anda harus memutuskan yang mana dari dua mode operasi script yang ingin Anda gunakan. Pertama, script dapat beroperasi dalam mode "by-path" (gunakan secara default untuk USB dan perangkat FireWire), di mana aturan itu diciptakan tergantung pada jalur fisik ke CD atau perangkat DVD. Kedua, dapat beroperasi di "by-id" Modus (standar untuk IDE dan SCSI perangkat), di mana aturan itu diciptakan tergantung pada string identifikasi yang tersimpan dalam CD atau DVD perangkat itu sendiri. Jalan itu ditentukan oleh script path_id Udev dan string identifikasi yang dibaca dari perangkat keras oleh ata_id atau program scsi_id, tergantung pada jenis perangkat yang Anda miliki. Ada keuntungan untuk masing-masing penggunaan; penggunaan yang tepat untuk digunakan akan tergantung pada apa jenis perubahan perangkat yang mungkin terjadi. Jika Anda berharap jalur fisik ke perangkat (yaitu, port dan / atau slot yang plugs ke dalam) untuk berubah, misalnya karena Anda berencana untuk pindah drive ke port IDE yang berbeda atau konektor USB yang berbeda, maka Anda harus menggunakan "by-id" mode. Di sisi lain, jika Anda berharap identifikasi perangkat untuk berubah, misalnya karena mungkin mati, dan Anda akan menggantinya dengan perangkat yang berbeda dengan kemampuan yang sama dan yang dihubungkan ke konektor yang sama, maka anda harus menggunakan "by -path "mode. Jika kedua jenis perubahan mungkin terjadi dengan drive Anda, pilih mode berdasarkan jenis perubahan yang akan terjadi lebih sering. Jika Anda ingin melihat nilai-nilai script Udev yang akan digunakan, untuk perangkat CD-ROM yang sesuai, cari direktori ini / sys (misalnya, / sys / block / hdd) dan jalankan perintah seperti berikut: udevadm test /sys/block/hdd
112 Linux Fundamental : Linux From Scratch

Lihatlah baris yang mengandung output dari program values*_id . "by-id" mode akan menggunakan nilai ID_SERIAL jika ada dan tidak kosong, selain itu akan menggunakan kombinasi ID_MODEL dan ID_REVISION. "by-path" mode akan menggunakan nilai ID_PATH. Jika mode standar tidak cocok untuk situasi Anda, maka modifikasi berikut dapat dilakukan untuk file / lib/udev/rules.d/75-cd-aliases-generator.rules, sebagai berikut (di mana modus adalah salah satu "by -id "atau" by-path "): sed -i -e 's/"write_cd_rules"/"write_cd_rules mode"/' \ /lib/udev/rules.d/75-cd-aliases-generator.rules Catatan bahwa tidaklah perlu untuk menciptakan aturan atau file symlink saat ini, karena Anda harus mengikat-mount host / dev direktori ke dalam sistem LFS, dan kami menganggap symlink ada pada host. Aturan dan symlink akan dibuat pertama kali pada boot sistem LFS Anda. Namun, jika Anda memiliki beberapa drive CD-ROM, maka symlink dihasilkan pada waktu itu mungkin menunjukkan perangkat yang berbeda dari yang mereka tunjukan pada host Anda, karena perangkat ini tidak ditemukan dalam urutan diprediksi. Tugas dibuat ketika Anda pertama kali boot sistem LFS , jadi ini hanya masalah jika Anda memerlukan symlink pada kedua sistem untuk menunjuk ke perangkat yang sama. Jika Anda membutuhkan itu, kemudian memeriksa (dan mungkin mengedit) file yang dihasilkan / etc/udev/rules.d/70-persistent-cd.rules setelah booting, untuk memastikan symlink ditugaskan sesuai dengan yang Anda butuhkan. 7.5.2. Berhubungan dengan perangkat duplikat Sebagaimana dijelaskan dalam Bagian 7.4. "Perangkat dan Penanganan Modul pada Sistem LFS", urutan di mana perangkat dengan fungsi yang sama muncul di / dev pada dasarnya acak. Misalnya, jika Anda memiliki kamera web dan USB TV tuner, kadangkadang / dev/video0 mengacu pada kamera dan / dev/video1 mengacu tuner, dan kadang-kadang setelah reboot berbalik . Untuk semua kelas kecuali perangkat keras sound card dan kartu jaringan, ini diperbaiki dengan menciptakan aturan udev untuk symlink persisten kustom. Kasus kartu jaringan tertutup secara terpisah dalam Bagian 7.2. " Configurasi Network Secara Umum", dan konfigurasi kartu suara dapat ditemukan di BLFS. Untuk setiap perangkat Anda yang cenderung memiliki masalah ini (bahkan jika masalah tidak ada dalam distribusi Linux Anda saat ini ), cari direktori / sys / class atau / sys / block. Untuk perangkat video, mungkin / sys/class/video4linux/videoX. Mengetahui atribut yang mengidentifikasi perangkat secara unik (biasanya, vendor dan ID produk dan / atau serial pekerjaan angka):
113 Linux Fundamental : Linux From Scratch

udevadm info -a -p /sys/class/video4linux/video0 Kemudian tulis aturan untuk menciptakan symlink, misalnya: cat > /etc/udev/rules.d/83-duplicate_devs.rules << "EOF" # Persistent symlinks for webcam and tuner KERNEL=="video*", ATTRS{idProduct}=="1910", ATTRS{idVendor}=="0d81", \ SYMLINK+="webcam" KERNEL=="video*", ATTRS{device}=="0x036f", ATTRS{vendor}=="0x109e", \ SYMLINK+="tvtuner" EOF Hasilnya adalah / dev/video0 dan / dev/video1 perangkat yang masih mengacu secara acak ke tuner dan kamera web (dan dengan demikian tidak boleh digunakan secara langsung), tetapi ada symlink / dev / tvtuner dan / dev / webcam yang selalu menunjuk ke perangkat yang benar. 7.6.1. LFS-Bootscripts-20120229 7.6.1. Pemasangan LFS-Bootscripts Instal paket: make install 7.6.2. Konten LFS-Bootscripts Installed scripts: checkfs, cleanfs, console, functions, halt, ifdown, ifup, localnet, modules, mountfs, mountkernfs, network, rc, reboot, sendsignals, setclock, static, swap, sysctl, sysklogd, template, udev, and udev_retry Installed directories: /etc/rc.d, /etc/init.d (symbolic link), /etc/sysconfig, /lib/services, /lib/lsb (symbolic link).
114 Linux Fundamental : Linux From Scratch

Deskripsi: checkfs Cek integritas dari sistem file sebelum dipasang (dengan pengecualian jurnal dan sistem jaringan berbasis file) cleanfs Menghapus file yang tidak harus dipertahankan ketika reboot, seperti / var / run / dan / var / lock /, melainkan kembali menciptakan / var / run / utmp dan menghilangkan kemungkinan / etc / nologin, / fastboot, dan / forcefsck file console Memuat tabel keymap yang benar untuk layout keyboard yang diinginkan, tetapi juga mengatur font layar functions Berisi fungsi-fungsi umum, seperti kesalahan dan memeriksa status yang digunakan oleh beberapa bootscripts halt Menghentikan sistem ifdown Menghentikan perangkat jaringan ifup Menginisialisasi perangkat jaringan localnet Mengatur perangkat loopback nama host dan lokal sistem modules Modul kernel yang dimuat terdaftar di / etc / sysconfig / modul, dengan argumen yang diberikan juga ada mountfs Mount semua sistem file, kecuali yang ditandai noauto atau berbasis jaringan mountkernfs
115 Linux Fundamental : Linux From Scratch

Mount sistem file kernel virtual, seperti proc network Mengatur antarmuka jaringan, seperti kartu jaringan, dan membuat default gateway (jika ada) rc Master run-level script kontrol, yang bertanggung jawab untuk menjalankan semua bootscripts satu-per-satu, dalam urutan yang ditentukan oleh nama symbolic link yang diproses reboot Reboot sistem sendsignals Memastikan setiap proses dihentikan sebelum reboot sistem atau terhenti setclock Mengatur ulang jam kernel untuk waktu setempat dalam hal jam hardware tidak diatur ke waktu UTC static Menyediakan fungsi yang diperlukan untuk menetapkan statis Internet Protocol (IP) untuk network interface swap Mengaktifkan dan menonaktifkan file swap dan partisi sysctl Loads nilai-nilai sistem konfigurasi dari / etc / sysctl.conf, jika file yang ada, ke dalam kernel yang berjalan sysklogd Memulai dan menghentikan sistem dan daemon kernel log template Sebuah template untuk membuat bootscripts kustom untuk daemon lain udev
116 Linux Fundamental : Linux From Scratch

Menyiapkan direktori / dev dan memulai Udev udev_retry Retries gagal uevents udev, dan salinan file yang dihasilkan dari aturan ke / etc / udev / rules.d jika diperlukan

7.7. Bagaimana Bootscripts ini Bekerja? Linux menggunakan fasilitas boot khusus bernama SysVinit yang didasarkan pada konsep run-level. Hal ini cukup berbeda dari satu sistem ke sistem lain, sehingga tidak dapat diasumsikan karena hal bekerja di satu distribusi Linux khusus, mereka harus bekerja sama dalam LFS juga. LFS memiliki cara sendiri dalam melakukan sesuatu, tetapi tetap menggunakan standar yang berlaku. SysVinit (yang akan disebut sebagai "init" mulai sekarang) bekerja menggunakan skema run-level. Ada tujuh (nomor 0 sampai 6) run-level (sebenarnya, ada lebih banyak runlevel, tetapi mereka hanya untuk kasus khusus dan umumnya tidak digunakan. Lihat init (8) untuk lebih jelasnya), dan masing-masing berkorespondensi untuk tindakan komputer yang seharusnya dilakukan ketika dijalankan. Default run-level adalah 3. Berikut adalah deskripsi dari berbagai run-level seperti berikut: 0: halt the computer 1: single-user mode 2: multi-user mode without networking 3: multi-user mode with networking 4: reserved for customization, otherwise does the same as 3 5: same as 4, it is usually used for GUI login (like X's xdm or KDE's kdm) 6: reboot the computer 7.7.1. Konfigurasi Sysvinit Selama inisialisasi kernel, program pertama yang dijalankan ini ditentukan pada baris perintah atausecara default init. Program ini membaca inisialisasi file / etc / inittab. Buat file ini dengan script: cat > /etc/inittab << "EOF" # Begin /etc/inittab id:3:initdefault:

117 Linux Fundamental : Linux From Scratch

si::sysinit:/etc/rc.d/init.d/rc S l0:0:wait:/etc/rc.d/init.d/rc 0 l1:S1:wait:/etc/rc.d/init.d/rc 1 l2:2:wait:/etc/rc.d/init.d/rc 2 l3:3:wait:/etc/rc.d/init.d/rc 3 l4:4:wait:/etc/rc.d/init.d/rc 4 l5:5:wait:/etc/rc.d/init.d/rc 5 l6:6:wait:/etc/rc.d/init.d/rc 6 ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now su:S016:once:/sbin/sulogin 1:2345:respawn:/sbin/agetty --noclear tty1 9600 2:2345:respawn:/sbin/agetty tty2 9600 3:2345:respawn:/sbin/agetty tty3 9600 4:2345:respawn:/sbin/agetty tty4 9600 5:2345:respawn:/sbin/agetty tty5 9600 6:2345:respawn:/sbin/agetty tty6 9600 # End /etc/inittab EOF Penjelasan dari file inisialisasi di halaman manual inittab. Untuk LFS, perintah utama yang dijalankan adalah rc. File intialization di atas akan menginstruksikan rc untuk menjalankan semua script dengan S di direktori / etc / rc.d / rcsysinit.d diikuti oleh semua yang menjalankan dengan S di / etc / rc.d / rc?. d direktori dimana tanda tanya ditentukan oleh nilai init default. Untuk kenyamanan debugging, script fungsi ini juga log seluruh output ke / run / var / bootlog. Karena direktori / run adalah tmpfs, file ini tidak persisten pada boots.

118 Linux Fundamental : Linux From Scratch

7.7.2. Mengubah runlevel Mengubah run-level dilakukan dengan <runlevel> init, dimana <runlevel> adalah target run-level. Misalnya, untuk reboot komputer, pengguna dapat menjalankan perintah init 6, yang berati perintah untuk reboot. Demikian juga, init 0 adalah perintah untuk halt. Deskripsi script: start Memulai Layanan stop Menghentikan Layanan. restart Merestart layanan reload Memperbarui Konfigurasi layanan . Ini digunakan setelah file konfigurasi layanan diubah, ketika layanan tidak perlu di-restart. status Memberitahukan jika layanan ini berjalan dengan PID.

7.8. Konfigurasi sistem host Script localnet berfungsi untuk mengatur sistem host, dengan melakukan konfigurasi pada file /etc/sysconfig/network. Buat file / etc / sysconfig / network dan masukkan hostname dengan menjalankan: echo "HOSTNAME=<lfs>" > /etc/sysconfig/network <lfs> perlu diganti dengan nama yang diberikan ke komputer. Jangan memasukkan Fully Qualified Domain Name (FQDN) di sini. Informasi tersebut dimasukkan ke dalam file /etc/hosts.

7.9. Konfigurasi Script setclock Ubah nilai dari variabel UTC di bawah ini ke nilai 0 (nol) jika jam hardware tidak diatur ke waktu UTC.
119 Linux Fundamental : Linux From Scratch

Buat file baru /etc/sysconfig/clock dengan menjalankan script berikut: cat > /etc/sysconfig/clock << "EOF" # Begin /etc/sysconfig/clock UTC=1 # Set this to any options you might need to give to hwclock, # such as machine hardware clock type for Alphas. CLOCKPARAMS= # End /etc/sysconfig/clock EOF

Note CLOCKPARAMS dan paramaters UTC dapat diatur pada file / etc / sysconfig / rc.site.

7.10. Konfigurasi Linux Consule Bagian ini membahas cara mengkonfigurasi bootscript console yang menentukan map keyboard, huruf konsol dan konsol level kernel log. Jika karakter non-ASCII (misalnya, tanda hak cipta, tanda pound Inggris dan simbol Euro) tidak akan digunakan dan keyboard adalah buatan AS, banyak dari bagian ini dapat dilewati. Tanpa file konfigurasi, (atau setara dalam pengaturan rc.site), dan bootscript console tidak akan melakukan apa-apa. Script console membaca file /etc/sysconfig/console untuk informasi konfigurasi. File / etc / sysconfig / console harus berisi baris dalam bentuk: VARIABLE = "value". Berbagai variabel itu adalah: 1. LOGLEVEL
120 Linux Fundamental : Linux From Scratch

2. KEYMAP 3. KEYMAP_CORRECTIONS 4. FONT 5. UNICODE 6. LEGACY_CHARSET Contoh: Untuk setup non-Unicode, hanya variabel KEYMAP dan FONT yang pada umumnya diperlukan. Misalnya, untuk setup Polandia, mungkin bisa menggunakan: cat > /etc/sysconfig/console << "EOF" # Begin /etc/sysconfig/console KEYMAP="pl2" FONT="lat2a-16 -m 8859-2" # End /etc/sysconfig/console EOF Berikut ini adalah contoh Unicode-enabled untuk Bulgaria, di mana stok UTF-8 keymap ada: cat > /etc/sysconfig/console << "EOF" # Begin /etc/sysconfig/console UNICODE="1" KEYMAP="bg_bds-utf8" FONT="LatArCyrHeb-16" # End /etc/sysconfig/console EOF

121 Linux Fundamental : Linux From Scratch

Note: File / etc / sysconfig / console hanya mengendalikan lokalisi teks console Linux. Ini tidak ada hubungannya dengan pengaturan tata letak keyboard yang tepat dan font terminal dalam Sistem X Window, dengan sesi ssh atau dengan console serial. Dalam situasi seperti itu, keterbatasan disebutkan dalam dua item terakhir daftar di atas tidak berlaku.

7.11. Konfigurasi Script sysklogd Script sysklogd memanggil program syslogd dengan option -m 0. Pilihan ini ternyata melenceng timestamp periodik yang syslogd menulis ke file log setiap 20 menit secara default. Jika Anda ingin mengaktifkan tanda timestamp periodik ini, edit / etc / sysconfig / rc.site dan tentukan variabel SYSKLOGD_PARMS ke nilai yang diinginkan. Sebagai contoh, untuk menghapus semua parameter, tetapkan variabel ke nilai null: SYSKLOGD_PARMS= Lihat man syslogd untuk pilihan lainnya.

7.12 File rc.site File opsional / etc / sysconfig / rc.site berisi pengaturan yang secara otomatis ditetapkan untuk setiap script boot. Ini sebagai alternatif untuk mengatur nilai yang ditetapkan di console, nama host, dan file jam di direktori / etc / sysconfig /. Jika variabel-variabel terkait dengan file-file yang terpisah dan rc.site, maka nilai dalam file script khusus harus diutamakan. rc.site juga mengandung parameter yang dapat menyesuaikan aspek lain dari proses boot. Pengaturan variabel IPROMPT akan memungkinkan selektif running bootscripts. Pilihan lain dijelaskan di file comments. Versi standar dari file adalah sebagai berikut: # rc.site
122 Linux Fundamental : Linux From Scratch

# Optional parameters for boot scripts. # Distro Information # These values, if specified here, override the defaults #DISTRO="Linux From Scratch" # The distro name #DISTRO_CONTACT="lfs-dev@linuxfromscratch.org" # Bug report address #DISTRO_MINI="LFS" # Short name used in filenames for distro config # Define custom colors used in messages printed to the screen # Please consult `man console_codes` for more information # under the "ECMA-48 Set Graphics Rendition" section # # Warning: when switching from a 8bit to a 9bit font, # the linux console will reinterpret the bold (1;) to # the top 256 glyphs of the 9bit font. This does # not affect framebuffer consoles # These values, if specified here, override the defaults #BRACKET="\\033[1;34m" # Blue #FAILURE="\\033[1;31m" # Red #INFO="\\033[1;36m" # Cyan #NORMAL="\\033[0;39m" # Grey #SUCCESS="\\033[1;32m" # Green #WARNING="\\033[1;33m" # Yellow # Use a colored prefix # These values, if specified here, override the defaults #BMPREFIX=" "
123 Linux Fundamental : Linux From Scratch

#SUCCESS_PREFIX="${SUCCESS} * ${NORMAL}" #FAILURE_PREFIX="${FAILURE}*****${NORMAL}" #WARNING_PREFIX="${WARNING} *** ${NORMAL}" # Interactive startup #IPROMPT="yes" # Whether to display the interactive boot promp #itime="3" # The ammount of time (in seconds) to display the prompt

# The total length of the distro welcome string, without escape codes #wlen=$(echo "Welcome to ${DISTRO}" | wc -c ) #welcome_message="Welcome to ${INFO}${DISTRO}${NORMAL}" # The total length of the interactive string, without escape codes #ilen=$(echo "Press 'I' to enter interactive startup" | wc -c ) #i_message="Press '${FAILURE}I${NORMAL}' to enter interactive startup" # Set scripts to skip the file system check on reboot #FASTBOOT=yes # Skip reading from the console #HEADLESS=yes # Skip cleaning /tmp #SKIPTMPCLEAN=yes # For setclock #UTC=1 #CLOCKPARAMS=

124 Linux Fundamental : Linux From Scratch

# For consolelog #LOGLEVEL=5 # For network #HOSTNAME=mylfs # Delay between TERM and KILL signals at shutdown #KILLDELAY=3 # Optional sysklogd parameters #SYSKLOGD_PARMS="-m 0" # Console parameters #UNICODE=1 #KEYMAP="de-latin1" #KEYMAP_CORRECTIONS="euro2" #FONT="lat0-16 -m 8859-15" #LEGACY_CHARSET=

7.13. File Bash Shell Startup Basis / etc / profile di bawah ini menetapkan beberapa variabel kondisi yang diperlukan untuk dukungan bahasa asli. Pengaturan secara benar akan menghasilkan: Output dari program diterjemahkan ke dalam bahasa asli

Memperbaiki klasifikasi karakter menjadi huruf, angka dan kelas lainnya. Hal ini diperlukan untuk bash dengan benar menerima non-ASCII karakter di baris perintah di non-Inggris Lokal Pengurutan abjad secara benar negara Default yang sesuai ukuran kertas Memperbaiki format moneter, waktu, dan tanggal
125 Linux Fundamental : Linux From Scratch

Ganti <ll> bawah ini dengan kode dua-huruf untuk bahasa yang diinginkan (misalnya, "id") dan <CC> dengan kode dua huruf untuk negara anda (misalnya, "GB"). <charmap> harus diganti dengan charmap kanonik untuk lokal yang Anda pilih. Pengubah opsional seperti "@ euro" juga mungkin ada. Daftar semua lokal yang didukung oleh Glibc dapat diperoleh dengan menjalankan perintah berikut: locale -a Charmaps dapat memiliki sejumlah alias, misalnya, "ISO-8859-1" juga disebut sebagai "iso8859-1" dan "iso88591". Beberapa aplikasi tidak dapat menangani berbagai sinonim dengan benar (misalnya, mengharuskan "UTF-8" ditulis sebagai "UTF-8", bukan "utf8"), sehingga paling aman dalam banyak kasus untuk memilih nama kanonik untuk daerah tertentu. Untuk menentukan nama kanonik, jalankan perintah berikut, di mana <locale <nama adalah output yang diberikan oleh-lokal untuk lokal pilihan Anda ("en_GB.iso88591" dalam contoh kita). LC_ALL=<locale name> locale charmap Untuk lokal "en_GB.iso88591", perintah di atas akan mencetak: ISO-8859-1 Hal ini menghasilkan pengaturan lokal akhir "en_GB.ISO-8859-1". Penting agar locale ditemukan menggunakan heuristik diatas, sebelum itu diuji tambahkan pada file startup Bash: LC_ALL=<locale name> locale language LC_ALL=<locale name> locale charmap LC_ALL=<locale name> locale int_curr_symbol LC_ALL=<locale name> locale int_prefix Perintah di atas seharusnya mencetak nama bahasa, pengkodean karakter yang digunakan oleh lokal, mata uang lokal, dan awalan untuk memanggil nomor telepon untuk masuk ke negara itu. Jika salah satu perintah di atas gagal dengan pesan yang mirip dengan yang ditunjukkan di bawah ini, ini berarti bahwa tempat Anda itu tidak diinstal dalam Bab 6 atau tidak didukung oleh instalasi default Glibc. locale: Cannot set LC_* to default locale: No such file or directory

126 Linux Fundamental : Linux From Scratch

Jika ini terjadi, Anda harus menginstal lokal yang diinginkan dengan menggunakan perintah localedef, atau memilih lokasi yang berbeda. Instruksi lebih lanjut mengasumsikan bahwa tidak ada pesan kesalahan tersebut dari glibc. Beberapa paket di luar LFS juga mungkin tidak mendukungan untuk lokal yang Anda pilih. Salah satu contoh adalah library X (bagian dari Sistem X Window), dengan output pesan kesalahan sepperti di bawah jika lokal tidak sama persis dengan salah satu nama karakter dalam file peta internal: Warning: locale not supported by Xlib, locale set to C Dalam beberapa kasus Xlib diharapkan bahwa peta karakter akan terdaftar dalam notasi huruf besar dengan strip kanonik. Misalnya, "ISO-8859-1" dibanding "iso88591". Hal ini juga memungkinkan untuk menemukan spesifikasi yang sesuai dengan menghapus bagian charmap dari spesifikasi lokal. Hal ini dapat diperiksa dengan menjalankan perintah lokal charmap di kedua Lokal. Sebagai contoh, seseorang harus mengubah "de_DE.ISO-8859-15 @ euro" ke "de_DE @ euro" untuk mendapatkan lokal diakui oleh Xlib. Setelah pengaturan lokal telah ditentukan dengan benar buat file / etc / profile: cat > /etc/profile << "EOF" # Begin /etc/profile export LANG=<ll>_<CC>.<charmap><@modifiers> # End /etc/profile EOF

7.14. Membuat File etc/inputtrc Di bawah ini adalah inputrc secara global generik beserta komentar untuk menjelaskan berbagai pilihan yang ada. Perhatikan bahwa pada baris yang sama komentar tidak boleh sama. Buat file dengan menggunakan perintah berikut: cat > /etc/inputrc << "EOF" # Begin /etc/inputrc # Modified by Chris Lynn <roryo@roryo.dynup.net>
127 Linux Fundamental : Linux From Scratch

# Allow the command prompt to wrap to the next line set horizontal-scroll-mode Off # Enable 8bit input set meta-flag On set input-meta On # Turns off 8th bit stripping set convert-meta Off # Keep the 8th bit for display set output-meta On # none, visible or audible set bell-style none # All of the following map the escape sequence of the value # contained in the 1st argument to the readline specific functions "\eOd": backward-word "\eOc": forward-word # for linux console "\e[1~": beginning-of-line "\e[4~": end-of-line "\e[5~": beginning-of-history "\e[6~": end-of-history "\e[3~": delete-char "\e[2~": quoted-insert # for xterm
128 Linux Fundamental : Linux From Scratch

"\eOH": beginning-of-line "\eOF": end-of-line # for Konsole "\e[H": beginning-of-line "\e[F": end-of-line # End /etc/inputrc EOF

129 Linux Fundamental : Linux From Scratch

8.3.1 INSTALLASI KERNEL Lakukan untuk kompilasi dengan menjalankan perintah berikut:: make mrproper CATATAN: pastikan di konfigurasi anda memilih : Device Drivers ---> Generic Driver Options ---> Maintain a devtmpfs filesystem to mount at /dev Tahap-tahap kompilasi : tahap 1: make LANG=<host_LANG_value> LC_ALL= menuconfig tahap 2: make Tahap installasi modul : make modules_install Setelah installasi seleseai maka ada beberapa files yang harus yang darus di copy ke direktori. Tahap-tahap pengkopian file direktori : cp -v arch/x86/boot/bzImage /boot/vmlinuz-3.2.6-lfs-7.1
130 Linux Fundamental : Linux From Scratch

System.map adalah file simbol untuk kernel. Berikut adalah perintah untuk menginstall file panduan: cp -v System.map /boot/System.map-3.2.6 Konfigursi file kernel: cp -v .config /boot/config-3.2.6 Instal dokumentasi untuk kernel Linux: install -d /usr/share/doc/linux-3.2.6 cp -r Documentation/* /usr/share/doc/linux-3.2.6 Penting untuk dicatat bahwa file dalam direktori source kernel tidak dimiliki oleh root. Note: 1. Jika source kernel yang akan dipertahankan, jalankan chown-R 0:0 pada direktori-3.2.6 linux untuk memastikan semua file yang dimiliki oleh user root. 2. Beberapa dokumentasi kernel merekomendasikan menciptakan symlink dari / usr / src / linux yang menunjuk ke direktori source kernel. Ini adalah cara khusus untuk kernel sebelum seri 2,6 dan tidak harus diciptakan pada sistem LFS karena dapat menyebabkan masalah pada paket data.3
3.

8.3.2 konfigurasi linux module : Buat file baru / etc / modprobe.d / usb.conf dengan menjalankan berikut: install -v -m755 -d /etc/modprobe.d cat > /etc/modprobe.d/usb.conf << "EOF" # Begin /etc/modprobe.d/usb.conf install ohci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i ohci_hcd ; true install uhci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i uhci_hcd ; true # End /etc/modprobe.d/usb.conf EOF 8.3.3 Bagian Linux: File installer: config-3.2.6, vmlinux-3.2.6-lfs-7.1-3.2.6, dan System.map-3.2.6
131 Linux Fundamental : Linux From Scratch

Direktori installer: / lib / modules, / usr/share/doc/linux-3.2.6

8.4. Menggunakan GRUB Untuk Proses Boot 8.4.1. Introduction Note: Konfigurasi GRUB ysang tidak benar dapat membuat sistem anda tidak bisa beroperasi tanpa perangkat boot alternatif seperti CD-ROM. Pastikan bahwa disk boot darurat siap untuk "menyelamatkan" komputer jika komputer menjadi tidak dapat digunakan (un-bootable). Jika Anda belum memiliki perangkat boot, Anda dapat membuat satu dengan: cd /tmp && grub-mkrescue --output=grub-img.iso && xorriso -as cdrecord -v dev=/dev/cdrw blank=as_needed grub-img.iso 8.4.2. GRUB Penamaan Konvensi GRUB menggunakan penamaan struktur sendiri untuk drive dan partisi dalam bentuk (hdn, m), dimana n adalah jumlah hard drive dan m adalah jumlah partisi. Anda dapat menentukan apa GRUB berpikir device disk Anda adalah dengan menjalankan: grub-mkdevicemap --device-map=device.map cat device.map 8.4.3. Mengatur Konfigurasi GRUB bekerja dengan menulis data ke trek fisik pertama dari hard disk. Lokasi dari partisi boot pilihan pengguna akan mempengaruhi konfigurasi pada kernel. Salah satu rekomendasi adalah memiliki partisi kecil yang terpisah (ukuran yang disarankan adalah 100 MB) partisi ini hanya untuk informasi sistem boot. Berdasarkan informasi di atas, menentukan adalah untuk menentukan partisi mana yang sesuai untuk partisi root. Untuk contoh berikut, diasumsikan bahwa partisi root (atau boot terpisah) adalah sda2.
132 Linux Fundamental : Linux From Scratch

Instal file GRUB ke / boot / grub lalu atur jalur boot: grub-install /dev/sda

Note: grub-install script dan memanggil program lain, grub-probe, yang mungkin gagal dengan pesan "tidak bisa Stat` / dev / root '". Jika demikian, anda harus membuat link simbolik sementara dari partisi root anda ke / dev / root: ln -sv /dev/sda2 /dev/root

8.4.4. Membuat File Konfigurasi Buat / boot / grub / grub.cfg: cat > /boot/grub/grub.cfg << "EOF" # Begin /boot/grub/grub.cfg set default=0 set timeout=5 insmod ext2 set root=(hd0,2) menuentry "GNU/Linux, Linux 3.2.6-lfs-7.1" { linux /boot/vmlinuz-3.2.6-lfs-7.1 root=/dev/sda2 ro } EOF

133 Linux Fundamental : Linux From Scratch

Bab 9. Akhir 9.1. Bagian Akhir Ini mungkin ide yang baik untuk membuat / etc / lfs-release file. Dengan memiliki file ini, sangat mudah bagi Anda untuk mengetahui LFS versi diinstal pada sistem. Buat file ini dengan menjalankan: echo 7.1 > /etc/lfs-release 9.2. Reboot Sistem Sekarang semua perangkat lunak telah terinstal, sekarang saatnya untuk reboot komputer Anda. Namun, Anda harus menyadari beberapa hal. Sistem yang telah Anda buat dalam buku ini cukup minim, dan kemungkinan besar tidak akan memiliki fungsi yang Anda akan perlu untuk dapat terus maju. Anda perlu melakukan installasi untuk beberapa tambahan. Pertama keluar dari lingkungan chroot: logout kemudian unmount sistem file virtual: umount -v $LFS/dev/pts
134 Linux Fundamental : Linux From Scratch

umount -v $LFS/dev/shm umount -v $LFS/dev umount -v $LFS/proc umount -v $LFS/sys Unmount sistem LFS file itu sendiri: umount -v $LFS Jika beberapa partisi dibuat, unmount partisi lain sebelum unmounting yang utama, seperti ini: umount -v $LFS/usr umount -v $LFS/home umount -v $LFS Sekarang, reboot sistem dengan: shutdown -r now

9.4 Sekarang Apa? Sekarang bahwa sistem LFS terinstal, Anda mungkin bertanya-tanya "Apa selanjutnya?" Untuk menjawab pertanyaan itu, kami telah mengumpulkan daftar sumber daya untuk Anda. Pemeliharaan Bugs dan pemberitahuan keamanan dilaporkan secara teratur untuk semua perangkat lunak. Sejak sebuah sistem LFS dikompilasi dari sumber, terserah kepada Anda untuk terus mengikuti laporan tersebut. Ada sumber daya online yang melacak laporan tersebut, beberapa di antaranya adalah sebagai berikut: Freshmeat.net (http://freshmeat.net/) Freshmeat dapat memberitahu Anda (melalui email) versi baru dari paket yang terinstal di sistem anda.
135 Linux Fundamental : Linux From Scratch

CERT (Computer Emergency Response Team) CERT memiliki mailing list yang menerbitkan peringatan keamanan tentang berbagai sistem operasi dan aplikasi. Informasi berlangganan tersedia di http://www.uscert.gov/cas/signup.html. Bugtraq Bugtraq adalah full-disclosure keamanan komputer mailing list. Ini menerbitkan masalah keamanan baru ditemukan, dan kadang-kadang perbaikan potensi untuk mereka. Informasi berlangganan tersedia di http://www.securityfocus.com/archive. Di luar Linux From Scratch Linux Di luar Dari buku Scratch mencakup prosedur instalasi untuk berbagai perangkat lunak di luar lingkup Kitab LFS. Proyek BLFS terletak di http://www.linuxfromscratch.org/blfs/. LFS Petunjuk Para Petunjuk LFS adalah kumpulan dokumen pendidikan telah dikirim relawan dalam komunitas LFS. Petunjuk tersedia di http://www.linuxfromscratch.org/hints/list.html. Milis Ada beberapa milis LFS Anda dapat berlangganan jika Anda membutuhkan bantuan, ingin tinggal saat ini dengan perkembangan terakhir, ingin berkontribusi ke proyek, dan banyak lagi. Lihat Bab 1 - Milis untuk informasi lebih lanjut.

Proyek Dokumentasi Linux Tujuan dari Proyek Dokumentasi Linux (TLDP) adalah untuk berkolaborasi dalam semua masalah dokumentasi Linux. TLDP ini memiliki banyak koleksi HOWTO, panduan, dan halaman manual. Ia berada di http://www.tldp.org.

136 Linux Fundamental : Linux From Scratch

A. Akronim dan Ketentuan ABI ALFS ALSA API ASCII BIOS BLFS BSD Chroot CMOS COS CPU CRC : Application Binary Interface : Automated Linux From Scratch :Advanced Linux Sound Architecture :Application Programming Interface :American Standard Code for Information Interchange :Basic Input/Output System :Beyond Linux From Scratch :Berkeley Software Distribution :change root :Complementary Metal Oxide Semiconductor :Class Of Service :Central Processing Unit :Cyclic Redundancy Check
137 Linux Fundamental : Linux From Scratch

CVS DHCP DNS EGA ELF EOF EQN EVMS ext2 ext3 ext4 FAQ FHS FIFO FQDN FTP GB GCC GID GMT GPG HTML IDE IEEE IO IP

:Concurrent Versions System :Dynamic Host Configuration Protocol :Domain Name Service :Enhanced Graphics Adapter :Executable and Linkable Format :End of File :equation :Enterprise Volume Management System :second extended file system :third extended file system :fourth extended file system :Frequently Asked Questions :Filesystem Hierarchy Standard :First-In, First Out :Fully Qualified Domain Name :File Transfer Protocol :Gigabytes :GNU Compiler Collection :Group Identifier :Greenwich Mean Time :GNU Privacy Guard :Hypertext Markup Language :Integrated Drive Electronics :Institute of Electrical and Electronic Engineers :Input/Output :Internet Protocol
138

Linux Fundamental : Linux From Scratch

IPC IRC ISO ISP KB LED LFS LSB MB MBR MD5 NIC NLS NNTP NPTL OSS PCH PCRE PID PLFS PTY QA QOS RAM RPC RTC

:Inter-Process Communication :Internet Relay Chat :International Organization for Standardization :Internet Service Provider :Kilobytes :Light Emitting Diode :Linux From Scratch :Linux Standard Base :Megabytes :Master Boot Record :Message Digest 5 :Network Interface Card :Native Language Support :Network News Transport Protocol :Native POSIX Threading Library :Open Sound System :Pre-Compiled Headers ;Perl Compatible Regular Expression :Process Identifier :Pure Linux From Scratch :pseudo terminal :Quality Assurance :Quality Of Service :Random Access Memory :Remote Procedure Call :Real Time Clock
139

Linux Fundamental : Linux From Scratch

SBU SCO SGR SHA1 SMP TLDP TFTP TLS UID Umask USB UTC UUID VC VGA VT

:Standard Build Unit :The Santa Cruz Operation :Select Graphic Rendition :Secure-Hash Algorithm 1 :Symmetric Multi-Processor :The Linux Documentation Project :Trivial File Transfer Protocol :Thread-Local Storage :User Identifier :user file-creation mask :Universal Serial Bus :Coordinated Universal Time :Universally Unique Identifier :Virtual Console :Video Graphics Array :Virtual Terminal

B. Dependensi Setiap paket dibangun di LFS bergantung pada satu atau lebih paket-paket lain untuk membangun dan menginstal dengan benar. Beberapa paket bahkan berpartisipasi dalam circular dependencies, yaitu, paket pertama tergantung pada kedua yang pada gilirannya tergantung pada yang pertama. Untuk setiap paket yang kami bangun, kami telah mendaftarkan tiga, dan kadangkadang empat, jenis dependensi:
140 Linux Fundamental : Linux From Scratch

1. Yang pertama daftar paket apa saja yang harus tersedia untuk mengkompilasi dan menginstal paket yang dimaksud. 2. Daftar kedua paket , selain yang terdapat pada daftar pertama, harus tersedia untuk menjalankan test suite. 3. Daftar ketiga dependensi paket yang membutuhkan paket ini akan di pasang pada lokasi yang akan di install. Dalam kebanyakan kasus, hal ini karena paket ini akan hardcode path ke binari dalam script mereka. Jika tidak dibangun dalam urutan tertentu, ini bisa mengakibatkan kesalahan dari / tools / bin / [biner] yang ditempatkan di dalam script yang diinstal ke sistem akhir. Ini jelas tidak diinginkan. Daftar paket: Autoconf Instalasi tergantung pada : Bash, coreutils, grep, M4, Make, Perl, Sed, dan Texinfo Test suite tergantung pada : Automake, diffutils, Findutils, GCC, dan libtool Harus diinstal sebelumnya : Automake Opsional dependensi : Emacs Automake Instalasi tergantung pada : autoconf, Bash, coreutils, Gettext, grep, M4, Make, Perl, Sed, dan Texinfo Test suite tergantung pada : Binutils, Bison, Bzip2, DejaGNU, Diffutils, Expect, Findutils, Flex, GCC, Gettext, Gzip, Libtool, and Tar. Harus diinstal sebelum : Tidak ada Opsional dependensi : Tidak ada Bash Instalasi tergantung pada : Bash, Binutils, Bison, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make, Ncurses, Patch, Readline, Sed, and Texinfo Test suite tergantung pada : Tidak ada Harus diinstal sebelum : Tidak ada Opsional dependensi : Xorg Binutils Instalasi tergantung pada : Bash, Binutils, Coreutils, Diffutils, File, Gawk, GCC, Glibc, Grep, Make, Perl, Sed, Texinfo and Zlib Test suite tergantung pada : DejaGNU and Expect Harus diinstal sebelum : Tidak ada Opsional dependensi : Tidak ada Bison Instalasi tergantung pada : Bash, binutils, coreutils, GCC, Gettext, glibc, grep, M4, Make, dan Sed
141 Linux Fundamental : Linux From Scratch

Test suite tergantung pada : diffutils dan Findutils Harus diinstal sebelumnya : Flex, kbd, dan Tar Opsional dependensi : Doxygen (test suite) Bzip2 Instalasi tergantung pada : Bash, binutils, coreutils, diffutils, GCC, glibc, Make, dan Patch Test suite tergantung pada : Tidak ada Harus diinstal sebelum : Tidak ada Opsional dependensi : Tidak ada Coreutils Instalasi tergantung pada : Bash, binutils, coreutils, GCC, Gettext, glibc, GMP, grep, Make, Patch, Perl, Sed, dan Texinfo Test suite tergantung pada : diffutils, e2fsprogs, Findutils, dan Util-linux Harus diinstal sebelumnya : Bash, diffutils, Findutils, Man-DB, dan Udev Opsional dependensi : Perl Mengharapkan Perl Expect and IO:Tty modules (for test suite) DejaGNU Instalasi tergantung pada : Bash, coreutils, diffutils, GCC, grep, Make, dan Sed Test suite tergantung pada : Tidak ada test suite tersedia Harus diinstal sebelum : Tidak ada Opsional dependensi : Tidak ada Diffutils Instalasi tergantung pada : Bash, Binutils, Coreutils, Gawk, GCC, Gettext, Glibc, Grep, Make, Sed, and Texinfo Test suite tergantung pada : diffutils, Perl Harus diinstal sebelum : Tidak ada Opsional dependensi : Tidak ada Expect Instalasi tergantung pada : Bash, binutils, coreutils, diffutils, GCC, glibc, grep, Make, Patch, Sed, dan Tcl Test suite tergantung pada : Tidak ada Harus diinstal sebelum : Tidak ada Opsional dependensi : Tidak ada E2fsprogs Instalasi tergantung pada : Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Gzip, Make, Sed, Texinfo, dan Util-linux Test suite tergantung pada : Psmisc Harus diinstal sebelum : Tidak ada Opsional dependensi : Tidak ada File Instalasi tergantung pada : Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep,
142 Linux Fundamental : Linux From Scratch

Make, Sed, dan Zlib Test suite tergantung pada : Tidak ada Harus diinstal sebelum : Tidak ada Opsional dependensi : Tidak ada Findutils Instalasi tergantung pada : Bash, binutils, coreutils, GCC, Gettext, glibc, grep, Make, Sed, dan Texinfo Test suite tergantung pada : DejaGNU, Diffutils, and Expect Harus diinstal sebelum : Tidak ada Opsional dependensi : Tidak ada Flex Instalasi tergantung pada : Bash, binutils, coreutils, GCC, Gettext, glibc, grep, M4, Make, Patch, Sed, dan Texinfo Test suite tergantung pada : Bison and Gawk Harus diinstal sebelumnya : iproute2, kbd, dan Man-DB Opsional dependensi : Tidak ada Gawk Instalasi tergantung pada : Bash, binutils, coreutils, GCC, Gettext, glibc, grep, Make, Patch, Sed dan, Texinfo Test suite tergantung pada : diffutils Harus diinstal sebelum : Tidak ada Opsional dependensi : Tidak ada Gcc Instalasi tergantung pada : Bash, binutils, coreutils, diffutils, Findutils, gawk, GCC, Gettext, glibc, GMP, grep, M4, Make, MPC, MPFR, Patch, Perl, Sed, Tar, dan Texinfo Test suite tergantung pada : DejaGNU dan expect Harus diinstal sebelum : Tidak ada Opsional dependensi : CLooG-PPL, AGAS dan PPL Gdbm Instalasi tergantung pada : Bash, binutils, coreutils, diffutils, GCC, grep, Make, dan Sed Test suite tergantung pada : Tidak ada Harus diinstal sebelum : Tidak ada Opsional dependensi : Tidak ada Gettext Instalasi tergantung pada : Bash, binutils, coreutils, gawk, GCC, glibc, grep, Make, Sed, dan Texinfo Test suite tergantung pada : diffutils, Perl, dan Tcl Harus diinstal sebelumnya : Automake Opsional dependensi : Tidak ada Glibc Instalasi tergantung pada : Bash, binutils, coreutils, diffutils, gawk, GCC, Gettext, grep,
143 Linux Fundamental : Linux From Scratch

Gzip, Linux API headers, Make, Perl, Sed, dan Texinfo Test suite tergantung pada : File Harus diinstal sebelum : Tidak ada Opsional dependensi : Tidak ada GMP Instalasi tergantung pada : Bash, binutils, coreutils, diffutils, gawk, GCC, glibc, grep, M4, Make, Sed dan Texinfo Test suite tergantung pada : Tidak ada Harus diinstal sebelumnya : MPFR, GCC Opsional dependensi : Tidak ada Grep Instalasi tergantung pada : Bash, binutils, coreutils, diffutils, GCC, Gettext, glibc, grep, Make, Patch, Sed, dan Texinfo Test suite tergantung pada : gawk Harus diinstal sebelumnya : Man-DB Opsional dependensi : PCRE, Xorg, dan CUPS Groff Instalasi tergantung pada : Bash, binutils, Bison, coreutils, gawk, GCC, glibc, grep, Make, Patch, Sed, dan Texinfo Test suite tergantung pada : Tidak ada test suite tersedia Harus diinstal sebelumnya : Man-DB dan Perl Opsional dependensi : GPL Ghostscript GRUB Instalasi tergantung pada : Bash, binutils, Bison, coreutils, diffutils, GCC, Gettext, glibc, grep, Make, ncurses, Sed, Texinfo, dan xz Test suite tergantung pada : Tidak ada Harus diinstal sebelum : Tidak ada Opsional dependensi : Tidak ada Gzip Instalasi tergantung pada : Bash, binutils, coreutils, GCC, glibc, grep, Make, Sed, dan Texinfo Test suite tergantung pada : diffutils Harus diinstal sebelumnya : Man-DB Opsional dependensi : Tidak ada IANA-Etc Instalasi tergantung pada : coreutils, gawk, dan Make Test suite tergantung pada : Tidak ada test suite tersedia Harus diinstal sebelumnya : Perl Opsional dependensi : Tidak ada Inetutils
144 Linux Fundamental : Linux From Scratch

Instalasi tergantung pada : Bash, binutils, coreutils, GCC, glibc, grep, Make, ncurses, Patch, Sed, Texinfo, dan zlib Test suite tergantung pada : Tidak ada test suite tersedia Harus diinstal sebelumnya : Tar Opsional dependensi : Tidak ada Iproute2 Instalasi tergantung pada : Bash, Bison, coreutils, Flex, GCC, glibc, Make, dan Linux API Header Test suite tergantung pada : Tidak ada test suite tersedia Harus diinstal sebelum : Tidak ada Opsional dependensi : Tidak ada Kbd Instalasi tergantung pada : Bash, binutils, Bison, coreutils, Flex, GCC, Gettext, glibc, Gzip, Make, Patch, dan Sed Test suite tergantung pada : Tidak ada test suite tersedia Harus diinstal sebelum : Tidak ada Opsional dependensi : Tidak ada Kmod Instalasi tergantung pada : Bash, binutils, Bison, coreutils, Flex, GCC, Gettext, glibc, Gzip, Make, Sed, xz-Utils, zlib Test suite tergantung pada : Tidak ada test suite tersedia Harus diinstal sebelumnya : Udev Opsional dependensi : Tidak ada Less Instalasi tergantung pada : Bash, binutils, coreutils, diffutils, GCC, glibc, grep, Make, ncurses, dan Sed Test suite tergantung pada : Tidak ada test suite tersedia Harus diinstal sebelum : Tidak ada Opsional dependensi : PCRE Libpipeline Instalasi tergantung pada : Bash, binutils, coreutils, diffutils, gawk, GCC, glibc, grep, Make, Sed, dan Texinfo Test suite tergantung pada : Tidak ada test suite tersedia Harus diinstal sebelumnya : Man-DB Opsional dependensi : Tidak ada Libtool Instalasi tergantung pada : Bash, binutils, coreutils, diffutils, melongo, GCC, glibc, grep, Make, Sed, dan Texinfo Test suite tergantung pada : Findutils Harus diinstal sebelum : Tidak ada Opsional dependensi : Tidak ada
145 Linux Fundamental : Linux From Scratch

Linux Kernel Instalasi tergantung pada : Bash, binutils, coreutils, diffutils, Findutils, GCC, glibc, grep, Gzip, kmod, Make, ncurses, Perl, dan Sed Test suite tergantung pada : Tidak ada test suite tersedia Harus diinstal sebelum : Tidak ada Opsional dependensi : Tidak ada M4 Instalasi tergantung pada : Bash, binutils, coreutils, GCC, glibc, grep, Make, Sed, dan Texinfo Test suite tergantung pada : diffutils Harus diinstal sebelumnya : autoconf dan Bison Opsional dependensi : libsigsegv Make Instalasi tergantung pada : Bash, binutils, coreutils, GCC, Gettext, glibc, grep, Make, Sed, dan Texinfo Test suite tergantung pada : Perl dan procps Harus diinstal sebelum : Tidak ada Opsional dependensi : Tidak ada Man-DB Instalasi tergantung pada : Bash, binutils, Bzip2, coreutils, Flex, GCC, gdbm, Gettext, glibc, grep, Groff, Gzip, Kurang, Libpipeline, Make, Sed, dan xz Test suite tergantung pada : Tidak menjalankan. Membutuhkan Man-DB paket test suite Harus diinstal sebelum : Tidak ada Opsional dependensi : Tidak ada Man-Pages Instalasi tergantung pada : Bash, coreutils, dan Membuat Test suite tergantung pada : Tidak ada test suite tersedia Harus diinstal sebelum : Tidak ada Opsional dependensi : Tidak ada MPC Instalasi tergantung pada : Bash, binutils, coreutils, diffutils, gawk, GCC, glibc, grep, GMP, Make, MPFR, Sed dan Texinfo Test suite tergantung pada : Tidak ada Harus diinstal sebelum : GCC Opsional dependensi : Tidak ada MPFR Instalasi tergantung pada : Bash, binutils, coreutils, diffutils, gawk, GCC, glibc, grep, GMP, Make, Sed dan Texinfo Test suite tergantung pada : Tidak ada Harus diinstal sebelum : GCC
146 Linux Fundamental : Linux From Scratch

Opsional dependensi

: Tidak ada

Ncurses Instalasi tergantung pada : Bash, binutils, coreutils, diffutils, gawk, GCC, glibc, grep, Make, Patch, dan Sed Test suite tergantung pada : Tidak ada test suite tersedia Harus diinstal sebelumnya : Bash, GRUB, Inetutils, less, procps, Psmisc, Readline, Texinfo, Util-linux, dan Vim Opsional dependensi : Tidak ada Patch Instalasi tergantung pada : Bash, binutils, coreutils, GCC, glibc, grep, Make, dan Sed Test suite tergantung pada : Tidak ada test suite tersedia Harus diinstal sebelum : Tidak ada Opsional dependensi : Ed Perl Instalasi tergantung pada : Bash, binutils, coreutils, gawk, GCC, gdbm, glibc, grep, Groff, Make, Sed, dan zlib Test suite tergantung pada : IANA-Etc dan procps Harus diinstal sebelumnya : autoconf Opsional dependensi : Tidak ada Procps Instalasi tergantung pada : Bash, binutils, coreutils, GCC, glibc, Make, dan ncurses Test suite tergantung pada : Tidak ada test suite tersedia Harus diinstal sebelum : Tidak ada Opsional dependensi : Tidak ada Psmisc Instalasi tergantung pada : Bash, binutils, coreutils, GCC, Gettext, glibc, grep, Make, ncurses, dan Sed Test suite tergantung pada : Tidak ada test suite tersedia Harus diinstal sebelum : Tidak ada Opsional dependensi : Tidak ada Readline Instalasi tergantung pada : Bash, binutils, coreutils, gawk, GCC, glibc, grep, Make, ncurses, Patch, Sed, dan Texinfo Test suite tergantung pada : Tidak ada test suite tersedia Harus diinstal sebelum : Bash Opsional dependensi : Tidak ada Sed Instalasi tergantung pada : Bash, binutils, coreutils, GCC, Gettext, glibc, grep, Make, Sed, dan Texinfo Test suite tergantung pada : diffutils dan gawk
147 Linux Fundamental : Linux From Scratch

Harus diinstal sebelumnya : e2fsprogs, File, libtool, dan Shadow Opsional dependensi : Cracklib Shadow Instalasi tergantung pada : Bash, binutils, coreutils, diffutils, Findutils, gawk, GCC, Gettext, glibc, grep, Make, dan Sed Test suite tergantung pada : Tidak ada test suite tersedia Harus diinstal sebelum : Tidak ada Opsional dependensi : Acl, attr, Cracklib, PAM Sysklogd Instalasi tergantung pada : binutils, coreutils, GCC, glibc, Make, dan Patch Test suite tergantung pada : Tidak ada test suite tersedia Harus diinstal sebelum : Tidak ada Opsional dependensi : Tidak ada Sysvinit Instalasi tergantung pada : binutils, coreutils, GCC, glibc, Make, dan Sed Test suite tergantung pada : Tidak ada test suite tersedia Harus diinstal sebelum : Tidak ada Opsional dependensi : Tidak ada Tar Instalasi tergantung pada : Bash, binutils, Bison, coreutils, GCC, Gettext, glibc, grep, Inetutils, Make, Sed, dan Texinfo Test suite tergantung pada : autoconf, diffutils, Findutils, gawk, dan Gzip Harus diinstal sebelum : Tidak ada Opsional dependensi : Tidak ada Tcl Instalasi tergantung pada : Bash, binutils, coreutils, diffutils, GCC, glibc, grep, Make, dan Sed Test suite tergantung pada : Tidak ada Harus diinstal sebelum : Tidak ada Opsional dependensi : Tidak ada Texinfo Instalasi tergantung pada : Bash, binutils, coreutils, GCC, Gettext, glibc, grep, Make, ncurses, Patch, dan Sed Test suite tergantung pada : Tidak ada Harus diinstal sebelum : Tidak ada Opsional dependensi : Tidak ada Udev Instalasi tergantung pada : Bash, binutils, coreutils, diffutils, gawk, GCC, glibc, grep, kmod, Make, dan Sed Test suite tergantung pada : Tidak ada test suite tersedia Harus diinstal sebelum : Tidak ada
148 Linux Fundamental : Linux From Scratch

Opsional dependensi

: Glib, PCI-Utils, Python, Systemd, USB-Utils

Util-linux Instalasi tergantung pada : Bash, binutils, coreutils, diffutils, Findutils, gawk, GCC, Gettext, glibc, grep, Make, ncurses, Sed, dan zlib Test suite tergantung pada : Tidak ada test suite tersedia Harus diinstal sebelum : Tidak ada Opsional dependensi : Tidak ada Vim Instalasi tergantung pada : Bash, binutils, coreutils, diffutils, GCC, glibc, grep, Make, ncurses, dan Sed Test suite tergantung pada : Tidak ada Harus diinstal sebelum : Tidak ada Opsional dependensi : Xorg, GTK +2, Lesstif, Python, Tcl, Ruby, dan GPM Xz Instalasi tergantung pada : Bash, binutils, coreutils, diffutils, GCC, glibc, dan Make. Test suite tergantung pada : Tidak ada Harus diinstal sebelumnya : GRUB, kmod, Man-DB, Udev Opsional dependensi : Tidak ada Zlib Instalasi tergantung pada : Bash, binutils, coreutils, GCC, glibc, Make, dan Sed Test suite tergantung pada : Tidak ada Harus diinstal sebelumnya : File, kmod, Perl, dan Util-linux Opsional dependensi : Tidak ada C. Boot dan sysconfig script versi-20120229 Script dalam lampiran ini terdaftar dengan direktori di mana mereka biasanya berada. Perintah adalah / etc / rc.d / init.d, / etc / sysconfig, / etc / sysconfig / network-devices, dan / etc / sysconfig / network-perangkat / services.

C.1. /etc/rc.d/init.d/rc Skrip rc adalah script pertama yang dipanggil dengan init dan memulai proses boot.

#!/bin/sh ######################################################################## # Begin rc # # Description : Main Run Level Control Script

149 Linux Fundamental : Linux From Scratch

# # Authors : Gerard Beekmans - gerard@linuxfromscratch.org # : DJ Lucas - dj@linuxfromscratch.org # Update : Bruce Dubbs - bdubbs@linuxfromscratch.org # # Version : LFS 7.0 # ######################################################################## . /lib/lsb/init-functions print_error_msg() { log_failure_msg # $i is set when called MSG="FAILURE:\n\nYou should not be reading this error message.\n\n" MSG="${MSG}It means that an unforeseen error took place in\n" MSG="${MSG}${i},\n" MSG="${MSG}which exited with a return value of ${error_value}.\n" MSG="${MSG}If you're able to track this error down to a bug in one of\n" MSG="${MSG}the files provided by the files provided by\n" MSG="${MSG}the ${DISDRI_MINI} book, please be so kind to inform us at\n" MSG="${MSG}${DISTRO_CONTACT}.\n" log_failure_msg "${MSG}" log_info_msg "Press Enter to continue..." wait_for_user } check_script_status() { # $i is set when called if [ ! -f ${i} ]; then log_warning_msg "${i} is not a valid symlink." continue fi if [ ! -x ${i} ]; then log_warning_msg "${i} is not executable, skipping." continue fi } run() { if [ -z $interactive ]; then ${1} ${2} return $? fi while true; do read -p "Run ${1} ${2} (Yes/no/continue)? " -n 1 runit echo case ${runit} in c | C) interactive="" ${i} ${2} ret=${?} break; ;; n | N)

150 Linux Fundamental : Linux From Scratch

return 0 ;; y | Y) ${i} ${2} ret=${?} break ;; esac done return $ret } # Read any local settings/overrides [ -r /etc/sysconfig/rc.site ] && source /etc/sysconfig/rc.site DISTRO=${DISTRO:-"Linux From Scratch"} DISTRO_CONTACT=${DISTRO_CONTACT:-"lfs-dev@linuxfromscratch.org (Registration required)"} DISTRO_MINI=${DISTRO_MINI:-"LFS"} IPROMPT=${IPROMPT:-"no"} # These 3 signals will not cause our script to exit trap "" INT QUIT TSTP [ "${1}" != "" ] && runlevel=${1} if [ "${runlevel}" == "" ]; then echo "Usage: ${0} <runlevel>" >&2 exit 1 fi previous=${PREVLEVEL} [ "${previous}" == "" ] && previous=N if [ ! -d /etc/rc.d/rc${runlevel}.d ]; then log_info_msg "/etc/rc.d/rc${runlevel}.d does not exist.\n" exit 1 fi if [ "$runlevel" == "6" -o "$runlevel" == "0" ]; then IPROMPT="no"; fi # Note: In ${LOGLEVEL:-7}, it is ':' 'dash' '7', not minus 7 if [ "$runlevel" == "S" ]; then dmesg -n "${LOGLEVEL:-7}"; fi if [ "${IPROMPT}" == "yes" -a "${runlevel}" == "S" ]; then # The total length of the distro welcome string, without escape codes wlen=${wlen:-$(echo "Welcome to ${DISTRO}" | wc -c )} welcome_message=${welcome_message:-"Welcome to ${INFO}${DISTRO}${NORMAL}"} # The total length of the interactive string, without escape codes ilen=${ilen:-$(echo "Press 'I' to enter interactive startup" | wc -c )} i_message=${i_message:-"Press '${FAILURE}I${NORMAL}' to enter interactive startup"} # dcol and icol are spaces before the message to center the message # on screen. itime is the amount of wait time for the user to press a key wcol=$(( ( ${COLUMNS} - ${wlen} ) / 2 )) icol=$(( ( ${COLUMNS} - ${ilen} ) / 2 )) itime=${itime:-"3"} echo -e "\n\n" echo -e "\\033[${wcol}G${welcome_message}" echo -e "\\033[${icol}G${i_message}${NORMAL}"

151 Linux Fundamental : Linux From Scratch

echo "" read -t "${itime}" -n 1 interactive 2>&1 > /dev/null fi # Make lower case [ "${interactive}" == "I" ] && interactive="i" [ "${interactive}" != "i" ] && interactive="" # Read the state file if it exists from runlevel S [ -r /var/run/interactive ] && source /var/run/interactive # Attempt to stop all services started by the previous runlevel, # and killed in this runlevel if [ "${previous}" != "N" ]; then for i in $(ls -v /etc/rc.d/rc${runlevel}.d/K* 2> /dev/null) do check_script_status suffix=${i#/etc/rc.d/rc$runlevel.d/K[0-9][0-9]} prev_start=/etc/rc.d/rc$previous.d/S[0-9][0-9]$suffix sysinit_start=/etc/rc.d/rcS.d/S[0-9][0-9]$suffix if [ "${runlevel}" != "0" -a "${runlevel}" != "6" ]; then if [ ! -f ${prev_start} -a ! -f ${sysinit_start} ]; then MSG="WARNING:\n\n${i} can't be " MSG="${MSG}executed because it was not " MSG="${MSG}not started in the previous " MSG="${MSG}runlevel (${previous})." log_warning_msg "$MSG" continue fi fi run ${i} stop error_value=${?} if [ "${error_value}" != "0" ]; then print_error_msg; fi done fi if [ "${previous}" == "N" ]; then export IN_BOOT=1; fi if [ "$runlevel" == "6" -a -n "${FASTBOOT}" ]; then touch /fastboot fi # Start all functions in this runlevel for i in $( ls -v /etc/rc.d/rc${runlevel}.d/S* 2> /dev/null) do if [ "${previous}" != "N" ]; then suffix=${i#/etc/rc.d/rc$runlevel.d/S[0-9][0-9]} stop=/etc/rc.d/rc$runlevel.d/K[0-9][0-9]$suffix prev_start=/etc/rc.d/rc$previous.d/S[0-9][0-9]$suffix [ -f ${prev_start} -a ! -f ${stop} ] && continue fi check_script_status case ${runlevel} in 0|6) run ${i} stop ;;

152 Linux Fundamental : Linux From Scratch

*) run ${i} start ;; esac error_value=${?} if [ "${error_value}" != "0" ]; then print_error_msg; fi done # Store interactive variable on switch from runlevel S and remove if not if [ "${runlevel}" == "S" -a "${interactive}" == "i" ]; then echo "interactive=\"i\"" > /var/run/interactive else rm -f /var/run/interactive 2> /dev/null fi # Copy the boot log on initial boot only if [ "${previous}" == "N" -a "${runlevel}" != "S" ]; then cat /run/var/bootlog >> /var/log/boot.log # Mark the end of boot echo "--------" >> /var/log/boot.log # Remove the temporary file rm -f /run/var/bootlog 2> /dev/null fi # End rc C.2. /lib/lsb/init-functions #!/bin/sh ######################################################################## # # Begin /lib/lsb/init-funtions # # Description : Run Level Control Functions # # Authors : Gerard Beekmans - gerard@linuxfromscratch.org # : DJ Lucas - dj@linuxfromscratch.org # Update : Bruce Dubbs - bdubbs@linuxfromscratch.org # # Version : LFS 7.0 # # Notes : With code based on Matthias Benkmann's simpleinit-msb # http://winterdrache.de/linux/newboot/index.html # # The file should be located in /lib/lsb # ######################################################################## ## Environmental setup # Setup default values for environment umask 022 export PATH="/bin:/usr/bin:/sbin:/usr/sbin" ## Screen Dimensions # Find current screen size if [ -z "${COLUMNS}" ]; then COLUMNS=$(stty size) COLUMNS=${COLUMNS##* } fi # When using remote connections, such as a serial port, stty size returns 0

153 Linux Fundamental : Linux From Scratch

if [ "${COLUMNS}" = "0" ]; then COLUMNS=80 fi ## Measurements for positioning result messages COL=$((${COLUMNS} - 8)) WCOL=$((${COL} - 2)) ## Set Cursor Position Commands, used via echo SET_COL="\\033[${COL}G" # at the $COL char SET_WCOL="\\033[${WCOL}G" # at the $WCOL char CURS_UP="\\033[1A\\033[0G" # Up one line, at the 0'th char CURS_ZERO="\\033[0G" ## Set color commands, used via echo # Please consult `man console_codes for more information # under the "ECMA-48 Set Graphics Rendition" section # # Warning: when switching from a 8bit to a 9bit font, # the linux console will reinterpret the bold (1;) to # the top 256 glyphs of the 9bit font. This does # not affect framebuffer consoles NORMAL="\\033[0;39m" # Standard console grey SUCCESS="\\033[1;32m" # Success is green WARNING="\\033[1;33m" # Warnings are yellow FAILURE="\\033[1;31m" # Failures are red INFO="\\033[1;36m" # Information is light cyan BRACKET="\\033[1;34m" # Brackets are blue # Use a colored prefix BMPREFIX=" " SUCCESS_PREFIX="${SUCCESS} * ${NORMAL}" FAILURE_PREFIX="${FAILURE}*****${NORMAL}" WARNING_PREFIX="${WARNING} *** ${NORMAL}" SUCCESS_SUFFIX="${BRACKET}[${SUCCESS} OK ${BRACKET}]${NORMAL}" FAILURE_SUFFIX="${BRACKET}[${FAILURE} FAIL ${BRACKET}]${NORMAL}" WARNING_SUFFIX="${BRACKET}[${WARNING} WARN ${BRACKET}]${NORMAL}" BOOTLOG=/run/var/bootlog KILLDELAY=3 # Set any user specified environment variables e.g. HEADLESS [ -r /etc/sysconfig/rc.site ] && . /etc/sysconfig/rc.site ################################################################################ # start_daemon() # # Usage: start_daemon [-f] [-n nicelevel] [-p pidfile] pathname [args...] # # # # Purpose: This runs the specified program as a daemon # # # # Inputs: -f: (force) run the program even if it is already running. # # -n nicelevel: specify a nice level. See 'man nice(1)'. # # -p pidfile: use the specified file to determine PIDs. # # pathname: the complete path to the specified program # # args: additional arguments passed to the program (pathname) # # # # Return values (as defined by LSB exit codes): # # 0 - program is running or service is OK # # 1 - generic or unspecified error # # 2 - invalid or excessive argument(s) # # 5 - program is not installed # ################################################################################

154 Linux Fundamental : Linux From Scratch

start_daemon() { local force="" local nice="0" local pidfile="" local pidlist="" local retval="" # Process arguments while true do case "${1}" in -f) force="1" shift 1 ;; -n) nice="${2}" shift 2 ;; -p) pidfile="${2}" shift 2 ;; -*) return 2 ;; *) program="${1}" break ;; esac done # Check for a valid program if [ ! -e "${program}" ]; then return 5; fi # Execute if [ -z "${force}" ]; then if [ -z "${pidfile}" ]; then # Determine the pid by discovery pidlist=`pidofproc "${1}"` retval="${?}" else # The PID file contains the needed PIDs # Note that by LSB requirement, the path must be given to pidofproc, # however, it is not used by the current implementation or standard. pidlist=`pidofproc -p "${pidfile}" "${1}"` retval="${?}" fi # Return a value ONLY # It is the init script's (or distribution's functions) responsibilty # to log messages! case "${retval}" in 0) # Program is already running correctly, this is a # succesful start.

155 Linux Fundamental : Linux From Scratch

return 0 ;; 1) # Program is not running, but an invalid pid file exists # remove the pid file and continue rm -f "${pidfile}" ;; 3) # Program is not running and no pidfile exists # do nothing here, let start_deamon continue. ;; *) # Others as returned by status values shall not be interpreted # and returned as an unspecified error. return 1 ;; esac fi # Do the start! nice -n "${nice}" "${@}" } ################################################################################ # killproc() # # Usage: killproc [-p pidfile] pathname [signal] # # # # Purpose: Send control signals to running processes # # # # Inputs: -p pidfile, uses the specified pidfile # # pathname, pathname to the specified program # # signal, send this signal to pathname # # # # Return values (as defined by LSB exit codes): # # 0 - program (pathname) has stopped/is already stopped or a # # running program has been sent specified signal and stopped # # successfully # # 1 - generic or unspecified error # # 2 - invalid or excessive argument(s) # # 5 - program is not installed # # 7 - program is not running and a signal was supplied # ################################################################################ killproc() { local pidfile local program local prefix local progname local signal="-TERM" local fallback="-KILL" local nosig local pidlist local retval local pid local delay="30" local piddead local dtime # Process arguments while true; do case "${1}" in

156 Linux Fundamental : Linux From Scratch

-p) pidfile="${2}" shift 2 ;; *) program="${1}" if [ -n "${2}" ]; then signal="${2}" fallback="" else nosig=1 fi # Error on additional arguments if [ -n "${3}" ]; then return 2 else break fi ;; esac done # Check for a valid program if [ ! -e "${program}" ]; then return 5; fi # Check for a valid signal check_signal "${signal}" if [ "${?}" -ne "0" ]; then return 2; fi # Get a list of pids if [ -z "${pidfile}" ]; then # determine the pid by discovery pidlist=`pidofproc "${1}"` retval="${?}" else # The PID file contains the needed PIDs # Note that by LSB requirement, the path must be given to pidofproc, # however, it is not used by the current implementation or standard. pidlist=`pidofproc -p "${pidfile}" "${1}"` retval="${?}" fi # Return a value ONLY # It is the init script's (or distribution's functions) responsibilty # to log messages! case "${retval}" in 0) # Program is running correctly # Do nothing here, let killproc continue. ;; 1) # Program is not running, but an invalid pid file exists # Remove the pid file. rm -f "${pidfile}" # This is only a success if no signal was passed. if [ -n "${nosig}" ]; then return 0 else return 7

157 Linux Fundamental : Linux From Scratch

fi ;; 3) # Program is not running and no pidfile exists # This is only a success if no signal was passed. if [ -n "${nosig}" ]; then return 0 else return 7 fi ;; *) # Others as returned by status values shall not be interpreted # and returned as an unspecified error. return 1 ;; esac # Perform different actions for exit signals and control signals check_sig_type "${signal}" if [ "${?}" -eq "0" ]; then # Signal is used to terminate the program # Account for empty pidlist (pid file still exists and no # signal was given) if [ "${pidlist}" != "" ]; then # Kill the list of pids for pid in ${pidlist}; do kill -0 "${pid}" 2> /dev/null if [ "${?}" -ne "0" ]; then # Process is dead, continue to next and assume all is well continue else kill "${signal}" "${pid}" 2> /dev/null # Wait up to ${delay}/10 seconds to for "${pid}" to # terminate in 10ths of a second while [ "${delay}" -ne "0" ]; do kill -0 "${pid}" 2> /dev/null || piddead="1" if [ "${piddead}" = "1" ]; then break; fi sleep 0.1 delay="$(( ${delay} - 1 ))" done # If a fallback is set, and program is still running, then # use the fallback if [ -n "${fallback}" -a "${piddead}" != "1" ]; then kill "${fallback}" "${pid}" 2> /dev/null sleep 1 # Check again, and fail if still running kill -0 "${pid}" 2> /dev/null && return 1 else # just check one last time and if still alive, fail sleep 1 kill -0 "${pid}" 2> /dev/null && return 1 fi fi done

158 Linux Fundamental : Linux From Scratch

fi # Check for and remove stale PID files. if [ -z "${pidfile}" ]; then # Find the basename of $program prefix=`echo "${program}" | sed 's/[^/]*$//'` progname=`echo "${program}" | sed "s@${prefix}@@"` if [ -e "/var/run/${progname}.pid" ]; then rm -f "/var/run/${progname}.pid" 2> /dev/null fi else if [ -e "${pidfile}" ]; then rm -f "${pidfile}" 2> /dev/null; fi fi # For signals that do not expect a program to exit, simply # let kill do it's job, and evaluate kills return for value else # check_sig_type - signal is not used to terminate program for pid in ${pidlist}; do kill "${signal}" "${pid}" if [ "${?}" -ne "0" ]; then return 1; fi done fi } ################################################################################ # pidofproc() # # Usage: pidofproc [-p pidfile] pathname # # # # Purpose: This function returns one or more pid(s) for a particular daemon # # # # Inputs: -p pidfile, use the specified pidfile instead of pidof # # pathname, path to the specified program # # # # Return values (as defined by LSB status codes): # # 0 - Success (PIDs to stdout) # # 1 - Program is dead, PID file still exists (remaining PIDs output) # # 3 - Program is not running (no output) # ################################################################################ pidofproc() { local pidfile local program local prefix local progname local pidlist local lpids local exitstatus="0" # Process arguments while true; do case "${1}" in -p) pidfile="${2}" shift 2 ;; *) program="${1}" if [ -n "${2}" ]; then # Too many arguments # Since this is status, return unknown

159 Linux Fundamental : Linux From Scratch

return 4 else break fi ;; esac done # If a PID file is not specified, try and find one. if [ -z "${pidfile}" ]; then # Get the program's basename prefix=`echo "${program}" | sed 's/[^/]*$//'` if [ -z "${prefix}" ]; then progname="${program}" else progname=`echo "${program}" | sed "s@${prefix}@@"` fi # If a PID file exists with that name, assume that is it. if [ -e "/var/run/${progname}.pid" ]; then pidfile="/var/run/${progname}.pid" fi fi # If a PID file is set and exists, use it. if [ -n "${pidfile}" -a -e "${pidfile}" ]; then # Use the value in the first line of the pidfile pidlist=`/bin/head -n1 "${pidfile}"` # This can optionally be written as 'sed 1q' to repalce 'head -n1' # should LFS move /bin/head to /usr/bin/head else # Use pidof pidlist=`pidof "${program}"` fi # Figure out if all listed PIDs are running. for pid in ${pidlist}; do kill -0 ${pid} 2> /dev/null if [ "${?}" -eq "0" ]; then lpids="${lpids}${pid} " else exitstatus="1" fi done if [ -z "${lpids}" -a ! -f "${pidfile}" ]; then return 3 else echo "${lpids}" return "${exitstatus}" fi } ################################################################################ # statusproc() # # Usage: statusproc [-p pidfile] pathname # # # # Purpose: This function prints the status of a particular daemon to stdout # # # # Inputs: -p pidfile, use the specified pidfile instead of pidof # # pathname, path to the specified program #

160 Linux Fundamental : Linux From Scratch

# # # Return values: # # 0 - Status printed # # 1 - Input error. The daemon to check was not specified. # ################################################################################ statusproc() { local pidfile local pidlist if [ "${#}" = "0" ]; then echo "Usage: statusproc [-p pidfle] {program}" exit 1 fi # Process arguments while true; do case "${1}" in -p) pidfile="${2}" shift 2 ;; *) if [ -n "${2}" ]; then echo "Too many arguments" return 1 else break fi ;; esac done if [ -n "${pidfile}" ]; then pidlist=`pidofproc -p "${pidfile}" $@` else pidlist=`pidofproc $@` fi # Trim trailing blanks pidlist=`echo "${pidlist}" | sed -r 's/ +$//'` base="${1##*/}" if [ -n "${pidlist}" ]; then echo -e "${INFO}${base} is running with Process" \ "ID(s) ${pidlist}.${NORMAL}" else if [ -n "${base}" -a -e "/var/run/${base}.pid" ]; then echo -e "${WARNING}${1} is not running but" \ "/var/run/${base}.pid exists.${NORMAL}" else if [ -n "${pidfile}" -a -e "${pidfile}" ]; then echo -e "${WARNING}${1} is not running" \ "but ${pidfile} exists.${NORMAL}" else echo -e "${INFO}${1} is not running.${NORMAL}" fi fi fi }

161 Linux Fundamental : Linux From Scratch

################################################################################ # timespec() # # # # Purpose: An internal utility function to format a timestamp # # a boot log file. Sets the STAMP variable. # # # # Return value: Not used # ################################################################################ timespec() { STAMP="$(echo `date +"%b %d %T %:z"` `hostname`) " return 0 } ################################################################################ # log_success_msg() # # Usage: log_success_msg ["message"] # # # # Purpose: Print a successful status message to the screen and # # a boot log file. # # # # Inputs: $@ - Message # # # # Return values: Not used # ################################################################################ log_success_msg() { echo -n -e "${BMPREFIX}${@}" echo -e "${CURS_ZERO}${SUCCESS_PREFIX}${SET_COL}${SUCCESS_SUFFIX}" # Strip non-printable characters from log file local logmessage=`echo "${@}" | sed 's/\\\033[^a-zA-Z]*.//g'` timespec echo -e "${STAMP} ${logmessage} OK" >> ${BOOTLOG} return 0 } log_success_msg2() { echo -n -e "${BMPREFIX}${@}" echo -e "${CURS_ZERO}${SUCCESS_PREFIX}${SET_COL}${SUCCESS_SUFFIX}" echo " OK" >> ${BOOTLOG} return 0 } ################################################################################ # log_failure_msg() # # Usage: log_failure_msg ["message"] # # # # Purpose: Print a failure status message to the screen and # # a boot log file. # # # # Inputs: $@ - Message # # # # Return values: Not used # ################################################################################ log_failure_msg() { echo -n -e "${BMPREFIX}${@}" echo -e "${CURS_ZERO}${FAILURE_PREFIX}${SET_COL}${FAILURE_SUFFIX}"

162 Linux Fundamental : Linux From Scratch

# Strip non-printable characters from log file timespec local logmessage=`echo "${@}" | sed 's/\\\033[^a-zA-Z]*.//g'` echo -e "${STAMP} ${logmessage} FAIL" >> ${BOOTLOG} return 0 } log_failure_msg2() { echo -n -e "${BMPREFIX}${@}" echo -e "${CURS_ZERO}${FAILURE_PREFIX}${SET_COL}${FAILURE_SUFFIX}" echo "FAIL" >> ${BOOTLOG} return 0 } ################################################################################ # log_warning_msg() # # Usage: log_warning_msg ["message"] # # # # Purpose: Print a warning status message to the screen and # # a boot log file. # # # # Return values: Not used # ################################################################################ log_warning_msg() { echo -n -e "${BMPREFIX}${@}" echo -e "${CURS_ZERO}${WARNING_PREFIX}${SET_COL}${WARNING_SUFFIX}" # Strip non-printable characters from log file local logmessage=`echo "${@}" | sed 's/\\\033[^a-zA-Z]*.//g'` timespec echo -e "${STAMP} ${logmessage} WARN" >> ${BOOTLOG} return 0 } ################################################################################ # log_info_msg() # # Usage: log_info_msg message # # # # Purpose: Print an information message to the screen and # # a boot log file. Does not print a trailing newline character. # # # # Return values: Not used # ################################################################################ log_info_msg() { echo -n -e "${BMPREFIX}${@}" # Strip non-printable characters from log file local logmessage=`echo "${@}" | sed 's/\\\033[^a-zA-Z]*.//g'` timespec echo -n -e "${STAMP} ${logmessage}" >> ${BOOTLOG} return 0 } log_info_msg2()

163 Linux Fundamental : Linux From Scratch

{ echo -n -e "${@}" # Strip non-printable characters from log file local logmessage=`echo "${@}" | sed 's/\\\033[^a-zA-Z]*.//g'` echo -n -e "${logmessage}" >> ${BOOTLOG} return 0 } ################################################################################ # evaluate_retval() # # Usage: Evaluate a return value and print success or failyure as appropriate # # # # Purpose: Convenience function to terminate an info message # # # # Return values: Not used # ################################################################################ evaluate_retval() { local error_value="${?}" if [ ${error_value} = 0 ]; then log_success_msg2 else log_failure_msg2 fi } ################################################################################ # check_signal() # # Usage: check_signal [ -{signal} | {signal} ] # # # # Purpose: Check for a valid signal. This is not defined by any LSB draft, # # however, it is required to check the signals to determine if the # # signals chosen are invalid arguments to the other functions. # # # # Inputs: Accepts a single string value in the form or -{signal} or {signal} # # # # Return values: # # 0 - Success (signal is valid # # 1 - Signal is not valid # ################################################################################ check_signal() { local valsig # Add error handling for invalid signals valsig="-ALRM -HUP -INT -KILL -PIPE -POLL -PROF -TERM -USR1 -USR2" valsig="${valsig} -VTALRM -STKFLT -PWR -WINCH -CHLD -URG -TSTP -TTIN" valsig="${valsig} -TTOU -STOP -CONT -ABRT -FPE -ILL -QUIT -SEGV -TRAP" valsig="${valsig} -SYS -EMT -BUS -XCPU -XFSZ -0 -1 -2 -3 -4 -5 -6 -8 -9" valsig="${valsig} -11 -13 -14 -15" echo "${valsig}" | grep -- " ${1} " > /dev/null if [ "${?}" -eq "0" ]; then return 0 else return 1 fi } ################################################################################

164 Linux Fundamental : Linux From Scratch

# check_sig_type() # # Usage: check_signal [ -{signal} | {signal} ] # # # # Purpose: Check if signal is a program termination signal or a control signal # # This is not defined by any LSB draft, however, it is required to # # check the signals to determine if they are intended to end a # # program or simply to control it. # # # # Inputs: Accepts a single string value in the form or -{signal} or {signal} # # # # Return values: # # 0 - Signal is used for program termination # # 1 - Signal is used for program control # ################################################################################ check_sig_type() { local valsig # The list of termination signals (limited to generally used items) valsig="-ALRM -INT -KILL -TERM -PWR -STOP -ABRT -QUIT -2 -3 -6 -9 -14 -15" echo "${valsig}" | grep -- " ${1} " > /dev/null if [ "${?}" -eq "0" ]; then return 0 else return 1 fi } ################################################################################ # wait_for_user() # # # # Purpose: Wait for the user to respond if not a headless system # # # ################################################################################ wait_for_user() { # Wait for the user by default [ "${HEADLESS=0}" = "0" ] && read ENTER return 0 } # End /lib/lsb/init-functions

C.3. /etc/rc.d/init.d/functions #!/bin/sh ######################################################################## # Begin boot functions # # Description : Run Level Control Functions # # Authors : Gerard Beekmans - gerard@linuxfromscratch.org # Update : Bruce Dubbs - bdubbs@linuxfromscratch.org # # Version : LFS 7.0 # # Notes : With code based on Matthias Benkmann's simpleinit-msb # http://winterdrache.de/linux/newboot/index.html # # This file is only present for backward BLFS compatibility #

165 Linux Fundamental : Linux From Scratch

######################################################################## ## Environmental setup # Setup default values for environment umask 022 export PATH="/bin:/usr/bin:/sbin:/usr/sbin" # Signal sent to running processes to refresh their configuration RELOADSIG="HUP" # Number of seconds between STOPSIG and FALLBACK when stopping processes KILLDELAY="3" ## Screen Dimensions # Find current screen size if [ -z "${COLUMNS}" ]; then COLUMNS=$(stty size) COLUMNS=${COLUMNS##* } fi # When using remote connections, such as a serial port, stty size returns 0 if [ "${COLUMNS}" = "0" ]; then COLUMNS=80 fi ## Measurements for positioning result messages COL=$((${COLUMNS} - 8)) WCOL=$((${COL} - 2)) ## Provide an echo that supports -e and -n # If formatting is needed, $ECHO should be used case "`echo -e -n test`" in -[en]*) ECHO=/bin/echo ;; *) ECHO=echo ;; esac ## Set Cursor Position Commands, used via $ECHO SET_COL="\\033[${COL}G" # at the $COL char SET_WCOL="\\033[${WCOL}G" # at the $WCOL char CURS_UP="\\033[1A\\033[0G" # Up one line, at the 0'th char ## Set color commands, used via $ECHO # Please consult `man console_codes for more information # under the "ECMA-48 Set Graphics Rendition" section # # Warning: when switching from a 8bit to a 9bit font, # the linux console will reinterpret the bold (1;) to # the top 256 glyphs of the 9bit font. This does # not affect framebuffer consoles NORMAL="\\033[0;39m" # Standard console grey SUCCESS="\\033[1;32m" # Success is green WARNING="\\033[1;33m" # Warnings are yellow FAILURE="\\033[1;31m" # Failures are red INFO="\\033[1;36m" # Information is light cyan BRACKET="\\033[1;34m" # Brackets are blue STRING_LENGTH="0" # the length of the current message #******************************************************************************* # Function - boot_mesg()

166 Linux Fundamental : Linux From Scratch

# # Purpose: Sending information from bootup scripts to the console # # Inputs: $1 is the message # $2 is the colorcode for the console # # Outputs: Standard Output # # Dependencies: - sed for parsing strings. # - grep for counting string length. # # Todo: #******************************************************************************* boot_mesg() { local ECHOPARM="" while true do case "${1}" in -n) ECHOPARM=" -n " shift 1 ;; -*) echo "Unknown Option: ${1}" return 1 ;; *) break ;; esac done ## Figure out the length of what is to be printed to be used ## for warning messages. STRING_LENGTH=$((${#1} + 1)) # Print the message to the screen ${ECHO} ${ECHOPARM} -e "${2}${1}" # Log the message [ -d /run/var ] || return ${ECHO} ${ECHOPARM} -e "${2}${1}" >> /run/var/bootlog } boot_mesg_flush() { # Reset STRING_LENGTH for next message STRING_LENGTH="0" } echo_ok() { ${ECHO} -n -e "${CURS_UP}${SET_COL}${BRACKET}[${SUCCESS} OK ${BRACKET}]" ${ECHO} -e "${NORMAL}" boot_mesg_flush [ -d /run/var ] || return ${ECHO} -e "[ OK ]" >> /run/var/bootlog } echo_failure() {

167 Linux Fundamental : Linux From Scratch

${ECHO} -n -e "${CURS_UP}${SET_COL}${BRACKET}[${FAILURE} FAIL ${BRACKET}]" ${ECHO} -e "${NORMAL}" boot_mesg_flush [ -d /run/var ] || return ${ECHO} -e "[ FAIL]" >> /run/var/bootlog } echo_warning() { ${ECHO} -n -e "${CURS_UP}${SET_COL}${BRACKET}[${WARNING} WARN ${BRACKET}]" ${ECHO} -e "${NORMAL}" boot_mesg_flush [ -d /run/var ] || return ${ECHO} -e "[ WARN ]" >> /run/var/bootlog } echo_skipped() { ${ECHO} -n -e "${CURS_UP}${SET_COL}${BRACKET}[${WARNING} SKIP ${BRACKET}]" ${ECHO} -e "${NORMAL}" boot_mesg_flush [ -d /run/var ] || return ${ECHO} -e " [ SKIP ]" >> /run/var/bootlog } wait_for_user() { # Wait for the user by default [ "${HEADLESS=0}" = "0" ] && read ENTER } evaluate_retval() { error_value="${?}" if [ ${error_value} = 0 ]; then echo_ok else echo_failure fi # This prevents the 'An Unexpected Error Has Occurred' from trivial # errors. return 0 } print_status() { if [ "${#}" = "0" ]; then echo "Usage: ${0} {success|warning|failure}" return 1 fi case "${1}" in success) echo_ok ;; warning) # Leave this extra case in because old scripts

168 Linux Fundamental : Linux From Scratch

# may call it this way. case "${2}" in running) ${ECHO} -e -n "${CURS_UP}" ${ECHO} -e -n "\\033[${STRING_LENGTH}G " boot_mesg "Already running." ${WARNING} echo_warning ;; not_running) ${ECHO} -e -n "${CURS_UP}" ${ECHO} -e -n "\\033[${STRING_LENGTH}G " boot_mesg "Not running." ${WARNING} echo_warning ;; not_available) ${ECHO} -e -n "${CURS_UP}" ${ECHO} -e -n "\\033[${STRING_LENGTH}G " boot_mesg "Not available." ${WARNING} echo_warning ;; *) # This is how it is supposed to # be called echo_warning ;; esac ;; failure) echo_failure ;; esac } reloadproc() { local pidfile="" local failure=0 while true do case "${1}" in -p) pidfile="${2}" shift 2 ;; -*) log_failure_msg "Unknown Option: ${1}" return 2 ;; *) break ;; esac done if [ "${#}" -lt "1" ]; then log_failure_msg "Usage: reloadproc [-p pidfile] pathname" return 2 fi # This will ensure compatibility with previous LFS Bootscripts

169 Linux Fundamental : Linux From Scratch

if [ -n "${PIDFILE}" ]; then pidfile="${PIDFILE}" fi # Is the process running? if [ -z "${pidfile}" ]; then pidofproc -s "${1}" else pidofproc -s -p "${pidfile}" "${1}" fi # Warn about stale pid file if [ "$?" = 1 ]; then boot_mesg -n "Removing stale pid file: ${pidfile}. " ${WARNING} rm -f "${pidfile}" fi if [ -n "${pidlist}" ]; then for pid in ${pidlist} do kill -"${RELOADSIG}" "${pid}" || failure="1" done (exit ${failure}) evaluate_retval else boot_mesg "Process ${1} not running." ${WARNING} echo_warning fi } statusproc() { local pidfile="" local base="" local ret="" while true do case "${1}" in -p) pidfile="${2}" shift 2 ;; -*) log_failure_msg "Unknown Option: ${1}" return 2 ;; *) break ;; esac done if [ "${#}" != "1" ]; then shift 1 log_failure_msg "Usage: statusproc [-p pidfile] pathname" return 2 fi # Get the process basename base="${1##*/}"

170 Linux Fundamental : Linux From Scratch

# This will ensure compatibility with previous LFS Bootscripts if [ -n "${PIDFILE}" ]; then pidfile="${PIDFILE}" fi # Is the process running? if [ -z "${pidfile}" ]; then pidofproc -s "${1}" else pidofproc -s -p "${pidfile}" "${1}" fi # Store the return status ret=$? if [ -n "${pidlist}" ]; then ${ECHO} -e "${INFO}${base} is running with Process"\ "ID(s) ${pidlist}.${NORMAL}" else if [ -n "${base}" -a -e "/var/run/${base}.pid" ]; then ${ECHO} -e "${WARNING}${1} is not running but"\ "/var/run/${base}.pid exists.${NORMAL}" else if [ -n "${pidfile}" -a -e "${pidfile}" ]; then ${ECHO} -e "${WARNING}${1} is not running"\ "but ${pidfile} exists.${NORMAL}" else ${ECHO} -e "${INFO}${1} is not running.${NORMAL}" fi fi fi # Return the status from pidofproc return $ret } # The below functions are documented in the LSB-generic 2.1.0 #******************************************************************************* # Function - pidofproc [-s] [-p pidfile] pathname # # Purpose: This function returns one or more pid(s) for a particular daemon # # Inputs: -p pidfile, use the specified pidfile instead of pidof # pathname, path to the specified program # # Outputs: return 0 - Success, pid's in stdout # return 1 - Program is dead, pidfile exists # return 2 - Invalid or excessive number of arguments, # warning in stdout # return 3 - Program is not running # # Dependencies: pidof, echo, head # # Todo: Remove dependency on head # This replaces getpids # Test changes to pidof # #******************************************************************************* pidofproc() { local pidfile="" local lpids="" local silent=""

171 Linux Fundamental : Linux From Scratch

pidlist="" while true do case "${1}" in -p) pidfile="${2}" shift 2 ;; -s) # Added for legacy opperation of getpids # eliminates several '> /dev/null' silent="1" shift 1 ;; -*) log_failure_msg "Unknown Option: ${1}" return 2 ;; *) break ;; esac done if [ "${#}" != "1" ]; then shift 1 log_failure_msg "Usage: pidofproc [-s] [-p pidfile] pathname" return 2 fi if [ -n "${pidfile}" ]; then if [ ! -r "${pidfile}" ]; then return 3 # Program is not running fi lpids=`head -n 1 ${pidfile}` for pid in ${lpids} do if [ "${pid}" -ne "$$" -a "${pid}" -ne "${PPID}" ]; then kill -0 "${pid}" 2>/dev/null && pidlist="${pidlist} ${pid}" fi if [ "${silent}" != "1" ]; then echo "${pidlist}" fi test -z "${pidlist}" && # Program is dead, pidfile exists return 1 # else return 0 done else pidlist=`pidof -o $$ -o $PPID -x "$1"` if [ "${silent}" != "1" ]; then echo "${pidlist}" fi # Get provide correct running status if [ -n "${pidlist}" ]; then return 0

172 Linux Fundamental : Linux From Scratch

else return 3 fi fi if [ "$?" != "0" ]; then return 3 # Program is not running fi } #******************************************************************************* # Function - loadproc [-f] [-n nicelevel] [-p pidfile] pathname [args] # # Purpose: This runs the specified program as a daemon # # Inputs: -f, run the program even if it is already running # -n nicelevel, specifies a nice level. See nice(1). # -p pidfile, uses the specified pidfile # pathname, pathname to the specified program # args, arguments to pass to specified program # # Outputs: return 0 - Success # return 2 - Invalid of excessive number of arguments, # warning in stdout # return 4 - Program or service status is unknown # # Dependencies: nice, rm # # Todo: LSB says this should be called start_daemon # LSB does not say that it should call evaluate_retval # It checks for PIDFILE, which is deprecated. # Will be removed after BLFS 6.0 # loadproc returns 0 if program is already running, not LSB compliant # #******************************************************************************* loadproc() { local pidfile="" local forcestart="" local nicelevel="10" # This will ensure compatibility with previous LFS Bootscripts if [ -n "${PIDFILE}" ]; then pidfile="${PIDFILE}" fi while true do case "${1}" in -f) forcestart="1" shift 1 ;; -n) nicelevel="${2}" shift 2 ;; -p) pidfile="${2}" shift 2 ;; -*) log_failure_msg "Unknown Option: ${1}"

173 Linux Fundamental : Linux From Scratch

return 2 #invalid or excess argument(s) ;; *) break ;; esac done if [ "${#}" = "0" ]; then log_failure_msg "Usage: loadproc [-f] [-n nicelevel] [-p pidfile] pathname [args]" return 2 #invalid or excess argument(s) fi if [ -z "${forcestart}" ]; then if [ -z "${pidfile}" ]; then pidofproc -s "${1}" else pidofproc -s -p "${pidfile}" "${1}" fi case "${?}" in 0) log_warning_msg "Unable to continue: ${1} is running" return 0 # 4 ;; 1) boot_mesg "Removing stale pid file: ${pidfile}" ${WARNING} rm -f "${pidfile}" ;; 3) ;; *) log_failure_msg "Unknown error code from pidofproc: ${?}" return 4 ;; esac fi nice -n "${nicelevel}" "${@}" evaluate_retval # This is "Probably" not LSB compliant, # but required to be compatible with older bootscripts return 0 } #******************************************************************************* # Function - killproc [-p pidfile] pathname [signal] # # Purpose: # # Inputs: -p pidfile, uses the specified pidfile # pathname, pathname to the specified program # signal, send this signal to pathname # # Outputs: return 0 - Success # return 2 - Invalid of excessive number of arguments, # warning in stdout # return 4 - Unknown Status # # Dependencies: kill, rm # # Todo: LSB does not say that it should call evaluate_retval # It checks for PIDFILE, which is deprecated. # Will be removed after BLFS 6.0 #

174 Linux Fundamental : Linux From Scratch

#******************************************************************************* killproc() { local pidfile="" local killsig=TERM # default signal is SIGTERM pidlist="" # This will ensure compatibility with previous LFS Bootscripts if [ -n "${PIDFILE}" ]; then pidfile="${PIDFILE}" fi while true do case "${1}" in -p) pidfile="${2}" shift 2 ;; -*) log_failure_msg "Unknown Option: ${1}" return 2 ;; *) break ;; esac done if [ "${#}" = "2" ]; then killsig="${2}" elif [ "${#}" != "1" ]; then shift 2 log_failure_msg "Usage: killproc [-p pidfile] pathname [signal]" return 2 fi # Is the process running? if [ -z "${pidfile}" ]; then pidofproc -s "${1}" else pidofproc -s -p "${pidfile}" "${1}" fi # Remove stale pidfile if [ "$?" = 1 ]; then boot_mesg "Removing stale pid file: ${pidfile}." ${WARNING} rm -f "${pidfile}" fi # If running, send the signal if [ -n "${pidlist}" ]; then for pid in ${pidlist} do kill -${killsig} ${pid} 2>/dev/null # Wait up to 3 seconds, for ${pid} to terminate case "${killsig}" in TERM|SIGTERM|KILL|SIGKILL) # sleep in 1/10ths of seconds and # multiply KILLDELAY by 10 local dtime="${KILLDELAY}0" while [ "${dtime}" != "0" ] do

175 Linux Fundamental : Linux From Scratch

kill -0 ${pid} 2>/dev/null || break sleep 0.1 dtime=$(( ${dtime} - 1)) done # If ${pid} is still running, kill it kill -0 ${pid} 2>/dev/null && kill -KILL ${pid} 2>/dev/null ;; esac done # Check if the process is still running if we tried to stop it case "${killsig}" in TERM|SIGTERM|KILL|SIGKILL) if [ -z "${pidfile}" ]; then pidofproc -s "${1}" else pidofproc -s -p "${pidfile}" "${1}" fi # Program was terminated if [ "$?" != "0" ]; then # Remove the pidfile if necessary if [ -f "${pidfile}" ]; then rm -f "${pidfile}" fi echo_ok return 0 else # Program is still running echo_failure return 4 # Unknown Status fi ;; *) # Just see if the kill returned successfully evaluate_retval ;; esac else # process not running print_status warning not_running fi } #******************************************************************************* # Function - log_success_msg "message" # # Purpose: Print a success message # # Inputs: $@ - Message # # Outputs: Text output to screen # # Dependencies: echo # # Todo: logging # #******************************************************************************* log_success_msg() { ${ECHO} -n -e "${BOOTMESG_PREFIX}${@}" ${ECHO} -e "${SET_COL}""${BRACKET}""[""${SUCCESS}"" OK ""${BRACKET}""]""${NORMAL}" [ -d /run/var ] || return 0 ${ECHO} -n -e "${@} [ OK ]" >> /run/var/bootlog

176 Linux Fundamental : Linux From Scratch

return 0 } #******************************************************************************* # Function - log_failure_msg "message" # # Purpose: Print a failure message # # Inputs: $@ - Message # # Outputs: Text output to screen # # Dependencies: echo # # Todo: logging # #******************************************************************************* log_failure_msg() { ${ECHO} -n -e "${BOOTMESG_PREFIX}${@}" ${ECHO} -e "${SET_COL}""${BRACKET}""[""${FAILURE}"" FAIL ""${BRACKET}""]""${NORMAL}" [ -d /run/var ] || return 0 ${ECHO} -e "${@} [ FAIL ]" >> /run/var/bootlog return 0 } #******************************************************************************* # Function - log_warning_msg "message" # # Purpose: print a warning message # # Inputs: $@ - Message # # Outputs: Text output to screen # # Dependencies: echo # # Todo: logging # #******************************************************************************* log_warning_msg() { ${ECHO} -n -e "${BOOTMESG_PREFIX}${@}" ${ECHO} -e "${SET_COL}""${BRACKET}""[""${WARNING}"" WARN ""${BRACKET}""]""${NORMAL}" [ -d /run/var ] || return 0 ${ECHO} -e "${@} [ WARN ]" >> /run/var/bootlog return 0 } #******************************************************************************* # Function - log_skipped_msg "message" # # Purpose: print a message that the script was skipped # # Inputs: $@ - Message # # Outputs: Text output to screen # # Dependencies: echo # # Todo: logging # #******************************************************************************* log_skipped_msg() {

177 Linux Fundamental : Linux From Scratch

${ECHO} -n -e "${BOOTMESG_PREFIX}${@}" ${ECHO} -e "${SET_COL}""${BRACKET}""[""${WARNING}"" SKIP ""${BRACKET}""]""${NORMAL}" [ -d /run/var ] || return 0 ${ECHO} -e "${@} [ SKIP ]" >> /run/var/bootlog return 0 } # End boot functions C.4. /etc/rc.d/init.d/mountvirtfs #!/bin/sh ######################################################################## # Begin mountvirtfs # # Description : Mount proc, sysfs, and run # # Authors : Gerard Beekmans - gerard@linuxfromscratch.org # DJ Lucas - dj@linuxfromscratch.org # Update : Bruce Dubbs - bdubbs@linuxfromscratch.org # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: mountvirtfs # Required-Start: # Should-Start: # Required-Stop: # Should-Stop: # Default-Start: S # Default-Stop: # Short-Description: Mounts /sys and /proc virtual (kernel) filesystems. # Mounts /run tmpfs. # Description: Mounts /sys and /proc virtual (kernel) filesystems. # Mounts /run tmpfs. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions case "${1}" in start) # Make sure /run/var is available before logging any messages mkdir -p /run mount -n /run || failed=1 mkdir -p /run/{var,lock,shm} chmod 1777 /run/shm log_info_msg "Mounting virtual file systems: ${INFO}/run" if ! mountpoint /proc >/dev/null; then log_info_msg2 " ${INFO}/proc" mount -n -o nosuid,noexec,nodev /proc || failed=1 fi if ! mountpoint /sys >/dev/null; then log_info_msg2 " ${INFO}/sys" mount -n -o nosuid,noexec,nodev /sys || failed=1 fi if ! mountpoint /dev >/dev/null; then log_info_msg2 " ${INFO}/dev"

178 Linux Fundamental : Linux From Scratch

mount -n -o mode=0755,nosuid /dev || failed=1 fi ln -s /run/shm /dev/shm # Copy the only static device node that Udev >= 155 doesn't # handle to /dev cp -a /lib/udev/devices/null /dev (exit ${failed}) evaluate_retval exit $failed ;; *) echo "Usage: ${0} {start}" exit 1 ;; esac # End mountvirtfs

C.5. /etc/rc.d/init.d/modules #!/bin/sh ######################################################################## # Begin modules # # Description : Module auto-loading script # # Authors : Zack Winkles # DJ Lucas - dj@linuxfromscratch.org # Update : Bruce Dubbs - bdubbs@linuxfromscratch.org # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: modules # Required-Start: mountvirtfs sysctl # Should-Start: # Required-Stop: # Should-Stop: # Default-Start: S # Default-Stop: # Short-Description: Loads required modules. # Description: Loads modules listed in /etc/sysconfig/modules. # X-LFS-Provided-By: LFS ### END INIT INFO

179 Linux Fundamental : Linux From Scratch

# Assure that the kernel has module support. [ -e /proc/ksyms -o -e /proc/modules ] || exit 0 . /lib/lsb/init-functions case "${1}" in start) # Exit if there's no modules file or there are no # valid entries [ -r /etc/sysconfig/modules ] || exit 0 egrep -qv '^($|#)' /etc/sysconfig/modules || exit 0 log_info_msg "Loading modules:" # Only try to load modules if the user has actually given us # some modules to load. while read module args; do # Ignore comments and blank lines. case "$module" in ""|"#"*) continue ;; esac # Attempt to load the module, passing any arguments provided. modprobe ${module} ${args} >/dev/null # Print the module name if successful, otherwise take note. if [ $? -eq 0 ]; then log_info_msg2 " ${module}" else failedmod="${failedmod} ${module}" fi done < /etc/sysconfig/modules # Print a message about successfully loaded modules on the correct line. log_success_msg2 # Print a failure message with a list of any modules that # may have failed to load. if [ -n "${failedmod}" ]; then log_failure_msg "Failed to load modules:${failedmod}" exit 1 fi ;; *) echo "Usage: ${0} {start}" exit 1 ;; esac exit 0 # End modules C.6. /etc/rc.d/init.d/udev #!/bin/sh ######################################################################## # Begin udev # # Description : Udev cold-plugging script #

180 Linux Fundamental : Linux From Scratch

# Authors : Zack Winkles, Alexander E. Patrakov # DJ Lucas - dj@linuxfromscratch.org # Update : Bruce Dubbs - bdubbs@linuxfromscratch.org # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: udev # Required-Start: # Should-Start: modules # Required-Stop: # Should-Stop: # Default-Start: S # Default-Stop: # Short-Description: Populates /dev with device nodes. # Description: Mounts a tempfs on /dev and starts the udevd daemon. # Device nodes are created as defined by udev. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions case "${1}" in start) log_info_msg "Populating /dev with device nodes... " if ! grep -q '[[:space:]]sysfs' /proc/mounts; then log_failure_msg2 msg="FAILURE:\n\nUnable to create " msg="${msg}devices without a SysFS filesystem\n\n" msg="${msg}After you press Enter, this system " msg="${msg}will be halted and powered off.\n\n" log_info_msg "$msg" log_info_msg "Press Enter to continue..." wait_for_user /etc/rc.d/init.d/halt stop fi # Udev handles uevents itself, so we don't need to have # the kernel call out to any binary in response to them echo > /proc/sys/kernel/hotplug # Start the udev daemon to continually watch for, and act on, # uevents /lib/udev/udevd --daemon # Now traverse /sys in order to "coldplug" devices that have # already been discovered /sbin/udevadm trigger --action=add --type=subsystems /sbin/udevadm trigger --action=add --type=devices # Now wait for udevd to process the uevents we triggered /sbin/udevadm settle log_success_msg2 ;; *) echo "Usage ${0} {start}" exit 1 ;; esac exit 0

181 Linux Fundamental : Linux From Scratch

# End udev

C.7. /etc/rc.d/init.d/swap #!/bin/sh ######################################################################## # Begin swap # # Description : Swap Control Script # # Authors : Gerard Beekmans - gerard@linuxfromscratch.org # DJ Lucas - dj@linuxfromscratch.org # Update : Bruce Dubbs - bdubbs@linuxfromscratch.org # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: swap # Required-Start: udev # Should-Start: modules # Required-Stop: localnet # Should-Stop: # Default-Start: S # Default-Stop: 06 # Short-Description: Mounts and unmounts swap partitions. # Description: Mounts and unmounts swap partitions defined in # /etc/fstab. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions case "${1}" in start) log_info_msg "Activating all swap files/partitions..." swapon -a evaluate_retval ;; stop) log_info_msg "Deactivating all swap files/partitions..." swapoff -a evaluate_retval ;; restart) ${0} stop sleep 1 ${0} start ;; status) log_success_msg "Retrieving swap status." swapon -s ;;

182 Linux Fundamental : Linux From Scratch

*) echo "Usage: ${0} {start|stop|restart|status}" exit 1 ;; esac exit 0 # End swap C.8. /etc/rc.d/init.d/setclock #!/bin/sh ######################################################################## # Begin setclock # # Description : Setting Linux Clock # # Authors : Gerard Beekmans - gerard@linuxfromscratch.org # DJ Lucas - dj@linuxfromscratch.org # Update : Bruce Dubbs - bdubbs@linuxfromscratch.org # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: $time # Required-Start: # Should-Start: modules # Required-Stop: # Should-Stop: $syslog # Default-Start: S # Default-Stop: # Short-Description: Stores and restores time from the hardware clock # Description: On boot, system time is obtained from hwclock. The # hardware clock can also be set on shutdown. # X-LFS-Provided-By: LFS BLFS ### END INIT INFO . /lib/lsb/init-functions [ -r /etc/sysconfig/clock ] && . /etc/sysconfig/clock case "${UTC}" in yes|true|1) CLOCKPARAMS="${CLOCKPARAMS} --utc" ;; no|false|0) CLOCKPARAMS="${CLOCKPARAMS} --localtime" ;; esac case ${1} in start) hwclock --hctosys ${CLOCKPARAMS} >/dev/null ;; stop) log_info_msg "Setting hardware clock..." hwclock --systohc ${CLOCKPARAMS} >/dev/null

183 Linux Fundamental : Linux From Scratch

evaluate_retval ;; *) echo "Usage: ${0} {start|stop}" exit 1 ;; esac exit 0 C.9. /etc/rc.d/init.d/checkfs #!/bin/sh ######################################################################## # Begin checkfs # # Description : File System Check # # Authors : Gerard Beekmans - gerard@linuxfromscratch.org # A. Luebke - luebke@users.sourceforge.net # DJ Lucas - dj@linuxfromscratch.org # Update : Bruce Dubbs - bdubbs@linuxfromscratch.org # # Version : LFS 7.0 # # Based on checkfs script from LFS-3.1 and earlier. # # From man fsck # 0 - No errors # 1 - File system errors corrected # 2 - System should be rebooted # 4 - File system errors left uncorrected # 8 - Operational error # 16 - Usage or syntax error # 32 - Fsck canceled by user request # 128 - Shared library error # ######################################################################### ### BEGIN INIT INFO # Provides: checkfs # Required-Start: udev swap $time # Should-Start: # Required-Stop: # Should-Stop: # Default-Start: S # Default-Stop: # Short-Description: Checks local filesystems before mounting. # Description: Checks local filesystmes before mounting. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions case "${1}" in start) # If any LVM based partitions are on the system, ensure they # are activated so they can be checked/used. if [ -x /sbin/vgchange ]; then /sbin/vgchange -a y >/dev/null fi

184 Linux Fundamental : Linux From Scratch

if [ -f /fastboot ]; then msg="/fastboot found, will omit " msg="${msg} file system checks as requested.\n" log_info_msg "${msg}" exit 0 fi log_info_msg "Mounting root file system in read-only mode... " mount -n -o remount,ro / >/dev/null if [ ${?} != 0 ]; then log_failure_msg2 msg="\n\nCannot check root " msg="${msg}filesystem because it could not be mounted " msg="${msg}in read-only mode.\n\n" msg="${msg}After you press Enter, this system will be " msg="${msg}halted and powered off.\n\n" log_failure_msg "${msg}" log_info_msg "Press Enter to continue..." wait_for_user /etc/rc.d/init.d/halt stop else log_success_msg2 fi if [ -f /forcefsck ]; then msg="\n/forcefsck found, forcing file" msg="${msg} system checks as requested." log_success_msg "$msg" options="-f" else options="" fi log_info_msg "Checking file systems..." # Note: -a option used to be -p; but this fails e.g. on fsck.minix fsck ${options} -a -A -C -T >/dev/null error_value=${?} if [ "${error_value}" = 0 ]; then log_success_msg2 fi if [ "${error_value}" = 1 ]; then msg="\nWARNING:\n\nFile system errors " msg="${msg}were found and have been corrected.\n" msg="${msg}You may want to double-check that " msg="${msg}everything was fixed properly." log_warning_msg "$msg" fi if [ "${error_value}" = 2 -o "${error_value}" = 3 ]; then msg="\nWARNING:\n\nFile system errors " msg="${msg}were found and have been been " msg="${msg}corrected, but the nature of the " msg="${msg}errors require this system to be rebooted.\n\n" msg="${msg}After you press enter, " msg="${msg}this system will be rebooted\n\n" log_failure_msg "$msg" log_info_msg "Press Enter to continue..." wait_for_user reboot -f

185 Linux Fundamental : Linux From Scratch

fi if [ "${error_value}" -gt 3 -a "${error_value}" -lt 16 ]; then msg="\nFAILURE:\n\nFile system errors " msg="${msg}were encountered that could not be " msg="${msg}fixed automatically. This system " msg="${msg}cannot continue to boot and will " msg="${msg}therefore be halted until those " msg="${msg}errors are fixed manually by a " msg="${msg}System Administrator.\n\n" msg="${msg}After you press Enter, this system will be " msg="${msg}halted and powered off.\n\n" log_failure_msg "$msg" log_info_msg "Press Enter to continue..." wait_for_user /etc/rc.d/init.d/halt stop fi if [ "${error_value}" -ge 16 ]; then msg="\nFAILURE:\n\nUnexpected Failure " msg="${msg}running fsck. Exited with error " msg="${msg} code: ${error_value}." log_failure_msg $msg exit ${error_value} fi exit 0 ;; *) echo "Usage: ${0} {start}" exit 1 ;; esac # End checkfs C.10. /etc/rc.d/init.d/mountfs #!/bin/sh ######################################################################## # Begin mountfs # # Description : File System Mount Script # # Authors : Gerard Beekmans - gerard@linuxfromscratch.org # DJ Lucas - dj@linuxfromscratch.org # Update : Bruce Dubbs - bdubbs@linuxfromscratch.org # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: $local_fs # Required-Start: udev checkfs # Should-Start: # Required-Stop: swap # Should-Stop: # Default-Start: S # Default-Stop: 06 # Short-Description: Mounts/unmounts local filesystems defined in /etc/fstab. # Description: Remounts root filesystem read/write and mounts all # remaining local filesystems defined in /etc/fstab on # start. Remounts root filesystem read-only and unmounts

186 Linux Fundamental : Linux From Scratch

# remaining filesystems on stop. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions case "${1}" in start) log_info_msg "Remounting root file system in read-write mode..." mount -n -o remount,rw / >/dev/null evaluate_retval # Remove fsck-related file system watermarks. rm -f /fastboot /forcefsck log_info_msg "Recording existing mounts in /etc/mtab..." > /etc/mtab mount -f / || failed=1 mount -f /proc || failed=1 mount -f /sys || failed=1 mount -f /run || failed=1 mount -f /dev || failed=1 (exit ${failed}) evaluate_retval # This will mount all filesystems that do not have _netdev in # their option list. _netdev denotes a network filesystem. log_info_msg "Mounting remaining file systems..." mount -a -O no_netdev >/dev/null evaluate_retval exit $failed ;; stop) # Don't unmount tmpfs like /run log_info_msg "Unmounting all other currently mounted file systems..." umount -a -d -r -t notmpfs,nosysfs,nodevtmpfs >/dev/null evaluate_retval # Make all LVM volume groups unavailable, if appropriate if [ -x /sbin/vgchange ]; then /sbin/vgchange -an; fi ;; *) echo "Usage: ${0} {start|stop}" exit 1 ;; esac # End mountfs C.11. /etc/rc.d/init.d/udev_retry #!/bin/sh ######################################################################## # Begin udev_retry # # Description : Udev cold-plugging script (retry) # # Authors : Alexander E. Patrakov # DJ Lucas - dj@linuxfromscratch.org # Update : Bruce Dubbs - bdubbs@linuxfromscratch.org # Bryan Kadzban -

187 Linux Fundamental : Linux From Scratch

# # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: udev_retry # Required-Start: udev # Should-Start: $local_fs # Required-Stop: # Should-Stop: # Default-Start: S # Default-Stop: # Short-Description: Replays failed uevents and creates additonal devices. # Description: Replays any failed uevents that were skipped due to # slow hardware initialization, and creates those needed # device nodes # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions case "${1}" in start) log_info_msg "Retrying failed uevents, if any..." rundir=$(/sbin/udevadm info --run) # From Debian: "copy the rules generated before / was mounted # read-write": for file in ${rundir}/tmp-rules--*; do dest=${file##*tmp-rules--} [ "$dest" = '*' ] && break cat $file >> /etc/udev/rules.d/$dest rm -f $file done # Re-trigger the uevents that may have failed, # in hope they will succeed now /bin/sed -e 's/#.*$//' /etc/sysconfig/udev_retry | /bin/grep -v '^$' | \ while read line ; do for subsystem in $line ; do /sbin/udevadm trigger --subsystem-match=$subsystem --action=add done done # Now wait for udevd to process the uevents we triggered /sbin/udevadm settle evaluate_retval ;; *) echo "Usage ${0} {start}" exit 1 ;; esac exit 0 # End udev_retry

188 Linux Fundamental : Linux From Scratch

C.12. /etc/rc.d/init.d/cleanfs #!/bin/sh ######################################################################## # Begin cleanfs # # Description : Clean file system # # Authors : Gerard Beekmans - gerard@linuxfromscratch.org # DJ Lucas - dj@linuxfromscratch.org # Update : Bruce Dubbs - bdubbs@linuxfromscratch.org # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: cleanfs # Required-Start: $local_fs # Should-Start: # Required-Stop: # Should-Stop: # Default-Start: S # Default-Stop: # Short-Description: Cleans temporary directories early in the boot process. # Description: Cleans temporary directories /var/run, /var/lock, and # optionally, /tmp. cleanfs also creates /var/run/utmp # and any files defined in /etc/sysconfig/createfiles. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions # Function to create files/directory on boot. create_files() { # Input to file descriptor 9 and output to stdin (redirection) exec 9>&0 < /etc/sysconfig/createfiles while read name type perm usr grp dtype maj min junk do # Ignore comments and blank lines. case "${name}" in ""|\#*) continue ;; esac # Ignore existing files. if [ ! -e "${name}" ]; then # Create stuff based on its type. case "${type}" in dir) mkdir "${name}" ;; file) :> "${name}" ;; dev) case "${dtype}" in

189 Linux Fundamental : Linux From Scratch

char) mknod "${name}" c ${maj} ${min} ;; block) mknod "${name}" b ${maj} ${min} ;; pipe) mknod "${name}" p ;; *) log_warning_msg "\nUnknown device type: ${dtype}" ;; esac ;; *) log_warning_msg "\nUnknown type: ${type}" continue ;; esac # Set up the permissions, too. chown ${usr}:${grp} "${name}" chmod ${perm} "${name}" fi done # Close file descriptor 9 (end redirection) exec 0>&9 9>&return 0 } case "${1}" in start) log_info_msg "Cleaning file systems:" if [ "${SKIPTMPCLEAN}" = "" ]; then log_info_msg2 " /tmp" cd /tmp && find . -xdev -mindepth 1 ! -name lost+found -delete || failed=1 fi > /var/run/utmp if grep -q '^utmp:' /etc/group ; then chmod 664 /var/run/utmp chgrp utmp /var/run/utmp fi (exit ${failed}) evaluate_retval if egrep -qv '^(#|$)' /etc/sysconfig/createfiles 2>/dev/null; then log_info_msg "Creating files and directories... " create_files # Always returns 0 evaluate_retval fi exit $failed ;; *) echo "Usage: ${0} {start}" exit 1 ;; esac

190 Linux Fundamental : Linux From Scratch

# End cleanfs C.13. /etc/rc.d/init.d/console #!/bin/sh ######################################################################## # Begin console # # Description : Sets keymap and screen font # # Authors : Gerard Beekmans - gerard@linuxfromscratch.org # Alexander E. Patrakov # DJ Lucas - dj@linuxfromscratch.org # Update : Bruce Dubbs - bdubbs@linuxfromscratch.org # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: console # Required-Start: # Should-Start: $local_fs # Required-Stop: # Should-Stop: # Default-Start: S # Default-Stop: # Short-Description: Sets up a localised console. # Description: Sets up fonts and language settings for the user's # local as defined by /etc/sysconfig/console. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions # Native English speakers probably don't have /etc/sysconfig/console at all [ -r /etc/sysconfig/console ] && . /etc/sysconfig/console function is_true() { [ "$1" = "1" ] || [ "$1" = "yes" ] || [ "$1" = "true" ] } failed=0 case "${1}" in start) # See if we need to do anything if [ -z "${KEYMAP}" ] && [ -z "${KEYMAP_CORRECTIONS}" ] && [ -z "${FONT}" ] && [ -z "${LEGACY_CHARSET}" ] && ! is_true "${UNICODE}"; then exit 0 fi # There should be no bogus failures below this line! log_info_msg "Setting up Linux console..." # Figure out if a framebuffer console is used [ -d /sys/class/graphics/fb0 ] && use_fb=1 || use_fb=0 # Figure out the command to set the console into the # desired mode is_true "${UNICODE}" && MODE_COMMAND="echo -en '\033%G' && kbd_mode -u" ||

191 Linux Fundamental : Linux From Scratch

MODE_COMMAND="echo -en '\033%@\033(K' && kbd_mode -a" # On framebuffer consoles, font has to be set for each vt in # UTF-8 mode. This doesn't hurt in non-UTF-8 mode also. ! is_true "${use_fb}" || [ -z "${FONT}" ] || MODE_COMMAND="${MODE_COMMAND} && setfont ${FONT}" # Apply that command to all consoles mentioned in # /etc/inittab. Important: in the UTF-8 mode this should # happen before setfont, otherwise a kernel bug will # show up and the unicode map of the font will not be # used. for TTY in `grep '^[^#].*respawn:/sbin/agetty' /etc/inittab | grep -o '\btty[[:digit:]]*\b'` do openvt -f -w -c ${TTY#tty} -- \ /bin/sh -c "${MODE_COMMAND}" || failed=1 done # Set the font (if not already set above) and the keymap [ "${use_fb}" == "1" ] || [ -z "${FONT}" ] || setfont $FONT || failed=1 [ -z "${KEYMAP}" ] || loadkeys ${KEYMAP} >/dev/null 2>&1 || failed=1 [ -z "${KEYMAP_CORRECTIONS}" ] || loadkeys ${KEYMAP_CORRECTIONS} >/dev/null 2>&1 || failed=1 # Convert the keymap from $LEGACY_CHARSET to UTF-8 [ -z "$LEGACY_CHARSET" ] || dumpkeys -c "$LEGACY_CHARSET" | loadkeys -u >/dev/null 2>&1 || failed=1 # If any of the commands above failed, the trap at the # top would set $failed to 1 ( exit $failed ) evaluate_retval exit $failed ;; *) echo "Usage: ${0} {start}" exit 1 ;; esac # End console C.14. /etc/rc.d/init.d/localnet #!/bin/sh ######################################################################## # Begin localnet # # Description : Loopback device # # Authors : Gerard Beekmans - gerard@linuxfromscratch.org # DJ Lucas - dj@linuxfromscratch.org # Update : Bruce Dubbs - bdubbs@linuxfromscratch.org #

192 Linux Fundamental : Linux From Scratch

# Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: localnet # Required-Start: $local_fs # Should-Start: # Required-Stop: # Should-Stop: # Default-Start: S # Default-Stop: 06 # Short-Description: Starts the local network. # Description: Sets the hostname of the machine and starts the # loopback interface. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions [ -r /etc/sysconfig/network ] && . /etc/sysconfig/network case "${1}" in start) log_info_msg "Bringing up the loopback interface..." ip addr add 127.0.0.1/8 label lo dev lo ip link set lo up evaluate_retval log_info_msg "Setting hostname to ${HOSTNAME}..." hostname ${HOSTNAME} evaluate_retval ;; stop) log_info_msg "Bringing down the loopback interface..." ip link set lo down evaluate_retval ;; restart) ${0} stop sleep 1 ${0} start ;; status) echo "Hostname is: $(hostname)" ip link show lo ;; *) echo "Usage: ${0} {start|stop|restart|status}" exit 1 ;; esac exit 0 # End localnet C.15. /etc/rc.d/init.d/sysctl #!/bin/sh ######################################################################## # Begin sysctl

193 Linux Fundamental : Linux From Scratch

# # Description : File uses /etc/sysctl.conf to set kernel runtime # parameters # # Authors : Nathan Coulson (nathan@linuxfromscratch.org) # Matthew Burgress (matthew@linuxfromscratch.org) # DJ Lucas - dj@linuxfromscratch.org # Update : Bruce Dubbs - bdubbs@linuxfromscratch.org # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: sysctl # Required-Start: mountkernfs # Should-Start: # Required-Stop: # Should-Stop: # Default-Start: S # Default-Stop: # Short-Description: Makes changes to the proc filesystem # Description: Makes changes to the proc filesystem as defined in # /etc/sysctl.conf. See 'man sysctl(8)'. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions case "${1}" in start) if [ -f "/etc/sysctl.conf" ]; then log_info_msg "Setting kernel runtime parameters..." sysctl -q -p evaluate_retval fi ;; status) sysctl -a ;; *) echo "Usage: ${0} {start|status}" exit 1 ;; esac exit 0 # End sysctl C.16. /etc/rc.d/init.d/sysklogd #!/bin/sh ######################################################################## # Begin sysklogd # # Description : Sysklogd loader # # Authors : Gerard Beekmans - gerard@linuxfromscratch.org # DJ Lucas - dj@linuxfromscratch.org # Update : Bruce Dubbs - bdubbs@linuxfromscratch.org # # Version : LFS 7.0

194 Linux Fundamental : Linux From Scratch

# ######################################################################## ### BEGIN INIT INFO # Provides: $syslog # Required-Start: localnet # Should-Start: # Required-Stop: $local_fs sendsignals # Should-Stop: # Default-Start: 2345 # Default-Stop: 016 # Short-Description: Starts kernel and system log daemons. # Description: Starts kernel and system log daemons. # /etc/fstab. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions case "${1}" in start) log_info_msg "Starting system log daemon..." parms=${SYSKLOGD_PARMS-'-m 0'} start_daemon /sbin/syslogd $parms evaluate_retval log_info_msg "Starting kernel log daemon..." start_daemon /sbin/klogd evaluate_retval ;; stop) log_info_msg "Stopping kernel log daemon..." killproc /sbin/klogd evaluate_retval log_info_msg "Stopping system log daemon..." killproc /sbin/syslogd evaluate_retval ;; reload) log_info_msg "Reloading system log daemon config file..." pid=`pidofproc syslogd` kill -HUP "${pid}" evaluate_retval ;; restart) ${0} stop sleep 1 ${0} start ;; status) statusproc /sbin/syslogd statusproc klogd ;; *) echo "Usage: ${0} {start|stop|reload|restart|status}" exit 1 ;; esac

195 Linux Fundamental : Linux From Scratch

exit 0 # End sysklogd C.17. /etc/rc.d/init.d/network #!/bin/sh ######################################################################## # Begin network # # Description : Network Control Script # # Authors : Gerard Beekmans - gerard@linuxfromscratch.org # Nathan Coulson - nathan@linuxfromscratch.org # Kevin P. Fleming - kpfleming@linuxfromscratch.org # DJ Lucas - dj@linuxfromscratch.org # Update : Bruce Dubbs - bdubbs@linuxfromscratch.org # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: $network # Required-Start: $local_fs swap localnet # Should-Start: $syslog # Required-Stop: $local_fs swap localnet # Should-Stop: $syslog # Default-Start: 345 # Default-Stop: 0126 # Short-Description: Starts and configures network interfaces. # Description: Starts and configures network interfaces. # X-LFS-Provided-By: LFS ### END INIT INFO case "${1}" in start) # Start all network interfaces for file in /etc/sysconfig/ifconfig.* do interface=${file##*/ifconfig.} # Skip if $file is * (because nothing was found) if [ "${interface}" = "*" ] then continue fi /sbin/ifup ${interface} done ;; stop) # Reverse list net_files="" for file in /etc/sysconfig/ifconfig.* do net_files="${file} ${net_files}" done # Stop all network interfaces for file in ${net_files} do interface=${file##*/ifconfig.}

196 Linux Fundamental : Linux From Scratch

# Skip if $file is * (because nothing was found) if [ "${interface}" = "*" ] then continue fi /sbin/ifdown ${interface} done ;; restart) ${0} stop sleep 1 ${0} start ;; *) echo "Usage: ${0} {start|stop|restart}" exit 1 ;; esac exit 0 # End network C.18. /etc/rc.d/init.d/sendsignals #!/bin/sh ######################################################################## # Begin sendsignals # # Description : Sendsignals Script # # Authors : Gerard Beekmans - gerard@linuxfromscratch.org # DJ Lucas - dj@linuxfromscratch.org # Update : Bruce Dubbs - bdubbs@linuxfromscratch.org # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: sendsignals # Required-Start: # Should-Start: # Required-Stop: $local_fs swap localnet # Should-Stop: # Default-Start: # Default-Stop: 06 # Short-Description: Attempts to kill remaining processes. # Description: Attempts to kill remaining processes. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions case "${1}" in stop) log_info_msg "Sending all processes the TERM signal..." killall5 -15 error_value=${?} sleep ${KILLDELAY}

197 Linux Fundamental : Linux From Scratch

if [ "${error_value}" = 0 -o "${error_value}" = 2 ]; then log_success_msg else log_failure_msg fi log_info_msg "Sending all processes the KILL signal..." killall5 -9 error_value=${?} sleep ${KILLDELAY} if [ "${error_value}" = 0 -o "${error_value}" = 2 ]; then log_success_msg else log_failure_msg fi ;; *) echo "Usage: ${0} {stop}" exit 1 ;; esac exit 0 # End sendsignals C.19. /etc/rc.d/init.d/reboot #!/bin/sh ######################################################################## # Begin reboot # # Description : Reboot Scripts # # Authors : Gerard Beekmans - gerard@linuxfromscratch.org # DJ Lucas - dj@linuxfromscratch.org # Update : Bruce Dubbs - bdubbs@linuxfromscratch.org # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: reboot # Required-Start: # Should-Start: # Required-Stop: # Should-Stop: # Default-Start: 6 # Default-Stop: # Short-Description: Reboots the system. # Description: Reboots the System. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions case "${1}" in stop) log_info_msg "Restarting system..."

198 Linux Fundamental : Linux From Scratch

reboot -d -f -i ;; *) echo "Usage: ${0} {stop}" exit 1 ;; esac # End reboot C.20. /etc/rc.d/init.d/halt #!/bin/sh ######################################################################## # Begin halt # # Description : Halt Script # # Authors : Gerard Beekmans - gerard@linuxfromscratch.org # DJ Lucas - dj@linuxfromscratch.org # Update : Bruce Dubbs - bdubbs@linuxfromscratch.org # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: halt # Required-Start: # Should-Start: # Required-Stop: # Should-Stop: # Default-Start: 0 # Default-Stop: # Short-Description: Halts the system. # Description: Halts the System. # X-LFS-Provided-By: LFS ### END INIT INFO case "${1}" in stop) halt -d -f -i -p ;; *) echo "Usage: {stop}" exit 1 ;; esac # End halt C.21. /etc/rc.d/init.d/template #!/bin/sh ######################################################################## # Begin scriptname # # Description : # # Authors : # # Version : LFS x.x #

199 Linux Fundamental : Linux From Scratch

# Notes : # ######################################################################## ### BEGIN INIT INFO # Provides: template # Required-Start: # Should-Start: # Required-Stop: # Should-Stop: # Default-Start: # Default-Stop: # Short-Description: # Description: # X-LFS-Provided-By: ### END INIT INFO . /lib/lsb/init-functions case "${1}" in start) log_info_msg "Starting..." start_daemon fully_qualified_path ;; stop) log_info_msg "Stopping..." killproc fully_qualified_path ;; restart) ${0} stop sleep 1 ${0} start ;; *) echo "Usage: ${0} {start|stop|restart}" exit 1 ;; esac exit 0 # End scriptname C.22. /etc/sysconfig/rc ######################################################################## # Begin /etc/sysconfig/rc # # Description : rc script configuration # # Authors : # # Version : 00.00 # # Notes : Not used by LFS, but present for BLFS compatibility # ######################################################################## rc_base=/etc/rc.d rc_functions=${rc_base}/init.d/functions network_devices=/etc/sysconfig/network-devices

200 Linux Fundamental : Linux From Scratch

# End /etc/sysconfig/rc C.23. /etc/sysconfig/modules ######################################################################## # Begin /etc/sysconfig/modules # # Description : Module auto-loading configuration # # Authors : # # Version : 00.00 # # Notes : The syntax of this file is as follows: # <module> [<arg1> <arg2> ...] # # Each module should be on it's own line, and any options that you want # passed to the module should follow it. The line deliminator is either # a space or a tab. ######################################################################## # End /etc/sysconfig/modules C.24. /etc/sysconfig/createfiles ######################################################################## # Begin /etc/sysconfig/createfiles # # Description : Createfiles script config file # # Authors : # # Version : 00.00 # # Notes : The syntax of this file is as follows: # if type is equal to "file" or "dir" # <filename> <type> <permissions> <user> <group> # if type is equal to "dev" # <filename> <type> <permissions> <user> <group> <devtype> # <major> <minor> # # <filename> is the name of the file which is to be created # <type> is either file, dir, or dev. # file creates a new file # dir creates a new directory # dev creates a new device # <devtype> is either block, char or pipe # block creates a block device # char creates a character deivce # pipe creates a pipe, this will ignore the <major> and # <minor> fields # <major> and <minor> are the major and minor numbers used for # the device. ######################################################################## # End /etc/sysconfig/createfiles C.25. /etc/sysconfig/udev-retry ######################################################################## # Begin /etc/sysconfig/udev_retry # # Description : udev_retry script configuration # # Authors : #

201 Linux Fundamental : Linux From Scratch

# Version : 00.00 # # Notes : Each subsystem that may need to be re-triggered after mountfs # runs should be listed in this file. Probable subsystems to be # listed here are rtc (due to /var/lib/hwclock/adjtime) and sound # (due to both /var/lib/alsa/asound.state and /usr/sbin/alsactl). # Entries are whitespace-separated. ######################################################################## rtc # End /etc/sysconfig/udev_retry C.26. /sbin/ifup #!/bin/sh ######################################################################## # Begin /sbin/ifup # # Description : Interface Up # # Authors : Nathan Coulson - nathan@linuxfromscratch.org # Kevin P. Fleming - kpfleming@linuxfromscratch.org # Update : Bruce Dubbs - bdubbs@linuxfromscratch.org # # Version : LFS 7.0 # # Notes : The IFCONFIG variable is passed to the SERVICE script # in the /lib/services directory, to indicate what file the # service should source to get interface specifications. # ######################################################################## RELEASE="7.0" USAGE="Usage: $0 [ -hV ] [--help] [--version] interface" VERSTR="LFS ifup, version ${RELEASE}" while [ $# -gt 0 ]; do case "$1" in --help | -h) help="y"; break ;; --version | -V) echo "${VERSTR}"; exit 0 ;; -*) echo "ifup: ${1}: invalid option" >&2 echo "${USAGE}" >& 2 exit 2 ;; break ;;

*) esac done

if [ -n "$help" ]; then echo "${VERSTR}" echo "${USAGE}" echo cat << HERE_EOF ifup is used to bring up a network interface. The interface parameter, e.g. eth0 or eth0:2, must match the trailing part of the interface specifications file, e.g. /etc/sysconfig/ifconfig.eth0:2. HERE_EOF exit 0 fi

202 Linux Fundamental : Linux From Scratch

file=/etc/sysconfig/ifconfig.${1} # Skip backup files [ "${file}" = "${file%""~""}" ] || exit 0 . /lib/lsb/init-functions log_info_msg "Bringing up the ${1} interface... " if [ ! -r "${file}" ]; then log_failure_msg2 "${file} is missing or cannot be accessed." exit 1 fi . $file if [ "$IFACE" = "" ]; then log_failure_msg2 "${file} does not define an interface [IFACE]." exit 1 fi # Do not process this service if started by boot, and ONBOOT # is not set to yes if [ "${IN_BOOT}" = "1" -a "${ONBOOT}" != "yes" ]; then log_info_msg2 "skipped" exit 0 fi for S in ${SERVICE}; do if [ ! -x "/lib/services/${S}" ]; then MSG="\n Unable to process ${file}. Either " MSG="${MSG}the SERVICE '${S} was not present " MSG="${MSG}or cannot be executed." log_failure_msg "$MSG" exit 1 fi done if [ -z "${CHECK_LINK}" -o \ "${CHECK_LINK}" = "y" -o \ "${CHECK_LINK}" = "yes" -o \ "${CHECK_LINK}" = "1" ]; then # Bring up the interface if ip link show ${IFACE} > /dev/null 2>&1; then link_status=`ip link show ${IFACE}` if [ -n "${link_status}" ]; then if ! echo "${link_status}" | grep -q UP; then ip link set ${IFACE} up fi fi else log_failure_msg2 "Interface ${IFACE} doesn't exist." exit 1 fi fi # Set MTU if requested. Check if MTU has a "good" value. if test -n "${MTU}"; then if [[ ${MTU} =~ ^[0-9]+$ ]] && [[ $MTU -ge 68 ]] ; then ip link set dev ${IFACE} mtu $MTU else

203 Linux Fundamental : Linux From Scratch

log_info_msg2 "Invalid MTU $MTU" fi fi for S in ${SERVICE}; do IFCONFIG=${file} /lib/services/${S} ${IFACE} up done # End /sbin/ifup C.27. /sbin/ifdown #!/bin/sh ######################################################################## # Begin /sbin/ifdown # # Description : Interface Down # # Authors : Nathan Coulson - nathan@linuxfromscratch.org # Kevin P. Fleming - kpfleming@linuxfromscratch.org # Update : Bruce Dubbs - bdubbs@linuxfromscratch.org # # Version : LFS 7.0 # # Notes : the IFCONFIG variable is passed to the scripts found # in the /lib/services directory, to indicate what file the # service should source to get interface specifications. # ######################################################################## RELEASE="7.0" USAGE="Usage: $0 [ -hV ] [--help] [--version] interface" VERSTR="LFS ifdown, version ${RELEASE}" while [ $# -gt 0 ]; do case "$1" in --help | -h) help="y"; break ;; --version | -V) echo "${VERSTR}"; exit 0 ;; -*) echo "ifup: ${1}: invalid option" >&2 echo "${USAGE}" >& 2 exit 2 ;; break ;;

*) esac done

if [ -n "$help" ]; then echo "${VERSTR}" echo "${USAGE}" echo cat << HERE_EOF ifdown is used to bring down a network interface. The interface parameter, e.g. eth0 or eth0:2, must match the trailing part of the interface specifications file, e.g. /etc/sysconfig/ifconfig.eth0:2. HERE_EOF exit 0 fi file=/etc/sysconfig/ifconfig.${1} # Skip backup files

204 Linux Fundamental : Linux From Scratch

[ "${file}" = "${file%""~""}" ] || exit 0 . /lib/lsb/init-functions if [ ! -r "${file}" ]; then log_warning_msg "${file} is missing or cannot be accessed." exit 1 fi . ${file} if [ "$IFACE" = "" ]; then log_failure_msg "${file} does not define an interface [IFACE]." exit 1 fi # Reverse the order SERVICES= for S in ${SERVICE}; do SERVICES="${SERVICES} ${S}"; done # This will run the service scripts if ip link show ${IFACE} > /dev/null 2>&1; then for S in ${SERVICES}; do if [ -n "${S}" -a -x "/lib/services/${S}" ]; then IFCONFIG=${file} /lib/services/${S} ${IFACE} down else MSG="Unable to process ${file}. Either " MSG="${MSG}the SERVICE variable was not set " MSG="${MSG}or the specified service cannot be executed." log_failure_msg "$MSG" exit 1 fi done else log_warning_msg "Interface ${1} doesn't exist." fi link_status=`ip link show ${IFACE} 2>/dev/null` if [ -n "${link_status}" ]; then if [ "$(echo "${link_status}" | grep UP)" != "" ]; then if [ "$(ip addr show ${IFACE} | grep 'inet ')" != "" ]; then log_info_msg "Bringing down the ${IFACE} interface..." ip link set ${IFACE} down evaluate_retval fi fi fi # End /sbin/ifdown C.28. /lib/services/ipv4-static #!/bin/sh ######################################################################## # Begin /lib/services/ipv4-static # # Description : IPV4 Static Boot Script # # Authors : Nathan Coulson - nathan@linuxfromscratch.org # Kevin P. Fleming - kpfleming@linuxfromscratch.org # Update : Bruce Dubbs - bdubbs@linuxfromscratch.org # # Version : LFS 7.0

205 Linux Fundamental : Linux From Scratch

# ######################################################################## . /lib/lsb/init-functions . ${IFCONFIG} if [ -z "${IP}" ]; then log_failure_msg "\nIP variable missing from ${IFCONFIG}, cannot continue." exit 1 fi if [ -z "${PREFIX}" -a -z "${PEER}" ]; then log_warning_msg "\nPREFIX variable missing from ${IFCONFIG}, assuming 24." PREFIX=24 args="${args} ${IP}/${PREFIX}" elif [ -n "${PREFIX}" -a -n "${PEER}" ]; then log_failure_msg "\nPREFIX and PEER both specified in ${IFCONFIG}, cannot continue." exit 1 elif [ -n "${PREFIX}" ]; then args="${args} ${IP}/${PREFIX}" elif [ -n "${PEER}" ]; then args="${args} ${IP} peer ${PEER}" fi if [ -n "${BROADCAST}" ]; then args="${args} broadcast ${BROADCAST}" fi case "${2}" in up) if [ "$(ip addr show ${1} 2>/dev/null | grep ${IP})" == "" ]; then # Cosmetic output not needed for multiple services if ! $(echo ${SERVICE} | grep -q " "); then log_info_msg2 "\n" # Terminate the previous message fi log_info_msg "Adding IPv4 address ${IP} to the ${1} interface..." ip addr add ${args} dev ${1} evaluate_retval if [ -n "${GATEWAY}" ]; then if ip route | grep -q default; then log_warning_msg "\nGateway already setup; skipping." else log_info_msg "Setting up default gateway..." ip route add default via ${GATEWAY} dev ${1} evaluate_retval fi fi else msg="Cannot add IPv4 address ${IP} to ${1}. Already present." log_warning_msg "$msg" fi ;; down) if [ "$(ip addr show ${1} 2>/dev/null | grep ${IP})" != "" ]; then log_info_msg "Removing IPv4 address ${IP} from the ${1} interface..." ip addr del ${args} dev ${1} evaluate_retval

206 Linux Fundamental : Linux From Scratch

fi if [ -n "${GATEWAY}" ]; then # Only remove the gateway if ther are no remaining ipv4 addresses if [ "$(ip addr show ${1} 2>/dev/null | grep 'inet ')" != "" ]; then log_info_msg "Removing default gateway..." ip route del default evaluate_retval fi fi ;; *) echo "Usage: ${0} [interface] {up|down}" exit 1 ;; esac # End /lib/services/ipv4-static C.29. /lib/services/ipv4-static-route #!/bin/sh ######################################################################## # Begin /lib/services/ipv4-static-route # # Description : IPV4 Static Route Script # # Authors : Kevin P. Fleming - kpfleming@linuxfromscratch.org # DJ Lucas - dj@linuxfromscratch.org # Update : Bruce Dubbs - bdubbs@linuxfromscratch.org # # Version : LFS 7.0 # ######################################################################## . /lib/lsb/init-functions . ${IFCONFIG} case "${TYPE}" in ("" | "network") need_ip=1 need_gateway=1 ;; ("default") need_gateway=1 args="${args} default" desc="default" ;; ("host") need_ip=1 ;; ("unreachable") need_ip=1 args="${args} unreachable" desc="unreachable " ;; (*) log_failure_msg "Unknown route type (${TYPE}) in ${IFCONFIG}, cannot continue." exit 1 ;;

207 Linux Fundamental : Linux From Scratch

esac if [ -n "${need_ip}" ]; then if [ -z "${IP}" ]; then log_failure_msg "IP variable missing from ${IFCONFIG}, cannot continue." exit 1 fi if [ -z "${PREFIX}" ]; then log_failure_msg "PREFIX variable missing from ${IFCONFIG}, cannot continue." exit 1 fi args="${args} ${IP}/${PREFIX}" desc="${desc}${IP}/${PREFIX}" fi if [ -n "${need_gateway}" ]; then if [ -z "${GATEWAY}" ]; then log_failure_msg "GATEWAY variable missing from ${IFCONFIG}, cannot continue." exit 1 fi args="${args} via ${GATEWAY}" fi if [ -n "${SOURCE}" ]; then args="${args} src ${SOURCE}" fi case "${2}" in up) log_info_msg "Adding '${desc}' route to the ${1} interface..." ip route add ${args} dev ${1} evaluate_retval ;; down) log_info_msg "Removing '${desc}' route from the ${1} interface..." ip route del ${args} dev ${1} evaluate_retval ;; *) echo "Usage: ${0} [interface] {up|down}" exit 1 ;; esac # End /lib/services/ipv4-static-route

D.Konfigurasi Pengaturan Udev E. Aturan dari udev-config-20100128.tar.bz2 dalam lampiran ini terdaftar untuk kenyamanan. Instalasi ini biasanya dilakukan melalui instruksi dalam Bagian 6.60, "Udev-181". D.1. 55-lfs.rules # /etc/udev/rules.d/55-lfs.rules: Rule definitions for LFS. # Core kernel devices # This causes the system clock to be set as soon as /dev/rtc becomes available. SUBSYSTEM=="rtc", ACTION=="add", MODE="0644", RUN+="/etc/rc.d/init.d/setclock start" KERNEL=="rtc", ACTION=="add", MODE="0644", RUN+="/etc/rc.d/init.d/setclock start"

208 Linux Fundamental : Linux From Scratch

# Comms devices KERNEL=="ippp[0-9]*", KERNEL=="isdn[0-9]*", GROUP="dialout" GROUP="dialout"

KERNEL=="isdnctrl[0-9]*", GROUP="dialout" KERNEL=="dcbri[0-9]*", GROUP="dialout"

209 Linux Fundamental : Linux From Scratch