Search
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.
ls
find
cat
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:
make defconfig
make
make -j$(nproc)
qemu-system-x86_64
Evaluace:
Základem pro váš souborový systém bude BusyBox nainstalovaný příkazem
make install
/dev
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
ldd _install/bin/busybox
linux-vdso.so.1
/lib64/ld-linux-x86-64.so.2
libc
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
chroot _install /bin/sh
/bin/sh
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ů:
mkdir _install/{dev,etc,proc,sys} sudo cp -a /dev/tty? _install/dev ln -s bin/busybox _install/init (cd _install; find . | cpio -o -H newc | gzip) > ramdisk
( cat <<EOF dir /dev 755 0 0 nod /dev/tty0 644 0 0 c 4 0 nod /dev/tty1 644 0 0 c 4 1 nod /dev/tty2 644 0 0 c 4 2 nod /dev/tty3 644 0 0 c 4 3 nod /dev/tty4 644 0 0 c 4 4 slink /init bin/busybox 700 0 0 dir /proc 755 0 0 dir /sys 755 0 0 EOF find _install -mindepth 1 -type d -printf "dir /%P %m 0 0\n" find _install -type f -printf "file /%P %p %m 0 0\n" find _install -type l -printf "slink /%P %l %m 0 0\n" ) > filelist gen_init_cpio filelist | gzip > ramdisk
filelist
gen_init_cpio
gzip
ramdisk
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ě:
-kernel
-initrd
arch/x86/boot/bzImage
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.
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.
/proc
ps
mount -t proc none /proc
/etc/init.d/rcS
mkdir -p _install/etc/init.d cat <<EOF >_install/etc/init.d/rcS #!/bin/sh mount -t proc none /proc echo Nazdar!!!! EOF chmod +x _install/etc/init.d/rcS # nastavení spustitelnosti
qemu -serial stdio ...
console=ttyS0
qemu -serial stdio -append console=ttyS0 ...
qemu -net nic,vlan=0,model=ne2k_pci -net user,vlan=0 ...
ssh -X
qemu -curses
qemu -nographic
-append console=ttyS0