Yazılım dünyasında çoğu zaman hazır paket yöneticilerine (apt, pacman), öntanımlı systemd servislerine ve dağıtımların sunduğu soyutlama katmanlarına alışırız. Ancak bir işletim sisteminin gerçekten nasıl nefes aldığını anlamanın tek bir kesin yolu vardır: Onu sıfırdan derlemek.
Bu yazıda; bir Linux çekirdeğinin (vmlinuz), çapraz derleme zincirinin (toolchain), C standart kütüphanesinin (glibc/musl) ve minimal bir kullanıcı alanının (user space) nasıl bir araya getirilerek bağımsız bir dağıtıma dönüştüğünü özetliyorum.
1. Çapraz Derleme Zinciri (Toolchain Isolation)
Kendi dağıtımınızı inşa ederken en büyük tehlike, üzerinde çalıştığınız "ana sistemin" (host system) kütüphanelerinin ve ikili dosyalarının yeni sisteme sızmasıdır (host pollution).
Bunu engellemek için üç aşamalı bir inşa disiplini uyguladım:
- Host-agnostic Toolchain: Ana sistemden tamamen bağımsız çalışan geçici bir
binutils,gccveglibcüçlüsü derlenir. - Chroot İzolasyonu: Oluşturulan geçici araç seti
/mnt/sysrootdizinine bağlanır vechrootile bu yalıtılmış ortama geçiş yapılır. - Nihai Sistem İkilileri: Yeni sistemin kendi derleyicisi ile tüm temel POSIX araçları (
coreutils,bash,sed,grep,make) sıfırdan derlenir.
2. Linux Çekirdeği Konfigürasyonu: Sıfır Fazlalık
Modern ana akım dağıtımlar (Ubuntu, Fedora vb.) dünya üzerindeki her türlü donanımı desteklemek zorunda oldukları için çekirdeklerinde binlerce modül barındırır. Bu durum açılış süresini uzatır ve bellek ayak izini büyütür.
Kendi çekirdeğimi derlerken izlediğim yaklaşım:
- Monolitik Sürücüler: Disk denetleyicileri (NVMe, SATA), temel dosya sistemleri (ext4, btrfs) çekirdeğin içine yerleşik (
=y) olarak gömüldü;initramfsihtiyacı tamamen ortadan kaldırıldı. - Gereksiz Katmanların Kapatılması: Eski donanım uyumlulukları, kullanılmayan ağ protokolleri ve telemetri kancaları kapatılarak çekirdek boyutu 8 MB seviyesine indirildi.
3. Paket Yönetimi ve Bağımlılık Ağaçları
Bir dağıtımı ayakta tutan en kritik bileşen paket yöneticisidir. Kendi dağıtımım için geliştirdiğim hafif paket mimarisinde şu kuralları benimsedim:
- Manifest Tabanlı Yapı: Her paket, derleme adımlarını (
build), bağımlılık listesini (deps) ve sağlama toplamını (sha256) içeren sade bir manifest dosyasıyla tanımlanır. - Kayıpsız Kaldırma (Atomic Tracking): Paketin sisteme yazdığı her dosya bir
db.localkütüğüne işlenir; böylece paket silindiğinde arkasında artık dosya bırakmaz. - Statik Bağımlılık Önceliği: Kritik kurtarma araçları statik kütüphanelerle derlenerek glibc güncellemelerinde sistemin kilitlenmesi engellenir.
4. Sonuç ve Çıkarılan Dersler
Bir Linux dağıtımını sıfırdan derlemek bana yazılımın donanımla buluştuğu noktadaki gerçek mimariyi öğretti:
- Soyutlamaların arkasında çalışan syscall (sistem çağrıları) mekanizmasını,
- Bellek yönetiminin sanal bellek sayfalarından çekirdek alanına akışını,
- POSIX uyumluluğunun ve minimalizmin modern yazılım geliştirme reflekslerine nasıl güç kattığını.
Bu bilgi birikimi; bugün hem BookOS projesinin çekirdek vizyonunda, hem de akıllı tahtalar ve sistem düzeyindeki diğer C++ projelerimde en büyük teknik dayanağım haline geldi.