Table of Contents

Sestavení Linuxového systému z jednotlivých komponent

Cíl cvičení

Na předchozích cvičeních jsme se zabývali jednotlivými aspekty operačních systémů a jejich používání a programování. V této dobrovolné úloze si zkusíte sestavit kompletní operační systém z jednotlivých komponent. Bude se jednat o operační systém s jádrem Linux a jako uživatelský prostor budeme používat projekt BusyBox. Tato kombinace komponent je často používána ve vestavěných (embedded) aplikacích, jako jsou například síťové routery, chytré domácí spotřebiče apod.

Co je Linuxové jádro snad už trochu tušíte z přednášek. BusyBox je sada miniaturních Unixových programů jako je například příkazový interpret (shell), editor, příkazy jako ls, find, cat atd. Pomocí projektu BusyBox lze vytvořit funkční unixové uživatelské prostředí o celkové velikosti pod 1 MiB.

Zadání

Vytvořte shellový skript, který automaticky vytvoří a v emulátoru Qemu nabootuje funkční operační systém. Skript by měl vykonat následující operace:

Evaluace:

Nápověda

Tvorba souborového systému

Základem pro váš souborový systém bude BusyBox nainstalovaný příkazem

make install
Tím se vytvoří základní adresářová struktura, ale k nabootování systému to stačit nebude. Bude potřeba vyřešit následující nedostatky:

  1. Doplnit sdílené knihovny, které potřebuje BusyBox ke svému běhu
  2. Vytvořit adresář /dev s odkazy na nejnutnější zařízení.

Jaké jsou potřeba knihovny pro běh daného programu lze zjistit příkazem ldd. V našem případě tedy spustíme

ldd _install/bin/busybox
Všechny zmiňované knihovny (s výjimkou linux-vdso.so.1) je potřeba mít v cílovém souborovém systému v místě, kde je najde dynamický linker (/lib64/ld-linux-x86-64.so.2). Teoreticky byste si i tyto knihovny mohli zkompilovat sami, ale vzhledem k tomu, že kompilace knihovny jazyka C (libc) není triviální, použijte už zkompilovanou knihovnu z vašeho systému.

Dostupnost všech potřebných knihoven můžete otestovat příkazem chroot. Pokud se rozhodnete svůj souborový systém vytvářet v adresáři _install, spusťte tedy

chroot _install /bin/sh
Ten spustí příkaz /bin/sh s kořenovým adresářem nastaveným na _install. Shell tedy neuvidí žádné jiné soubory než ty, co jsou v adresáři _install a pokud tam budou chybět potřebné knihovny, nepůjde ani spustit.

Nejjednodušší možnost jak nabootovat do právě vytvořeného uživatelského prostředí je uložit ho ve formátu pro Linuxový startovací RAM-disk a nabootovat Linuxové jádro s tímto RAM-diskem. Aby vše fungovalo jak má, kromě souborů v adresáři _install musí RAM-disk obsahovat i několik položek v adresáři /dev pro přístup k virtuálním terminálům. V závislosti na vašem oprávnění můžete RAM-disk vytvořit jedním z následujících způsobů:

Bootování jádra s naším filesystémem v emulátoru Qemu

Na 64-bitovém systému spustíme emulátor Qemu s parametry -kernel a -initrd. Jako jádro zvolíme výsledek naší kompilace jádra, typicky soubor arch/x86/boot/bzImage. Spuštění emulátoru pak může vypadat např. následovně:

   qemu-system-x86_64 -kernel linux-stable/arch/x86/boot/bzImage -initrd busybox/ramdisk

Pokud vše proběhlo správně, zobrazila se hláška

Please press Enter to activate this console.
a po stisku Enteru můžete začít pracovat ve vašem právě vytvořeném systému.

Možná vylepšení

Dále můžete provést drobná (či větší) vylepšení svého nového systému, která vám mohou zjednodušit další práci.

Tipy a triky

Reference