Minimální virtualizace na linuxový způsob

Na základech virtualizace je v dnešní době postavena obrovská část trhu. Spolu s tím souvisí i rozvoj celé řady virtualizačních technologií. Tento článek se nebude zabývat popisem virtualizačních technologií, neboť toto téma je až příliš obsáhlé na jeden článek.

Hlavní rozdíl mezi jednotlivými virtualizačními technologiemi je v úrovni virtualizace

  • Virtualizace na hardwarové úrovni
  • Virtualizace na úrovni operačního systému

Virtualizace na úrovni hardware je typická tím, že je možné virtualizovat i různé připojené zařízení. Fakt, že je možné používat různé operační systémy je vcelku jasný.

Virtualizace na úrovni operačního systému je naproti tomu rozdílná v tom, že naprosto ignoruje specifika hardware, na kterém běží. Díky tomu je možné velmi snadno vyměnit hardware. Někdy je tento typ označován jako kontejnerová virtualizace.

Kontejnerová virtualizace je specifická tím, že je takzvaně lightweight, nebo-li lehkotonážní. Díky tomu je možné rychle připravit nový stroj a ještě rychleji ho spustit, případně přenést na jiný server.

Nevýhodou je omezení v tom, že všechny další systémy musí být založeny na stejném operačním serveru se stejným jádrem. Současně s tím může nastat i problém s fenoménem zvaným jailbreak. Termín lze přeložit jako útěk z vězení. Vězení je v tomto případě onen kontejner, více o této problematice v některém z dalších článků.

Virtualizace, kterou bych zde rád trochu zpropagoval se jmenuje User Mode Linux (UML). Jedná se o takový hybrid mezi kontejnery a plnou virtualizací. UML není nic jiného, než speciálně zkompilované jádro linuxu tak, aby ho bylo možné spustit podobně jako libovolný uživatelský proces.

Samotné jádro není plně dostačující, k úspěsné virtualizaci je nutné mít připraven i základní filesystém. Virtualizace poté funguje tak, že se jádru předá cesta k filesystému, který má být použit. Pokud cesta existuje, systém se spustí a je připraven k použití.

Výhodou z pohledu kontejnerové virtualizace je striktní oddělení jednotlivých systémů. Spolu s tím je výhodou i to, že virtuální stoj se spouští bez zvláštních oprávnění. Tento přístup tedy vcelku eliminuje i nebezpečí takzvaného jailbreaku. Neboť útočník v nejlepším případě získá přístup k omezenému uživatelskému účtu.

Dosti bylo teorie pro tuto chvíli, nyní pojďme na příklad toho, jak tuto virtualizaci zprovoznit.

První částí bude stažení zdrojových kódu linuxového jádra. Jádro je nutné rozbalit a zkompilovat. Pro účely tohoto testu bude využita výchozí konfigurace, bude dostatečně funkční.

$ wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.19.12.tar.xz
$ tar xvf linux-4.19.12.tar.xz
$ make defconfig ARCH=um
$ make -j${NPROC} ARCH=um

Předchozí série příkazů provede stažení a kompilaci UML linuxu. Už v tento okamžik je možné spustit zkompilovaný program – jménem linux. Spuštění tohoto procesu vygeneruje dlouhý výpis velmi podobný startu systému. Systém nebude ale fungovat správně, jak již bylo napsáno výše.

Druhou částí systému je příprava filesystému. Jsou zde dvě možnosti, buď celý systém připravíme od nuly, nebo využijeme některý z již připravených. Jednou z možností je použití kupříkladu filesystému z projektu alpine-linuxu. Jako nejvhodnější varianta se jeví využití minimálního filesystému, ten má velikost zhruba 10MB.

Stažený filesystém je nutné vybalit do předem připraveného obrazu. To je možné pomocí následující sady příkazů

$ dd if=/dev/zero of=alpine.img bs=1M count=10
$ sudo mkfs.ext4 alpine.img
$ sudo mount alpine.img /mnt
$ sudo tar xfp alpine-3.8.1.tar.gz -p /mnt

Vzhledem k tomu, že filesystém není přímo určen k tomuto použití, nefunguje vše tak jak by mělo. Je potřeba provést pár úprav, pomocí kterých lze docílit virtualizace. Ve zkratce, je potřeba provést chroot do filesystému a v něm vykonat následující příkazy.

$ sudo chroot /mnt /bin/sh
$ chmod 755 /
$ chmod 755 /bin
$ chmod 755 /lib
$ echo "tty0::respawn:/sbin/getty 38400 tty0" >> /etc/inittab
$ echo "nameserver 8.8.8.8" > /etc/resolv.conf
$ apk update && apk upgrade
$ apk add openrc
$ adduser -s /bin/sh -D admin

Poslední příkaz přidá uživatele admin, kterému nastaví prázdné heslo. Není proto příliš vhodné takto nastavený systém vystavovat do sítě.

Spuštění virtuálního stroje je možné pomocí následujícího příkazu

./linux ubda=filesystem.img

Posted

in

, ,

by