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