Jump to content

LFS: Final Preparation: Difference between revisions

From Haidhi Wiki
No edit summary
No edit summary
 
Line 55: Line 55:
= Setup Environment =  
= Setup Environment =  
Kita ingin menyiapkan working environment yang bersih dan terkontrol untuk user lfs, agar proses build LFS (Linux From Scratch) nantinya tidak terganggu oleh environment variable atau konfigurasi yang ada di sistem host (OS utama). LAKUKAN SEMUA INI SAAT LOGIN DENGAN USER '''lfs'''
Kita ingin menyiapkan working environment yang bersih dan terkontrol untuk user lfs, agar proses build LFS (Linux From Scratch) nantinya tidak terganggu oleh environment variable atau konfigurasi yang ada di sistem host (OS utama). LAKUKAN SEMUA INI SAAT LOGIN DENGAN USER '''lfs'''
<syntaxhighlight lang=bash>
cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF
</syntaxhighlight>
#<code>cat > ~/.bash_profile << "EOF"</code>
#*Ini artinya kita membuat atau overwrite file <code>~/.bash_profile</code> dengan isi yang diketik sampai ketemu baris EOF
#*File <code>.bash_profile</code> ini akan dijalankan otomatis saat login shell aktif (misalnya saat <code>su - lfs</code>)
#<code>exec env -i ... /bin/bash</code>
#*<code>exec</code>: Mengganti shell yang sedang berjalan dengan perintah baru. Jadi shell awal akan diganti langsung dengan shell yang kita definisikan setelahnya (tidak menumpuk di atas shell lama).
#*<code>env -i</code>: Menjalankan perintah dengan lingkungan kosong (<code>-i</code> = ignore environment). Ini menghapus semua environment variable yang aktif. Tapi kita tambahkan tiga variable penting secara eksplisit:
#**HOME: supaya direktori home user tetap dikenali.
#**TERM: supaya terminal tetap tahu jenisnya (penting buat tampilan dan kemampuan seperti warna, scroll, dll).
#**PS1: prompt shell yang muncul (misalnya lfs:/home/lfs$), biar tetap enak dilihat.
#<code>/bin/bash</code>: shell yang kita jalankan: Bash.
== Hasil Akhir ==
Saat user lfs login (atau <code>su - lfs</code>), file <code>.bash_profile</code> akan jalan dan:
*Menghapus seluruh environment dari sistem host.
*Menyiapkan shell Bash baru hanya dengan 3 variabel: <code>HOME</code>, <code>TERM</code>, dan <code>PS1</code>.
*Shell jadi bersih, gak ada variabel aneh-aneh dari OS host.
*Work environment jadi konsisten dan aman, terutama saat kompilasi LFS.
== Why? ==
Karena kita sedang membangun sistem Linux dari awal (LFS), kita tidak ingin satupun konfigurasi atau environment dari OS host merusak atau mempengaruhi hasil build kita. Ini seperti memasak di dapur steril — biar hasilnya murni dan bisa diprediksi.
Kalau ada environment dari host yang ikut masuk, bisa saja bikin tools build error, hasil kompilasi aneh, atau bahkan sistem tidak bisa boot nanti.
= Setup Environment =
Kita ingin menyiapkan working environment yang bersih dan terkontrol untuk user lfs, agar proses build LFS (Linux From Scratch) nantinya tidak terganggu oleh environment variable atau konfigurasi yang ada di sistem host (OS utama).
<syntaxhighlight lang=bash>
<syntaxhighlight lang=bash>
cat > ~/.bash_profile << "EOF"
cat > ~/.bash_profile << "EOF"

Latest revision as of 06:41, 15 April 2025

Membuat Direktori untuk sistem LFS

Pada bagian ini, kita mulai mengisi filesystem LFS (Linux From Scratch) dengan komponen-komponen yang akan membentuk sistem Linux final. Pertama-tama kita akan membuat direktori sehingga program-program yang telah di-compile bisa dipasang dilokasi akhirnya. Tujuan lain adalah agar program-program ini tidak tertima dengan versi finalnya.

Membuat Struktur Direktori

 
mkdir -pv $LFS/{etc,var} $LFS/usr/{bin,lib,sbin}
  • mkdir -pv: Perintah ini digunakan untuk membuat direktori, dengan opsi -p untuk membuat direktori beserta subdirektorinya jika belum ada, dan -v untuk menampilkan pesan yang menunjukkan apa yang sedang dibuat.
  • $LFS/{etc,var}: Membuat direktori etc dan var di dalam direktori yang ditentukan oleh variabel $LFS
  • $LFS/usr/{bin,lib,sbin}: Membuat direktori bin, lib, dan sbin di dalam direktori usr, di bawah $LFS

Membuat Symlink

for i in bin lib sbin; do
  ln -sv usr/$i $LFS/$i
done
  • for i in bin lib sbin; do ... done: Ini adalah loop for yang akan mengulang perintah untuk masing-masing item (bin, lib, sbin)
  • ln -sv usr/$i $LFS/$i: Untuk setiap direktori (bin, lib, sbin), perintah ini membuat symlink (link simbolik) dari $LFS/usr/$i ke $LFS/$i. Ini berarti direktori bin, lib, sbin yang ada di dalam direktori usr akan disimbolkan ke direktori yang lebih umum di $LFS. Tujuannya adalah untuk mempermudah pengelolaan file sistem dan memisahkan direktori berdasarkan fungsi mereka.

Membuat Direktori lib64 untuk Arsitektur x86_64

case $(uname -m) in
  x86_64) mkdir -pv $LFS/lib64 ;;
esac
  • uname -m: Perintah ini digunakan untuk mendapatkan arsitektur mesin saat ini. Jika arsitektur sistem adalah x86_64 (yaitu, 64-bit), maka perintah berikut akan dijalankan.
  • mkdir -pv $LFS/lib64: Jika sistem menggunakan arsitektur x86_64, maka direktori lib64 akan dibuat di dalam direktori $LFS. Direktori lib64 digunakan pada sistem 64-bit untuk menyimpan pustaka (library) 64-bit, yang terpisah dari pustaka 32-bit yang disimpan di lib.


Lalu kita akan membuat folder lagi untuk menyimpan program yang dicompile menggunakan cross-compiler

 
mkdir -pv $LFS/tools

Membuat User LFS

Pada sistem Linux, pengguna dengan hak akses root memiliki kemampuan untuk melakukan hampir semua tindakan, termasuk yang dapat merusak atau menghancurkan sistem jika dilakukan dengan keliru. Oleh karena itu, untuk meningkatkan keamanan dan mencegah potensi kesalahan yang tidak sengaja, paket-paket dalam proses instalasi LFS (Linux From Scratch) dibangun oleh pengguna yang tidak memiliki hak akses root, yaitu pengguna dengan hak akses terbatas.

Untuk mempermudah pengaturan lingkungan kerja yang bersih, pada proses instalasi LFS, dibuat pengguna baru yang tidak memiliki hak akses root, yaitu pengguna lfs. Pengguna lfs ini akan menjadi anggota grup yang juga bernama lfs, dan selama proses instalasi, perintah-perintah akan dijalankan sebagai pengguna ini. Hal ini memastikan bahwa jika terjadi kesalahan, dampaknya hanya terbatas pada lingkungan kerja pengguna tersebut, bukan pada sistem secara keseluruhan.

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

# Jika mau menambahkan password
passwd lfs

# Agar user lfs bisa akses $LFS
chown -v lfs $LFS/{usr{,/*},var,etc,tools}
case $(uname -m) in
  x86_64) chown -v lfs $LFS/lib64 ;;
esac

Setup Environment

Kita ingin menyiapkan working environment yang bersih dan terkontrol untuk user lfs, agar proses build LFS (Linux From Scratch) nantinya tidak terganggu oleh environment variable atau konfigurasi yang ada di sistem host (OS utama). LAKUKAN SEMUA INI SAAT LOGIN DENGAN USER lfs

cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF
  1. cat > ~/.bash_profile << "EOF"
    • Ini artinya kita membuat atau overwrite file ~/.bash_profile dengan isi yang diketik sampai ketemu baris EOF
    • File .bash_profile ini akan dijalankan otomatis saat login shell aktif (misalnya saat su - lfs)
  2. exec env -i ... /bin/bash
    • exec: Mengganti shell yang sedang berjalan dengan perintah baru. Jadi shell awal akan diganti langsung dengan shell yang kita definisikan setelahnya (tidak menumpuk di atas shell lama).
    • env -i: Menjalankan perintah dengan lingkungan kosong (-i = ignore environment). Ini menghapus semua environment variable yang aktif. Tapi kita tambahkan tiga variable penting secara eksplisit:
      • HOME: supaya direktori home user tetap dikenali.
      • TERM: supaya terminal tetap tahu jenisnya (penting buat tampilan dan kemampuan seperti warna, scroll, dll).
      • PS1: prompt shell yang muncul (misalnya lfs:/home/lfs$), biar tetap enak dilihat.
  3. /bin/bash: shell yang kita jalankan: Bash.

Hasil Akhir

Saat user lfs login (atau su - lfs), file .bash_profile akan jalan dan:

  • Menghapus seluruh environment dari sistem host.
  • Menyiapkan shell Bash baru hanya dengan 3 variabel: HOME, TERM, dan PS1.
  • Shell jadi bersih, gak ada variabel aneh-aneh dari OS host.
  • Work environment jadi konsisten dan aman, terutama saat kompilasi LFS.

Why?

Karena kita sedang membangun sistem Linux dari awal (LFS), kita tidak ingin satupun konfigurasi atau environment dari OS host merusak atau mempengaruhi hasil build kita. Ini seperti memasak di dapur steril — biar hasilnya murni dan bisa diprediksi. Kalau ada environment dari host yang ikut masuk, bisa saja bikin tools build error, hasil kompilasi aneh, atau bahkan sistem tidak bisa boot nanti.

Setup .bashrc

cat > ~/.bashrc << "EOF"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
LFS_TGT=\$(uname -m)-lfs-linux-gnu
PATH=/usr/bin
if [ ! -L /bin ]; then PATH=/bin:\$PATH; fi
PATH=\$LFS/tools/bin:\$PATH
CONFIG_SITE=\$LFS/usr/share/config.site
export LFS LC_ALL LFS_TGT PATH CONFIG_SITE
EOF
  1. set +h
    • Menonaktifkan fitur "hashing" pada shell.
    • Biasanya, Bash akan mengingat lokasi (path) dari command yang pernah dipanggil agar lebih cepat dipanggil ulang. Tapi selama build, kita gak mau itu karena path bisa berubah-ubah.
  2. umask 022
    • Ini setting permission default saat buat file/direktori baru.
    • 022 artinya: file = 644 (rw-r--r--), direktori = 755 (rwxr-xr-x).
  3. LFS=/mnt/lfs
    • Path tempat filesystem LFS dibangun. Variabel ini penting, hampir semua langkah build pakai ini.
  4. LC_ALL=POSIX
    • Set locale ke standar POSIX supaya output perintah konsisten dan tidak dipengaruhi oleh setting lokal (misal, Bahasa Indonesia atau lainnya).
  5. LFS_TGT=$(uname -m)-lfs-linux-gnu
    • Ini nentuin target sistem untuk toolchain. Contoh: Di sistem x86_64, ini jadi: x86_64-lfs-linux-gnu.
  6. PATH=/usr/bin
    • Reset PATH dulu, lalu...
  7. if [ ! -L /bin ]; then PATH=/bin:$PATH; ficode
    • Tambahkan /bin ke PATH jika bin itu direktori biasa, bukan symlink.
    • Beberapa sistem modern (/bin itu symlink ke /usr/bin), jadi dicek dulu.
  8. PATH=$LFS/tools/bin:$PATH
    • Tambahkan tools dari direktori build LFS ke PATH. Ini bagian paling penting karena kita akan pakai compiler dan tools hasil build sendiri, bukan dari host system.
  9. CONFIG_SITE=$LFS/usr/share/config.site
    • File konfigurasi default untuk configure script (otomatis apply opsi tertentu saat compile software).
  10. export ...
    • Ekspor semua variabel ke environment, supaya bisa diakses semua perintah dan proses berikutnya.

SBU (Standard Build Unit)

SBU (Standard Build Unit) adalah satuan waktu yang digunakan LFS untuk menghitung perkiraan waktu compile suatu package. Hal ini diciptakan karena setiap orang build LFS di PC yang memiliki spesifikasi berbeda-beda (processor, RAM, SSD, dll). Oleh karena itu tidak ada patokan absolut seperti "20 menit", "1 jam", dll untuk semua orang.

Untuk menghitung SBU nanti kita akan mencompile binutils-pass1. Kita perlu mencatat berapa menit waktu compile menggunakan 1 core. Pasanglah compilenya selesai dalam 4 menit. Nilai 4 menit ini lah yang akan menjadi 1 SBU. Jadi kalau misal ada package yang estimasinya 4.5 SBU, maka berati perkiraan waktu build nya adalah 4.5 x 4 menit = 18 menit

Test Suite

Test Suite adalah kumpulan tes bawaan dari developer package untuk tes apakah hasil compile berfungsi dengan benar. Kalau tes nya lulus semua berati package berhasil dicompile dengan baik dan fungsing benar-benar jalan sesuai harapan. Walaupun lolos tes bukan berati jaminan bebas bug 100%

Test Suite Terpenting

Ada beberapa package yang tes-nya wajib dilakukan seperti GCC, glibc, dan binutils. Alasannya karena ketiga package ini adalah fondasi sistem. Tapi perlu dicatat tes package ini butuh waktu lama