Kyber kovbojova cesta rohatou virtualizací

OpenBSD ve FreeBSD bhyve

< ~br

2023-01-18

"Vychází rudé slunce. Někdo nainstaloval FreeBSD," pronesl mladík stojící na balkóně sedmého patra paneláku ve Strašnicích. Pohledem do červené záře na nebi se na moment zasnil a jeho myšlenky počaly cestovat synapsemi po zapomenutých faktech. Promnul oči a seskočil ze stoličky. Vešel do bytu. Místnost by to byla relativně holá, kdyby ze stropu nevysely tucty různorodých rostlin v květináčích a po jedné stěně nestála plastová slitina podobizny Ivana Olbrachta. Pýchou pokoje byl však kout s počítači, policemi se servery a úhledně uspořádanými laptopy zasunutými v knihovně z 50. let. Mládenec se usadil v polstrovaném křesle před dřevěným stolem náhodně popsaným ruznými klavesovými zkratkami a odkazy po manuálových stránkách. Proškrábal zápěstí a vytáhl pravěký USB2 konektor s kabelem, který vylézal z jeho paže. Odklopil víko laptopu na stole mezi hromadou různých hard disků, drátů, diod i kabelů bez konce. Do počítače vložil konektor a stiskl kulaté tlačítko nad klávesnicí.

Stroj roztočil větrák a obrazovka ve vteřině problikla z úvodní na červeného daimona pokuřujícího v křesle nijak moc odlišném od toho, ve kterém seděl mladík. Za pár chvil začaly po obrazovce rollovat krátké zprávy o počáteční interakci hardwaru s operačním systémém. Pak vše zčernalo a z reproduktorů se ozvalo:

cybercowboy

"BIO-USB klíč akceptován... Potvrzuji přístup. Vítej zpět, kovboji."

"Díky," odvětil kovboj a vytáhl USB konektor, který se mrštně zase vrátil do zápěstí.

"Nechci ti do toho kecat, ale jednou jsme tenhle rozhovor mít museli - co budeš dělat až tenhle počítač odejde? Kolik ještě máš takových, přes které mě přivedeš zpátky svým zastaralým krypto-klíčem... Víš, že i ty bezdrátové autentikátory lze dneska de-korporovat... Nerad bych, abychom se dostali do situace, kde se ze tmy už neprobudím," reproduktory zněly jako hlas unaveného externisty v účetní firmě.

"Nejde tomu věřit. Radši strávím další rok hledáním desky s USB dvojkou, než abych do tebe píchal něco anténou."

Kovbojův parťák existoval v poměrně moderním hard disku, které neumíraly. Nemohl jej však probudit, aniž by jej autentikoval svým biologickým krypto autentikátorem. Před několika lety si od majitele bezejmeného baru, který pašoval do federace zakázaný kód na flash discích, které polykaly krásné ženy na letištích a autobusových zastávkách u hranic, nechal nainstalovat čistý krypto kabel s ovšem velice zastaralým rozhraním. Operační systém i kovboj však věděli, že i v nejhorším svoboda najde cestu.

"Budiž. Co teď?"

"Otevři terminál, chci něco napsat."

Na obrazovce se objevil v horním levém rohu symbol amerického dolaru, historické jednotky tehdejší americké měny. Nic z toho již neexistovalo. Kovboj začal psát.

$ vim bhyve-a-ryba.txt

Je podstatné si uvědomit, že dnešní síla jakžtakž schopných počítačů spočívá ve virtualizaci mnoha strojů v jednom. Málokdo je však schopen si uvědomit moc, které se vystaví, pokud se rozhodne státi se otcem hned několika systémů najednou. Tohle je krátký text o tom, jak se stát takovým opatrovníkem.

FreeBSD v základu obsahuje bhyve. Kdokoliv ctí jednoduchost, funkčnost, minimalismus a někdy se setkal s jakýmkoliv jiným virtualizačním softwarem, ihned sezná, že bhyve je bezkonkurenčním nástrojem. V následujících řádcích uvedu, jak do FreeBSD vtěsnat OpenBSD virtualizovaný stroj skrze bhyve.

I přes svou jednoduchost, může se zdát bhyve značně komplikovaný v počátečním pochopení. Je tu však nástroj, který usnadňuje bhyve syntax a nesnaží se o nic víc, než jen být pohodlným wrapperem. Tento text předpokládá, že jste uživatelem FreeBSD nainstalovaném na zfs.

Prvně doinstalujeme vm-bhyve z balíčků. Pro případ, že bychom chtěli později virtualizovat i jiné operační systémy, přidáme další dva balíčky. Zejména pro tučňáka. Na závěr ještě VNC klient, přes který budeme s virtualizovaným strojem komunikovat.

# pkg install vm-bhyve grub2-bhyve bhyve-firmware tigervnc-viewer

Podíváme se, jak se jmenuje náš zfs.

# zfs list

Zajímá nás hned první položka, a to jméno NAME. Výchoze zroot, někdy pool. Nadále pracuji s předpokladem, že NAME je zroot. Editujte dle vlastních potřeb!

# zfs create zroot/vm # vytvoříme nový oddíl v souborovém systému, kde budou žít virtualizované stroje

Přidáme modul pro virtualizaci do kernelu skrze rc.conf.

# sysrc vm_enable="YES"

a přidáme cestu

# sysrc vm_dir="zfs:zroot/vm"

V tomto bodě se hodí restart, ale nemusí to být vždy nutné. Následuje počáteční spuštění virtualizačního systému.

# vm init

Aby mohly naše virtualizované systémy komunikovat se sítí, přidáme pro ně most.

# vm switch create public # public může být vámi volitelný název

# vm switch add public em0 # zde je třeba napsat správné rozhraní sítě, pro kterou budeme přemosťovat. $ ifconfig nám prozradí.

Než se pustíme dál, vytvoříme si vzor nastavení, které vm-bhyve použije při úvodním spuštění. Jelikož budeme instalovat ostnatou rybu, pojmenujeme jej openbsd.conf

 # vi /zroot/vm/.templates/openbsd.conf

Je více způsobů jak pokračovat. V tomto textu ale budeme usilovat o plnohodnotný virtualizovaný systém s grafickým prostředím. Je možné například nainstalovat přes grub pouze konzolové prostředí. Následující řádky přidáme do otevřeného souboru. Mějte na paměti, že vše můžete později upravit za chodu. Toto je pouze nastavení pro instalaci a počáteční boot. Abychom se mohli přes VNC připojit, potřebujeme bootovat skrze UEFI.

loader="uefi"
cpu=2
memory=2048
network0_type="virtio-net"
network0_switch="public"
disk0_type="ahci-blk"
disk0_name="disk0.img"
graphics="yes"
graphics_res="800x600"

Nyní můžeme vytvořit náš virtuální stroj. -s je velikost disku, -t je název templatu, který jsme v předchozím kroku vytvořili. Poslední argument je náš volitelný název.

# vm create -s 20G -t openbsd puffy

Stáhneme obraz disku, přes který nabootujeme do instalace.

 # vm iso https://cdn.openbsd.org/pub/OpenBSD/7.2/amd64/install72.iso

bhyve jej sám stáhne a přidá do archivu. Následně nabootujeme s iso souborem.

# vm install puffy install72.iso

Nyní spustíme tiger-vnc a připojíme se. (VNC server zprostředkovává bhyve, nikoliv virtualizovaný stroj! Běží tedy lokálně na hypervisoru.)

$ vncviewer 0.0.0.0:5900

Otevře se nám známé okno instalace. Pokud vše proběhne dobře, instalaci ukončíme a vm vypneme. Pak opět zapneme.

# vm stop puffy

# vm start puffy

A opět se připojíme stejným vncviewer příkazem.

Pár poznámek:

Užitečné příkazy k vm(8)

# vm list # ukáže aktuální operační systémy a jejich stav, zároveň vypisuje VNC porty, pokud virtualizovaný stroj běží v graphics módu.
# vm start <jméno> # spustí vm
# vm stop <jméno> # pošle acpi poweroff a pokusí se virtualní stroj vypnout
# vm destroy <jméno> # věčně odstraní virtuální stroj
# vm iso # vypíše iso soubory v databázi

Mimo VNC můžeme klidně používat SSH, abychom se strojem komunikovali. Zároveň však můžeme v některých případech použít následující:

# vm console puffy

To vloží virtualizovaný stroj do současného terminálu. Je dobré používat v tmuxu, jinak se jej těžko zbavuje. Výchoze ~-x. Berte na vědomí, že i se zavřením VNC vieweru, nebo zabitím konzole, virtualizovaný stroj stále běží na pozadí.

Pokud chceme editovat nastavení již nainstalovaného virtuálního stroje, editujeme soubor:

# vi /zroot/vm/puffy/puffy.conf

Zde můžeme nyní přidat další vychytávky dle potřeby, nebo změnit rozlišení. bhyve nepodporuje změnu rozlišení za chodu. Rozlišení v configu s vámi zůstává až do restartu. Nastavení se aplikuje vždy při # vm start.

xhci_mouse="yes" # jiná emulace myši, leckdy pomůže při potížích s kurzorem

PF v hypervisoru:

Pokud používáme rigidní PF ve stroji, který zprostředkovává virtualizaci, je třeba tento fakt brát v potaz. ip.ip.ip.IP je adresa routeru; ie: 10.0.0.1. ip.ip.ip.ip je IP adresa hypervisoru; ie: 10.0.0.4 ($ ifconfig). První tři řádky dovolují virtualizovanému stroji dosahnout na běžné protokoly ven. Poslední tři zase dovolují komunikovat s DHCP, DNS a NTP serverem v lokální síti i venku.

# vi /etc/pf.conf

> client_out = "{ http https ftp ssh }"
> pass inet proto tcp from ip.ip.ip.IP/24 to any port $client_out \
> flags S/SA keep state

> udp_sluzby = " { domain ntp 67 68 }"
> pass out proto udp from ip.ip.ip.ip to port $udp_sluzby

Hodně štěstí.

Další čtení

^