Jump to content

LFS: Masuk chroot

From Haidhi Wiki
Revision as of 04:54, 17 April 2025 by SanzSkuy (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Sekarang setelah semua package penting untuk membangun tool yang dibutuhkan sudah terpasang di sistem, waktunya masuk ke chroot environment. Ini adalah langkah penting karena di sinilah kita akan benar-benar “hidup” di dalam sistem LFS yang baru—yang saat ini hanya berisi tool sementara hasil build sebelumnya. Tujuannya agar kita tidak lagi tergantung pada sistem host. Semua build selanjutnya—baik toolchain final, library, sampai aplikasi utama—akan dilakukan seolah-olah kita sedang menggunakan sistem LFS itu sendiri, bukan lagi sistem host.

chroot "$LFS" /usr/bin/env -i   \
    HOME=/root                  \
    TERM="$TERM"                \
    PS1='(lfs chroot) \u:\w\$ ' \
    PATH=/usr/bin:/usr/sbin     \
    MAKEFLAGS="-j$(nproc)"      \
    TESTSUITEFLAGS="-j$(nproc)" \
    /bin/bash --login

Directories

Buat Root-level directories

mkdir -pv /{boot,home,mnt,opt,srv}

Root-level subdirectories

mkdir -pv /etc/{opt,sysconfig}
mkdir -pv /lib/firmware
mkdir -pv /media/{floppy,cdrom}
mkdir -pv /usr/{,local/}{include,src}
mkdir -pv /usr/lib/locale
mkdir -pv /usr/local/{bin,lib,sbin}
mkdir -pv /usr/{,local/}share/{color,dict,doc,info,locale,man}
mkdir -pv /usr/{,local/}share/{misc,terminfo,zoneinfo}
mkdir -pv /usr/{,local/}share/man/man{1..8}
mkdir -pv /var/{cache,local,log,mail,opt,spool}
mkdir -pv /var/lib/{color,misc,locate}

ln -sfv /run /var/run
ln -sfv /run/lock /var/lock

install -dv -m 0750 /root
install -dv -m 1777 /tmp /var/tmp

Essential Files & Symlinks

Zaman dulu, Linux menyimpan daftar file system yang lagi di-mount di file biasa: /etc/mtab. Tapi sekarang, kernel Linux modern sudah lebih canggih — dia menyimpan info itu langsung di memori, dan memberi aksesnya ke user lewat virtual file system /proc, tepatnya di /proc/self/mounts. Masalahnya beberapa aplikasi atau utilitas lama masih mengira info mount itu ada di /etc/mtab. Agar tidak menyebabkan error dan tetap kompatibel, kita perlu membuat symbolic link dari /etc/mtab ke /proc/self/mounts.

ln -sv /proc/self/mounts /etc/mtab

lalu buat /etc/hosts

cat > /etc/hosts << "EOF"
127.0.0.1  localhost
::1        localhost
EOF

agar root bisa login dan dikenali sistem, buat file /etc/passwd dan /etc/group

cat > /etc/passwd << "EOF"
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/dev/null:/usr/bin/false
daemon:x:6:6:Daemon User:/dev/null:/usr/bin/false
messagebus:x:18:18:D-Bus Message Daemon User:/run/dbus:/usr/bin/false
uuidd:x:80:80:UUID Generation Daemon User:/dev/null:/usr/bin/false
nobody:x:65534:65534:Unprivileged User:/dev/null:/usr/bin/false
EOF

cat > /etc/group << "EOF"
root:x:0:
bin:x:1:daemon
sys:x:2:
kmem:x:3:
tape:x:4:
tty: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:
cdrom:x:15:
adm:x:16:
messagebus:x:18:
input:x:24:
mail:x:34:
kvm:x:61:
uuidd:x:80:
wheel:x:97:
users:x:999:
nogroup:x:65534:
EOF

Grup-grup yang dibuat saat setup LFS tidak berasal dari standar resmi, melainkan hasil kompromi antara kebutuhan praktis dari konfigurasi seperti Udev (pengelola device nodes di /dev), dan kebiasaan umum dari banyak distro Linux. Sebagian test suite dan program juga kadang mengharapkan adanya grup atau user tertentu agar bisa berjalan dengan benar. Maka dibuatlah grup-grup seperti tty, audio, disk, nogroup, dan sebagainya. Meski begitu:

  • Satu-satunya grup yang direkomendasikan oleh standar LSB (Linux Standard Base) adalah:
    • root (GID: 0)
    • bin (GID: 1)
  • GID 5 banyak digunakan untuk grup tty dan juga digunakan dalam mounting devpts (yang dipakai untuk terminal virtual).
  • GID 65534 (alias user ID dan group ID 65534) dipakai oleh kernel untuk user dan grup yang "tidak dikenal" secara lokal, terutama dalam konteks NFS atau user namespace. Di LFS, kita beri nama nobody/nogroup agar ID ini tidak menggantung tanpa identitas.
  • Di sistem yang kompleks, GID dan UID yang tidak diberi nama bisa menyebabkan masalah seperti error permission yang sulit dilacak.
echo "tester:x:101:101::/home/tester:/bin/bash" >> /etc/passwd
echo "tester:x:101:" >> /etc/group
install -o tester -d /home/tester

untuk menghapus prompt 'I have no name!'

exec /usr/bin/bash --login

Beberapa program penting seperti login, agetty, dan init membutuhkan file log tertentu untuk mencatat aktivitas sistem, misalnya siapa yang login dan kapan login terjadi. File-file log ini tidak akan dibuat otomatis oleh program-program tersebut—jadi, harus diinisialisasi terlebih dahulu secara manual saat setup sistem baru seperti Linux From Scratch (LFS).

touch /var/log/{btmp,lastlog,faillog,wtmp}
chgrp -v utmp /var/log/lastlog
chmod -v 664  /var/log/lastlog
chmod -v 600  /var/log/btmp

Temporary Tools

gettext-0.24

./configure --disable-shared
make
cp -v gettext-tools/src/{msgfmt,msgmerge,xgettext} /usr/bin

bison-3.8.2

./configure --prefix=/usr \
            --docdir=/usr/share/doc/bison-3.8.2
make
make install

perl-5.40.2

sh Configure -des                                         \
             -D prefix=/usr                               \
             -D vendorprefix=/usr                         \
             -D useshrplib                                \
             -D privlib=/usr/lib/perl5/5.40/core_perl     \
             -D archlib=/usr/lib/perl5/5.40/core_perl     \
             -D sitelib=/usr/lib/perl5/5.40/site_perl     \
             -D sitearch=/usr/lib/perl5/5.40/site_perl    \
             -D vendorlib=/usr/lib/perl5/5.40/vendor_perl \
             -D vendorarch=/usr/lib/perl5/5.40/vendor_perl

make
make install

python-3.13.3

./configure --prefix=/usr   \
            --enable-shared \
            --without-ensurepip

make
make install

texinfo-7.2

./configure --prefix=/usr
make
make install

util-linux-2.41

mkdir -pv /var/lib/hwclock

./configure --libdir=/usr/lib     \
            --runstatedir=/run    \
            --disable-chfn-chsh   \
            --disable-login       \
            --disable-nologin     \
            --disable-su          \
            --disable-setpriv     \
            --disable-runuser     \
            --disable-pylibmount  \
            --disable-static      \
            --disable-liblastlog2 \
            --without-python      \
            ADJTIME_PATH=/var/lib/hwclock/adjtime \
            --docdir=/usr/share/doc/util-linux-2.41

make
make install

Cleaning & Backup

Delete documentations files

rm -rf /usr/share/{info,man,doc}/*

Delete .la files. File ini tidak dibutuhkan di Linux modern

find /usr/{lib,libexec} -name \*.la -delete

delete folder /tools, folder ini sudah tidak dibutuhkan

rm -rf /tools

Backup

Pertama-tama keluar dulu dari chroot dengan command exit lalu buat lagi variable $LFS dengan export LFS=/mnt/lfs Setelah itu unmnout virtual file systems

mountpoint -q $LFS/dev/shm && umount $LFS/dev/shm
umount $LFS/dev/pts
umount $LFS/{sys,proc,run,dev}

Buat Backup

cd $LFS
tar -cJpf $HOME/lfs-temp-tools-r12.3-36.tar.xz .

Restore

Kalau mau restore jika ada kesalahan pada tahap-tahap berikutnya. Ingat, jangan asal pakai rm -rf cd $LFS rm -rf ./* tar -xpf $HOME/lfs-temp-tools-r12.3-36.tar.xz