Skip to content
ArtficalPublic

About

Artfical

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

32 Commits

Folders and files

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

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