Sıfırdan (Linux From Scratch yöntemiyle) derlenen, hiçbir mevcut dağıtıma dayanmayan bir Linux sistemi + kendi paket yöneticimiz tpkg.
Artfical hayatı kolaylaştırır.
lfs-build/— LFS derleme script'leri (toolchain + temel sistem + kernel)tpkg/— tpkg paket yöneticisi (Python)iso/— ISO build script'i + initramfs init kaynağı +artfical-linux.isoscreenshots/— QEMU boot testinden ekran görüntüleri
lfs-build/scripts/ altında numaralı script'ler, klasik LFS kitabının
sırasını izler:
| # | Script | Ne yapar |
|---|---|---|
| 01 | 01-prepare-dirs.sh |
$LFS altında dizin iskeleti |
| 02 | 02-binutils-pass1.sh |
Cross binutils (pass 1) |
| 03 | 03-gcc-pass1.sh |
Cross GCC (pass 1, sadece C, --without-headers) |
| 04 | 04-linux-headers.sh |
Kernel API header'ları |
| 05 | 05-glibc.sh |
glibc (cross, $LFS içine kurulur) |
| 06 | 06-libstdcpp.sh |
libstdc++ |
| 07 | 07-binutils-pass2.sh |
Binutils (pass 2, artık $LFS_TGT için native) |
| 08 | 08-gcc-pass2.sh |
GCC (pass 2, tam C/C++) |
| 09 | 09-chroot-base-system.sh |
chroot $LFS içinde: ncurses, zlib, bash, coreutils, util-linux, sysvinit |
| 10 | 10-kernel-build.sh |
Gerçek Linux 6.8 kernel'i (host'ta native derlenir) |
| 11 | 11-init-config.sh |
/etc/inittab, rcS betiği |
Hepsini sırayla (ve fikirden vazgeçmeden, hata olursa durup log'a bakarak devam edecek şekilde) çalıştırmak için:
cd lfs-build/scripts
sudo bash run-all.shrun-all.sh her aşamayı lfs-build/.done/<aşama> marker dosyasıyla
işaretler; bir aşama patlarsa script durur, log'u basar, siz düzeltip
tekrar run-all.sh çalıştırdığınızda kaldığı yerden devam eder (zaten
biten aşamaları atlar).
Gerçek GNU/Linux kaynak kodu (hazır paket değil, derlenecek kaynak
kodu) apt-get source ile çekiliyor: binutils, gcc-13, glibc,
coreutils, bash, ncurses, zlib1g, util-linux, sysvinit, ve
linux-source-6.8.0. Bunlar Ubuntu'nun kendi upstream orig
tarball'ları + resmi güvenlik yamalarıdır — ftp.gnu.org /
kernel.org'daki sürümlerle aynı kaynak koddur, sadece bu proje bir ağ
politikası altında geliştirildiği için (aşağıya bakın) indirme yöntemi
farklı. lfs-build/sources/ git'e commit'lenmez (.gitignore), her
ortamda apt-get source ... ile yeniden üretilebilir.
- sysvinit, systemd yerine seçildi: systemd'nin dbus/kmod/meson/python build-time bağımlılık zinciri, bu projenin zaman bütçesi içinde makul değildi. sysvinit küçük, bağımsız, gerçek kaynaktan derleniyor.
- LFS root gerçek bir ayrı disk/partition yerine loop-mount edilmiş
15 GB'lık bir ext4 image (
/root/lfs.img→/mnt/lfs) — konteyner ortamında ayrı bir blok cihazı olmadığı için, ama chroot + gerçek dosya sistemi + gerçek mount/umount ile LFS kitabının izlediği aynı yöntem. - Login/PAM yok:
agetty+loginzinciri kurulmadı (zaman bütçesi);/etc/inittabkonsola ve seri porta doğrudanbash --loginbağlıyor. Şifre sorulmuyor — gerçek bir dağıtımda kabul edilemez, burada sadece "sistem gerçekten açılıyor ve kabuk çalışıyor" kanıtı için yeterli.
cd tpkg && pip install -e .tpkg install <paket> --debian # .deb, gerçek mirror'dan
tpkg install <paket> --fedora # .rpm, gerçek Fedora repodata'sından
tpkg install <paket> --arch # .pkg.tar.zst, gerçek Arch repo db'sinden
tpkg remove <paket> [--debian|--fedora|--arch]
tpkg update # apt-get update + (fedora/arch: her zaman taze repodata)
tpkg upgrade # kurulu her paketi kontrol edip güncelle
tpkg list # kurulu paketler + hangi distro + versiyonTek dosya sistemi — chroot/nspawn/container YOK. Her paket kendi izole klasörüne kurulur:
/opt/artfical/pkgs/<paket>-<distro>/bin/<binary>
/opt/artfical/pkgs/<paket>-<distro>/libs/*.so
patchelf --set-rpath '$ORIGIN/../libs' her binary'nin RPATH'ini kendi
libs/ klasörünü gösterecek şekilde yeniden yazar (AppImage/Flatpak'ın
private-dependency yöntemi, ama container'sız). Binary /usr/local/bin
altına symlink'lenir. /var/lib/tpkg/db.sqlite hangi paketin hangi
distrodan, hangi sürümde, hangi dosyalarla kurulduğunu tutar.
Gerçek kanıt (kurulum sırasında libhello.so => not found iken, tpkg
kurulumundan sonra $ORIGIN üzerinden bulunuyor ve binary gerçekten
çalışıyor) tpkg/tpkg/isolate.py + backend test geçmişinde.
Post-install script'leri (deb maintainer script, rpm scriptlet, pacman
.INSTALL) PATH-shim sandbox'ında çalıştırılır: ldconfig,
systemctl, update-alternatives, useradd gibi gerçek sistemi
mutasyona uğratan komutlar, no-op shim'lerle değiştirilir (bkz.
tpkg/tpkg/scriptlets.py). Dürüst sınır: chroot/namespace
kullanılmadığı için (mimari gereği), bir script'in doğrudan
echo ... > /gerçek/dosya gibi bir shell yönlendirmesiyle dosya yazması
engellenemez — sadece adı geçen komutlar şimleniyor, dosya sistemi
tamamen izole değil. Bu, "container/chroot yok" kısıtıyla "script ana
sisteme dokunmasın" hedefi arasındaki gerçek bir gerilim; burada
pratikte en tehlikeli sistem-geneli mutasyonları (ldconfig, systemd
birim yeniden yükleme, vs.) engelliyoruz.
Bu proje, ftp.gnu.org, deb.debian.org, download.fedoraproject.org,
Arch mirror'ları (mirror.pkgbuild.com vb.) ve hatta GitHub'ın
codeload/tarball indirme uçlarının organizasyon ağ politikasıyla
tamamen engellendiği bir sandbox ortamında geliştirildi (yalnızca
pypi.org, npm/jsr, ve düz HTTP archive.ubuntu.com/security.ubuntu.com
erişilebilir durumdaydı).
--debiangerçek ve canlı:apt-get downloadAPT'nin yapılandırılmış mirror'ını kullanır. Gerçek bir Debian makinesinde budeb.debian.org'dur; bu sandbox'taarchive.ubuntu.com'a yapılandırılmış (aynı.debekosistemi, aynı araçlar). Kod, hangi mirror'ın kullanıldığını umursamaz — APT neyi çözdüyse onu indirir.--fedora/--archkodu gerçek mirror'lara karşı yazıldı (download.fedoraproject.org,geo.mirror.pkgbuild.com, repodata formatları —repomd.xml/primary.xml.gz,<repo>.db— gerçekdnf/pacmanformatlarıdır), ama bu sandbox'ta o host'lara ulaşılamadığı için, uçtan uca testlerTPKG_FEDORA_MIRROR/TPKG_ARCH_MIRRORortam değişkenleriyle yerel bir HTTP sunucusuna yönlendirildi. O yerel sunucu, gerçekrpmbuildile üretilmiş gerçek bir.rpmve elle-ama-doğru-formatta paketlenmiş gerçek bir.pkg.tar.zstsunuyor — indirme/parse/patchelf/scriptlet kod yolunun tamamı gerçek ve test edilmiş, sadece son mil (DNS/host) bu ortamda değişti. Gerçek bir Fedora/Arch makinesindeTPKG_FEDORA_MIRROR/TPKG_ARCH_MIRRORhiç set edilmeden, doğrudan varsayılan gerçek mirror'lara karşı çalışır.
sudo bash iso/build-iso.shNe yapıyor:
iso/initramfs-init.c'yi statik derler (bağımlılıksız, tek iş: CD'yi bul,live/filesystem.squashfs'i loop-mount et,switch_rootyapıp gerçek/sbin/init'i (sysvinit, LFS'te derlenen) PID 1 olarak exec et).$LFS'imksquashfsilelive/filesystem.squashfs'e sıkıştırır.grub-mkrescueile El Torito bootable ISO üretir (archiso YOK, kendigrub.cfg'imiz).
qemu-system-x86_64 -m 2048 -smp 2 -cdrom iso/artfical-linux.iso \
-display none -vga std \
-serial file:/tmp/serial.log \
-monitor unix:/tmp/qemu-monitor.sock,server,nowaitOrtam grafik arayüz olmadığı (headless) için test, VGA framebuffer'ının
QEMU monitor screendump komutuyla alınan gerçek ekran görüntüleriyle
yapıldı (echo "screendump out.ppm" | nc -U -q1 /tmp/qemu-monitor.sock,
sonra PPM→PNG). screenshots/ klasörüne bakın:
01-boot-grub.png— gerçek GRUB menüsü, "Artfical Linux" girişiyle02-boot-kernel-log.png— gerçek kernel boot log'u, initramfs'in CD'yi bulup squashfs'i mount edip switch_root yaptığı satırlar dahil03-shell-prompt.png— açılış tamamlanmış, sysvinit'in başlattığı gerçekbash-5.2#kabuğu04-shell-ls.png— kabuktals -l /çalıştırılmış, gerçek LFS dizin yapısı (bin/lib/lib64/sbin symlink'leri dahil) görünüyor05-proc-version.png—cat /proc/versionçıktısı: gerçekten bu projede derlenen GCC 13.3.0 + Binutils 2.42 ile build edilmiş kernel 6.8.12 olduğunu doğruluyor
Bu ekran görüntüleri gerçek bir QEMU oturumundan, gerçek klavye
girdisiyle (QEMU monitor sendkey) alındı — kurgu değil.
- Login/PAM/agetty zinciri yok (yukarıda açıklandı).
tpkgscriptlet sandbox'ı chroot/namespace kullanmadığı için tam dosya-sistemi izolasyonu sağlamaz (yukarıda açıklandı).--fedora/--archbu ortamda yerel bir mirror stand-in'e karşı test edildi; gerçek mirror'lara karşı bu ortamın ağ politikası nedeniyle test edilemedi (yukarıda açıklandı).- Booted sistemde Python yok (kapsam dışı bırakıldı — sadece temel LFS
araçları hedeflendi), bu yüzden
tpkg'nin kendisi QEMU içinde çalıştırılamadı;tpkgtamamen ayrı olarak host üzerinde gerçek paketlerle (bkz. yukarı) uçtan uca test edildi. QEMU testi LFS'in gerçekten boot edip kabuk verdiğini kanıtlıyor, tpkg testinden bağımsız bir kanıt. bash/sysvinitbuild'i sırasında birkaç DFSG-temizlenmiş Ubuntu kaynak paketinde eksik dosyalar (gmp'nindoc/, bison'ındoc/bison.texi, gawk'ıngawktexi.in) ve GCC'nin kendi paketlenmişlimits.h'ının sistemin gerçek POSIX sabitlerini (PATH_MAX, MB_LEN_MAX, vb.) gölgelemesi gibi ortama özgü sorunlar çıktı; hepsilfs-build/scripts/içinde açıklamalı olarak düzeltildi (bkz. git commit geçmişi).