4 puan yazan GN⁺ 2025-10-27 | 1 yorum | WhatsApp'ta paylaş
  • Linux çekirdeğini doğrudan derleyip asgari bir kullanıcı alanı kurarak bir “mikro Linux dağıtımı” oluşturma sürecini adım adım anlatıyor
  • İşletim sistemi çekirdeğinin rolünü, Linux dağıtımının bileşenlerini ve çekirdek ile kullanıcı alanı arasındaki ilişkiyi temelden ele alıyor
  • Örnek olarak RISC-V mimarisini (QEMU’nun riscv64 virt makinesi) kullanıyor, ancak aynı ilkelerin x86 gibi diğer mimarilere de uygulanabileceğini gösteriyor
  • init süreci, initramfs ve Go ile yazılmış basit bir kabuk içeren doğrudan çalıştırılabilir asgari bir Linux ortamı kuruyor
  • Son olarak u-root projesini kullanarak gerçekte faydalı bir mikro dağıtım yapma yöntemini tanıtıyor ve bunu Linux sistem yapısının genelini anlamaya yardımcı olan bir başlangıç kılavuzu olarak tamamlıyor

İşletim sistemi çekirdeği nedir

  • Çekirdek, donanım kaynaklarını yönetmekten ve programların çalışmasını denetlemekten sorumlu işletim sisteminin temel bileşenidir
    • Tek çekirdekli bir ortamda bile birden fazla program aynı anda çalışıyormuş gibi görünmesini sağlayan çoklu görev yönetimi sunar
  • Çekirdek, giriş/çıkış aygıtı denetimini soyutlar; böylece uygulamaların donanımın ayrıntılı adresleri veya yazmaç değerleriyle doğrudan uğraşmasına gerek kalmaz
    • Örneğin bir program yalnızca “standart çıktıya mesaj yaz” isteğinde bulunur; gerçek donanım etkileşimini çekirdek yürütür
  • Dosya sistemi arayüzü üzerinden yüksek seviyeli veri erişimi sağlar
    • Dosya, yalnızca disk verisi değil; çekirdekle iletişim kuran mantıksal bir arayüz olarak çalışır
  • Çekirdek, süreçler arası yalıtım ve iletişim modeli sağlayarak her uygulamanın bağımsız çalışmasına ya da iş birliği yapmasına olanak tanır
  • Linux çekirdeği açık kaynaktır, çeşitli mimarilerde çalışabilir ve dünya genelinde en yaygın kullanılan çekirdeklerden biridir

Linux dağıtımı nedir

  • Yalnızca Linux çekirdeği, kullanıcının bir web tarayıcısı ya da GUI uygulaması çalıştırmasına yetmez; çekirdeğin üzerinde çeşitli yazılım katmanlarından oluşan bir altyapı gerekir
  • Ağ yapılandırması, IP atama, VPN yönetimi gibi işler çekirdeğin değil, üst katmandaki kullanıcı alanı programlarının sorumluluğundadır
  • Bu nedenle Linux dağıtımı, çekirdek + kullanıcı alanı altyapısının birleşimi olarak tanımlanır
  • Dağıtım; çekirdeğin sunduğu temel işlevlerin üzerine paketler, araçlar, yapılandırmalar ve başlatma süreci (init) ekler
  • Dağıtımların karmaşıklığı değişkendir; Arch Linux gibi asgari yapıdan Ubuntu gibi kullanıcı dostu yapılara kadar uzanır

Çekirdek dışındaki altyapı: kullanıcı alanı ve init süreci

  • Çekirdek önyüklemeyi tamamladıktan sonra ilk olarak PID 1 olan init sürecini çalıştırır
    • init, sonrasında gelen tüm kullanıcı alanı süreçlerinin atasıdır ve sistem servisleriyle araçları sırayla başlatır
  • init tarafından çalıştırılan çeşitli süreç ve araçların bütünü, Linux dağıtımının fiilî bileşenlerini oluşturur
  • Dağıtım karmaşıklaştıkça gereksiz işlevler birikip “bloated” olduğu yönünde eleştiri alabilir
  • Buna karşılık, özel bir mikro dağıtım yaparak yalnızca gerekli işlevleri içeren hafif bir sistem kurulabilir

RISC-V için Linux çekirdeği derlemek

  • x86 ortamında çapraz derleme araç zinciri kullanılarak RISC-V için çekirdek derlenir
    • kernel.org üzerinden linux-6.5.2.tar.xz kaynak kodu indirilip make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- defconfig çalıştırılır
  • menuconfig ile çekirdek ayarları görsel olarak düzenlenebilir
  • make -j16 ile paralel derleme yapıldıktan sonra arch/riscv/boot/Image üretilir
  • QEMU’da qemu-system-riscv64 -machine virt -kernel arch/riscv/boot/Image ile önyüklenir
    • Önyükleme günlüğünde SBI katmanının algılanması, UART başlatma ve printk etkinleştirme gibi mesajlar görülebilir

İlk engel: kök dosya sistemi yok

  • Çekirdek önyüklemesi sırasında VFS: Unable to mount root fs hatasıyla kernel panic oluşur
    • Neden: kök dosya sistemi (initramfs) sağlanmamıştır
  • Dosya sistemi yalnızca disk üzerinde değil, RAM tabanlı (initramfs) olarak da kurulabilir
  • initramfs, cpio biçiminde paketlenir ve QEMU’da -initrd seçeneğiyle yüklenebilir

initramfs kurmak ve “Hello world” çalıştırmak

  • Asgari gereksinim, /init ikilisinin bulunmasıdır
    • init.c yazıldıktan sonra statik bağlama (-static) ile derlenir
    • cpio -o -H newc < file_list.txt > initramfs.cpio ile paketlenir
  • QEMU çalıştırıldığında “Hello world” yazdırılır, ancak init sonlandığı için yeniden kernel panic oluşur
    • Çözüm: init’in çıkmaması için sonsuz döngü eklemek

Go ile yazılmış basit bir kabuk eklemek

  • init, fork ve execl kullanarak /little_shell çalıştırır
  • little_shell.go, kullanıcı girdisini alıp komutu ekrana geri yazan basit bir kabuktur
    • RISC-V için GOOS=linux GOARCH=riscv64 go build little_shell.go ile derlenir
  • Hem init hem de little_shell, çıktıyı UART üzerinden paylaşır
    • Standart giriş/çıkış dosya tanıtıcılarıyla yönetilir ve fork sırasında miras alınır
  • Sonuç olarak “Hello from init” ile kabuk girdisinin dönüşümlü çıktığı temel bir Linux ortamı tamamlanır

Çekirdeğin rolünün özeti

  • Donanım soyutlama: kullanıcı programları UART’ı veya aygıt ayrıntılarını bilmeden çıktı üretebilir
  • Yüksek seviyeli arayüz sağlama: dosya sistemi üzerinden başka ikililere (little_shell) erişim sağlanır
  • Süreç yalıtımı: init ve kabuk bağımsız bellek alanlarında çalışır
  • Çekirdek, karmaşık donanım üzerinde kararlı ve taşınabilir bir çalışma temeli sunar

İşletim sisteminin tanımı

  • Kimi zaman yalnızca çekirdek işletim sistemi sayılır, kimi zaman da dağıtımın bütünü işletim sistemi olarak görülür
  • Asıl önemli olan, çekirdek ile kullanıcı alanı arasındaki rol sınırlarını ve etkileşim yapısını anlamaktır

u-root ile gerçekten faydalı bir mikro dağıtım yapmak

  • u-root projesi, Go tabanlı bir kullanıcı alanı araç seti sunar
    • u-root, Linux çekirdeği üzerinde çalışan kullanıcı alanı önyükleyicisi ve kabuk ortamını içerir
  • Kurulumdan sonra GOOS=linux GOARCH=riscv64 u-root komutuyla initramfs otomatik olarak oluşturulur
    • Oluşan /tmp/initramfs.linux_riscv64.cpio dosyası QEMU’da çalıştırılabilir
  • Önyükleme sırasında “Welcome to u-root!” afişiyle birlikte varsayılan kabuk istemi sunulur
    • ls, pwd, echo gibi temel komutlar desteklenir ve sekme tamamlama özelliği bulunur

Ağ bağlantısı pratiği

  • QEMU’ya virtio-net-device ve virtio-rng-pci aygıtları eklenir
    • -device virtio-net-device,netdev=usernet -netdev user,id=usernet seçenekleri kullanılır
  • u-root içindeki dhclient ile DHCP üzerinden otomatik IP atanır
    • Örnek: eth0 arayüzüne 10.0.2.15/24 atanması
  • wget http://google.com ile harici ağa başarıyla erişilir ve index.html indirildiği doğrulanır

Paket yöneticisi ve init’in önemi

  • Genel amaçlı dağıtımlar, yazılımı dinamik olarak kurup güncellemek için paket yöneticileri kullanır
    • Bu çalışmada ise gömülü sistem yaklaşımı benimsenir; tüm imajın yeniden derlenmesi gerekir
  • init, yalnızca basit bir süreç başlatıcısı değil; aygıt başlatma, servis yönetimi ve sistem önyükleme denetiminin temel bileşenidir
    • u-root içindeki init kaynak kodu incelenerek çeşitli aygıtların (/dev) nasıl ayarlandığı görülebilir

GitHub deposu

  • Bu kılavuzun tüm kodu ve örnekleri popovicu/linux-micro-distro deposunda sunuluyor
    • initramfs imajı oluşturulabilir ve çalışma adımları yeniden üretilebilir

1 yorum

 
GN⁺ 2025-10-27
Hacker News görüşleri
  • Aylardır mikro Linux dağıtımını kendim yapıyorum
    Kullanıcı modu, tek bir statik binary'den oluşuyor ve confidential microVM container desteği için sadece birkaç dosya içeriyor
    Özellikle initramfs yapısı ilgi çekici. Kernel'in cpio arşivini açıp tmpfs'ye girerek /init'i çalıştırma süreci adeta sihir gibi
    Birden fazla cpio arşivi art arda eklenebiliyor, her biri sıkıştırılabiliyor ve sırayla overlay ediliyor
    Bu basit ama zarif tasarım sayesinde, açma kodunu kendim yazarken çok şey öğrendim

  • Son zamanlarda qemu, büyük mimarilerde uftrace desteği sunmaya başladı
    Uzmanlar “bunu nasıl debug edeceğim?” diye sorduğunda, işte cevap bu oluyor
    İlgili ayrıntılar için bu başlığa bakılabilir

  • Ben de benzer bir proje üzerinde çalışıyorum — azathos
    İçinde kendi yaptığım toy init, shell ve birkaç yardımcı araç var
    Debug için GNU coreutils ekledim ve şu anda framebuffer üzerinde pencere çizme özelliğine odaklanıyorum

  • Bu proje gerçekten harika. 98'de floppy tabanlı bir “dağıtım” yapıp Windows PC imaging işini UDP broadcast ile yaptığımız günleri hatırlattı
    “make bzimage”, init script hataları, sonsuz reboot döngüleri… çok anı var
    Bugünkü yaklaşımın da çok farklı olmaması ilginç. Raspberry Pi için port edilse hem eğlenceli hem öğretici olurdu. Belki ben de denerim

    • Benim de 98'de Mandrake Linux'u NetBIOS ve ISDN ile kurmaya çalışırken checksum hatası yüzünden onlarca kez baştan başladığım olmuştu
      Sonunda bir arkadaşım sftp içeriğini CD'ye yazıp vermişti; o zamanlar sadece 2x hızda yazılabiliyordu
  • Bunu bir cloud image olarak (ör. Vultr, DigitalOcean) çalıştırmanın ya da GUI açıp Firefox çalıştırmanın ne kadar zor olacağını merak ediyorum

    • Cloud image olarak çalıştırmak nispeten kolay. Kernel'in varsayılan driver'ları varsa imajı kurmak yeterli
      Başka bir dağıtımla boot edip ardından kexec ile kendi kernel'ini çalıştırarak bellekte kurulum yapmak da mümkün
      Gerçek bir uygulama örneği için nixos-anywhere incelenebilir
    • Ağ ve depolama için virtio driver'larını içeren bir imaj oluşturup bunu qcow2'ye çevirerek DigitalOcean gibi yerlere kaydetmek yeterli
      Düşünüldüğünden daha basit bir iş
  • Bu projenin Raspberry Pi hedefli bir sürümü olsa gerçekten çok ilginç olurdu

  • İnsan neden böyle bir şeyi kendisi yapar diye merak ettim; Linux'u keşfetmek için neden sadece Gentoo kullanılmıyor diye düşündüm

    • Gentoo “source'dan build” yaklaşımını kullanıyor ama işlerin çoğunu package manager hallediyor
      User space özelleştirmesi mümkün olsa da Linux'un kendisini öğrenmek için çok uygun değil
      Sadece stage3 tarball'a bakmak bile zaten “mini dağıtım” seviyesinde olduğunu gösteriyor
  • Öğrenmek için gerçekten harika; hızlıca bir şey ortaya çıkarmak istiyorsanız buildroot iyi bir seçenek

  • Bu yazı sayesinde gerçekten çok şey öğrendim. Bilgi yoğunluğu yüksek bir gönderi olduğu için teşekkürler