LFS: Final Preparation: Difference between revisions
Created page with "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. <syntaxhighlight lang=bash> mkdir -pv $LFS/{etc,var} $LFS/usr/{bin,lib,sbin} for i in bin lib sbin; do ln -sv usr/$i $LFS/$i done..." |
No edit summary |
||
| (8 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
= 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. | 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 == | |||
<syntaxhighlight lang=bash> | <syntaxhighlight lang=bash> | ||
mkdir -pv $LFS/{etc,var} $LFS/usr/{bin,lib,sbin} | mkdir -pv $LFS/{etc,var} $LFS/usr/{bin,lib,sbin} | ||
</syntaxhighlight> | |||
*<code>mkdir -pv</code>: Perintah ini digunakan untuk membuat direktori, dengan opsi <code>-p</code> untuk membuat direktori beserta subdirektorinya jika belum ada, dan <code>-v</code> untuk menampilkan pesan yang menunjukkan apa yang sedang dibuat. | |||
*<code>$LFS/{etc,var}</code>: Membuat direktori <code>etc</code> dan <code>var</code> di dalam direktori yang ditentukan oleh variabel <code>$LFS</code> | |||
*<code>$LFS/usr/{bin,lib,sbin}</code>: Membuat direktori <code>bin</code>, <code>lib</code>, dan <code>sbin</code> di dalam direktori <code>usr</code>, di bawah <code>$LFS</code> | |||
== Membuat Symlink == | |||
<syntaxhighlight lang=bash> | |||
for i in bin lib sbin; do | for i in bin lib sbin; do | ||
ln -sv usr/$i $LFS/$i | ln -sv usr/$i $LFS/$i | ||
done | done | ||
</syntaxhighlight> | |||
*<code>for i in bin lib sbin; do ... done</code>: Ini adalah loop for yang akan mengulang perintah untuk masing-masing item (<code>bin</code>, <code>lib</code>, <code>sbin</code>) | |||
*<code>ln -sv usr/$i $LFS/$i</code>: Untuk setiap direktori (<code>bin</code>, <code>lib</code>, <code>sbin</code>), perintah ini membuat symlink (link simbolik) dari <code>$LFS/usr/$i</code> ke <code>$LFS/$i</code>. Ini berarti direktori <code>bin</code>, <code>lib</code>, <code>sbin</code> yang ada di dalam direktori usr akan disimbolkan ke direktori yang lebih umum di <code>$LFS</code>. Tujuannya adalah untuk mempermudah pengelolaan file sistem dan memisahkan direktori berdasarkan fungsi mereka. | |||
== Membuat Direktori lib64 untuk Arsitektur x86_64 == | |||
<syntaxhighlight lang=bash> | |||
case $(uname -m) in | case $(uname -m) in | ||
x86_64) mkdir -pv $LFS/lib64 ;; | x86_64) mkdir -pv $LFS/lib64 ;; | ||
esac | esac | ||
</syntaxhighlight> | </syntaxhighlight> | ||
*<code>uname -m</code>: Perintah ini digunakan untuk mendapatkan arsitektur mesin saat ini. Jika arsitektur sistem adalah x86_64 (yaitu, 64-bit), maka perintah berikut akan dijalankan. | |||
*<code>mkdir -pv $LFS/lib64</code>: Jika sistem menggunakan arsitektur x86_64, maka direktori <code>lib64</code> akan dibuat di dalam direktori <code>$LFS</code>. Direktori lib64 digunakan pada sistem 64-bit untuk menyimpan pustaka (library) 64-bit, yang terpisah dari pustaka 32-bit yang disimpan di <code>lib</code>. | |||
Lalu kita akan membuat folder lagi untuk menyimpan program yang dicompile menggunakan ''cross-compiler'' | Lalu kita akan membuat folder lagi untuk menyimpan program yang dicompile menggunakan ''cross-compiler'' | ||
| Line 17: | Line 34: | ||
mkdir -pv $LFS/tools | mkdir -pv $LFS/tools | ||
</syntaxhighlight> | </syntaxhighlight> | ||
= 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. | |||
<syntaxhighlight lang=bash> | |||
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 | |||
</syntaxhighlight> | |||
= 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''' | |||
<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 .bashrc == | |||
<syntaxhighlight lang=bash> | |||
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 | |||
</syntaxhighlight> | |||
#<code>set +h</code> | |||
#*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. | |||
#<code>umask 022</code> | |||
#*Ini setting permission default saat buat file/direktori baru. | |||
#*022 artinya: file = 644 (rw-r--r--), direktori = 755 (rwxr-xr-x). | |||
#<code>LFS=/mnt/lfs</code> | |||
#*Path tempat filesystem LFS dibangun. Variabel ini penting, hampir semua langkah build pakai ini. | |||
#<code>LC_ALL=POSIX</code> | |||
#*Set locale ke standar POSIX supaya output perintah konsisten dan tidak dipengaruhi oleh setting lokal (misal, Bahasa Indonesia atau lainnya). | |||
#<code>LFS_TGT=$(uname -m)-lfs-linux-gnu</code> | |||
#*Ini nentuin target sistem untuk toolchain. Contoh: Di sistem x86_64, ini jadi: x86_64-lfs-linux-gnu. | |||
#<code>PATH=/usr/bin</code> | |||
#*Reset PATH dulu, lalu... | |||
#<code>if [ ! -L /bin ]; then PATH=/bin:$PATH; ficode</code> | |||
#*Tambahkan <code>/bin</code> ke <code>PATH</code> jika <code>bin</code> itu direktori biasa, bukan symlink. | |||
#*Beberapa sistem modern (<code>/bin</code> itu symlink ke <code>/usr/bin</code>), jadi dicek dulu. | |||
#<code>PATH=$LFS/tools/bin:$PATH</code> | |||
#*Tambahkan tools dari direktori build <code>LFS</code> ke <code>PATH</code>. Ini bagian paling penting karena kita akan pakai compiler dan tools hasil build sendiri, bukan dari host system. | |||
#<code>CONFIG_SITE=$LFS/usr/share/config.site</code> | |||
#*File konfigurasi default untuk configure script (otomatis apply opsi tertentu saat compile software). | |||
#<code>export ...</code> | |||
#*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 <code>binutils-pass1</code>. 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 <code>4.5 x 4 menit = 18 menit</code> | |||
= 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 <code>GCC</code>, <code>glibc</code>, dan <code>binutils</code>. Alasannya karena ketiga package ini adalah fondasi sistem. Tapi perlu dicatat tes package ini butuh waktu lama | |||
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-puntuk membuat direktori beserta subdirektorinya jika belum ada, dan-vuntuk menampilkan pesan yang menunjukkan apa yang sedang dibuat.$LFS/{etc,var}: Membuat direktorietcdanvardi dalam direktori yang ditentukan oleh variabel$LFS$LFS/usr/{bin,lib,sbin}: Membuat direktoribin,lib, dansbindi dalam direktoriusr, 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/$ike$LFS/$i. Ini berarti direktoribin,lib,sbinyang 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 direktorilib64akan 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 dilib.
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
cat > ~/.bash_profile << "EOF"- Ini artinya kita membuat atau overwrite file
~/.bash_profiledengan isi yang diketik sampai ketemu baris EOF - File
.bash_profileini akan dijalankan otomatis saat login shell aktif (misalnya saatsu - lfs)
- Ini artinya kita membuat atau overwrite file
exec env -i ... /bin/bashexec: 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.
/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, danPS1. - 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
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.
umask 022- Ini setting permission default saat buat file/direktori baru.
- 022 artinya: file = 644 (rw-r--r--), direktori = 755 (rwxr-xr-x).
LFS=/mnt/lfs- Path tempat filesystem LFS dibangun. Variabel ini penting, hampir semua langkah build pakai ini.
LC_ALL=POSIX- Set locale ke standar POSIX supaya output perintah konsisten dan tidak dipengaruhi oleh setting lokal (misal, Bahasa Indonesia atau lainnya).
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.
PATH=/usr/bin- Reset PATH dulu, lalu...
if [ ! -L /bin ]; then PATH=/bin:$PATH; ficode- Tambahkan
/binkePATHjikabinitu direktori biasa, bukan symlink. - Beberapa sistem modern (
/binitu symlink ke/usr/bin), jadi dicek dulu.
- Tambahkan
PATH=$LFS/tools/bin:$PATH- Tambahkan tools dari direktori build
LFSkePATH. Ini bagian paling penting karena kita akan pakai compiler dan tools hasil build sendiri, bukan dari host system.
- Tambahkan tools dari direktori build
CONFIG_SITE=$LFS/usr/share/config.site- File konfigurasi default untuk configure script (otomatis apply opsi tertentu saat compile software).
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