Skip to content

Latest commit

 

History

32 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Artfical Linux

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.

İçindekiler

  • 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.iso
  • screenshots/ — QEMU boot testinden ekran görüntüleri

1. LFS ile temel sistem derlemesi

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.sh

run-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).

Kaynak kod nereden geliyor?

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.

Mimari kararlar

  • 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+login zinciri kurulmadı (zaman bütçesi); /etc/inittab konsola ve seri porta doğrudan bash --login bağ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.

2. tpkg — paket yöneticisi

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 + versiyon

Mimari

Tek 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.

Ağ politikası nedeniyle yapılan ikame (önemli, dürüstçe belirtilmeli)

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ı).

  • --debian gerçek ve canlı: apt-get download APT'nin yapılandırılmış mirror'ını kullanır. Gerçek bir Debian makinesinde bu deb.debian.org'dur; bu sandbox'ta archive.ubuntu.com'a yapılandırılmış (aynı .deb ekosistemi, aynı araçlar). Kod, hangi mirror'ın kullanıldığını umursamaz — APT neyi çözdüyse onu indirir.
  • --fedora / --arch kodu gerçek mirror'lara karşı yazıldı (download.fedoraproject.org, geo.mirror.pkgbuild.com, repodata formatları — repomd.xml/primary.xml.gz, <repo>.db — gerçek dnf/pacman formatlarıdır), ama bu sandbox'ta o host'lara ulaşılamadığı için, uçtan uca testler TPKG_FEDORA_MIRROR / TPKG_ARCH_MIRROR ortam değişkenleriyle yerel bir HTTP sunucusuna yönlendirildi. O yerel sunucu, gerçek rpmbuild ile üretilmiş gerçek bir .rpm ve elle-ama-doğru-formatta paketlenmiş gerçek bir .pkg.tar.zst sunuyor — 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 makinesinde TPKG_FEDORA_MIRROR/ TPKG_ARCH_MIRROR hiç set edilmeden, doğrudan varsayılan gerçek mirror'lara karşı çalışır.

3. ISO oluşturma

sudo bash iso/build-iso.sh

Ne yapıyor:

  1. 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_root yapıp gerçek /sbin/init'i (sysvinit, LFS'te derlenen) PID 1 olarak exec et).
  2. $LFS'i mksquashfs ile live/filesystem.squashfs'e sıkıştırır.
  3. grub-mkrescue ile El Torito bootable ISO üretir (archiso YOK, kendi grub.cfg'imiz).

4. QEMU testi

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,nowait

Ortam 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şiyle
  • 02-boot-kernel-log.png — gerçek kernel boot log'u, initramfs'in CD'yi bulup squashfs'i mount edip switch_root yaptığı satırlar dahil
  • 03-shell-prompt.png — açılış tamamlanmış, sysvinit'in başlattığı gerçek bash-5.2# kabuğu
  • 04-shell-ls.png — kabukta ls -l / çalıştırılmış, gerçek LFS dizin yapısı (bin/lib/lib64/sbin symlink'leri dahil) görünüyor
  • 05-proc-version.pngcat /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.

Bilinen sınırlamalar

  • Login/PAM/agetty zinciri yok (yukarıda açıklandı).
  • tpkg scriptlet sandbox'ı chroot/namespace kullanmadığı için tam dosya-sistemi izolasyonu sağlamaz (yukarıda açıklandı).
  • --fedora/--arch bu 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ı; tpkg tamamen 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/sysvinit build'i sırasında birkaç DFSG-temizlenmiş Ubuntu kaynak paketinde eksik dosyalar (gmp'nin doc/, bison'ın doc/bison.texi, gawk'ın gawktexi.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ı; hepsi lfs-build/scripts/ içinde açıklamalı olarak düzeltildi (bkz. git commit geçmişi).

About

Artfical

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages