4 puan yazan GN⁺ 2025-10-27 | Henüz yorum yok. | 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

Henüz yorum yok.

Henüz yorum yok.