Máquinas virtuais com BHyve

bhyve logo
BHyve Logo

Des­ta vez vou escr­ev­er sobre um tema que está muito em voga nos dias que cor­rem: vir­tu­al­iza­ção.

A seguir mostrarei como instalei Ubun­tu Lin­ux 18.04 LTS numa máquina vir­tu­al BHyve.

Como o BHyve do FreeB­SD 11.2 ain­da não supor­ta ofi­cial­mente o Ubun­tu 18.04 LTS será necessário um pequeno truque para fun­cionar.

Introdução

O BHyve é o hiper­vi­sor do FreeB­SD. Está disponív­el des­de a ver­são 10.0 e per­mite cor­rer máquinas vir­tu­ais Lin­ux, FreeB­SD, OpenB­SD, Solaris e Win­dows.

Antes de poder­mos usar o BHyve, temos de nos cer­ti­ficar que o CPU do nos­so com­puta­dor o supor­ta. Para tal, bas­ta ver­i­ficar, no ficheiro /var/run/dmesg.boot as flags do CPU: a flagPOPCNT na lin­ha Features2 para proces­sadores AMD® ou EPT e UG na lin­ha VT-x para proces­sadores Intel®.

Para gerir as nos­sas máquinas vir­tu­al, usarei um util­itário com o nome sug­es­ti­vo de vm-bhyve. Este util­itário con­tém um con­jun­to de scripts que facili­tam as tare­fas de cri­ação, insta­lação, con­fig­u­ração e gestão das nos­sas máquinas vir­tu­ais.

Ao cor­rer o coman­do vm help, obte­mos o out­put abaixo:

root@gatekeeper:/usr/ports/sysutils/vm-bhyve# vm help
vm-bhyve: Bhyve virtual machine management v1.2-p3 (build 102071)
Usage: vm …
version
init
set [setting=value] […]
get [all|setting] […]
switch list
switch info [name] […]
switch create [-t type] [-i interface] [-n vlan-id] [-m mtu] [-a address/prefix-len] [-b bridge] [-p]
switch vlan
switch nat
switch private
switch add
switch remove
switch destroy
datastore list
datastore add
datastore remove
datastore add
list
info [name] […]
create [-d datastore] [-t template] [-s size]
[-fi] install
[-fi] start […]
stop […]
console [com1|com2]
configure
rename
add [-d device] [-t type] [-s size|switch]
startall
stopall
[-f] reset
[-f] poweroff
[-f] destroy
passthru
clone
snapshot [-f]
rollback [-r]
iso [url]
image list
image create [-d description] [-u]
image destroy
image provision [-d datastore]

Para poder usar Lin­ux em máquinas vir­tu­ais BHyve é necessário insta­lar o pacote sysu­til­s/­grub2-bhyve, seja usan­do a árvore de ports ou pacote pré-com­pi­la­do.

cd /usr/ports/sysutils/grub2-bhyve
make install

Criação e instalação

O primeiro pas­so necessário é cri­ar um direc­tório onde guardar as nos­sas máquinas vir­tu­ais. No meu caso, escol­hi o direc­tório /home/bhyvevms.

­De segui­da, é necessário acres­cen­tar as entradas seguintes ao ficheiro /etc/rc.conf:

vm_enable="YES"
vm_dir="/home/bhyvevms"

Depois, ini­cializar o direc­tório /home/bhyvevms:

vm init
mkdir /home/bhyvevms/.templates
cp /usr/local/share/examples/vm-bhyve/* /home/bhyvevms/.templates

Seguida­mente, cri­ar um switch de rede vir­tu­al (no exem­p­lo seguinte, o switch chamar-se‑á pub­lic) e adi­cionar um inter­face de rede físi­co (neste caso, o bge0):

vm switch create public
vm switch add public bge0

A seguir, faz-se o down­load do ficheiro ISO de insta­lação do Ubun­tu Serv­er 18.04.1 LTS:

vm iso http://ftp.dei.uc.pt/pub/linux/ubuntu/releases/bionic/ubuntu-18.04.1.0-live-server-amd64.iso

Depois de faz­er o down­load, pode-se cri­ar a máquina vir­tu­al e ini­ciar a insta­lação do sis­tema oper­a­ti­vo. Os coman­dos seguintes cri­am um máquina vir­tu­al chama­da myubun­tu, usan­do o mod­e­lo (tem­plate) ubun­tu, com um dis­co vir­tu­al de 100GB.

vm create -t ubuntu -s 100G myubuntu
vm install myubuntu ubuntu-16.04.2-server-amd64.iso

É necessário lig­ar­mo-nos à con­so­la da máquina vir­tu­al para poder­mos insta­lar o sis­tema:

vm console myubuntu

É prefer­ív­el não usar a opção LVM, por for­ma a ser mais pre­visív­el o file sys­tem onde será insta­l­a­do o sis­tema. O moti­vo para esta escol­ha é expli­ca­do abaixo.

Proposi­tada­mente, não referi que a últi­ma ver­são supor­ta­da pelo BHyve de Ubun­tu é a ver­são 16.04 (mais especi­fi­ca­mente, pelo grub2-bhyve). Para con­seguirmos arran­car ter­e­mos que edi­tar o ficheiro de con­fig­u­ração da máquina vir­tu­al e adi­cionar duas lin­has que, resum­i­da­mente, dizem ao grub2-bhyve os coman­dos GRUB2 que terão que ser cor­ri­dos para ini­ciar o arranque da máquina.

É necessário ver­i­ficar qual o ker­nel que está insta­l­a­do na máquina. No prompt grub> escr­ev­er o coman­do:

ls (hd0,gpt2)/boot

O out­put deste coman­do será qual­quer coisa pare­ci­da com:

grub/ System.map-4.15.0-29-generic abi-4.15.0-29-generic config-4.15.0-29-generic initrd.img-4.15.0-29-generic retpoline-4.15.0-29-generic vmlinuz-4.15.0-29-generic

Con­seguimos ver que o ficheiro que con­tém o ker­nel se chama vmlinuz‑4.15.0–29-generic e o RAM disk, initrd.img‑4.15.0–29-generic.

Sendo assim, ter­e­mos que con­fig­u­rar a nos­sa nova máquina vir­tu­al como se segue:

vm configure myubuntu

Adi­cionar as lin­has seguintes ao ficheiro de con­fig­u­ração:

grub_run0="linux (hd0,gpt2)/boot/vmlinuz-4.15.0-29-generic ro root=/dev/vda2"
grub_run1=initrd (hd0,gpt2)/boot/initrd.img-4.15.0-29-generic"

Ago­ra já é pos­sív­el ini­ciar a nos­sa nova máquina vir­tu­al auto­mati­ca­mente.

vm start myubuntu

Actualizações

Esta abor­dagem tem ape­nas um prob­le­ma.

Quan­do se faz actu­al­iza­ções do ker­nel é necessário, nova­mente, tomar nota do nome dos ficheiros do próprio ker­nel e do ini­trd e actu­alizar a con­fig­u­ração da máquina vir­tu­al com os nomes actu­al­iza­dos.

Por exem­p­lo, após a actu­al­iza­ção do ker­nel para a ver­são 4.15.0–43, são insta­l­a­dos os ficheiros

initrd.img-4.15.0-43-generic
vmlinuz-4.15.0-43-generic

Para que a nos­sa máquina vir­tu­al use estes ficheiros, é necessário edi­tar a con­fig­u­ração por for­ma a que a con­fig­u­ração da mes­ma inclua as lin­has:

grub_run0="linux (hd0,gpt2)/boot/vmlinuz-4.15.0-43-generic ro root=/dev/vda2"
grub_run1=initrd (hd0,gpt2)/boot/initrd.img-4.15.0-43-generic"

About António Trindade

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Matomo encountered an error: Uncaught Exception: Piwik and/or some plugins have been upgraded to a new version. --> Please run the update process first. See documentation: https://matomo.org/docs/update/ in /home/www/piwik/plugins/CoreUpdater/CoreUpdater.php:81 Stack trace: #0 [internal function]: Piwik\Plugins\CoreUpdater\CoreUpdater->dispatch() #1 /home/www/piwik/core/EventDispatcher.php(141): call_user_func_array(Array, Array) #2 /home/www/piwik/core/Piwik.php(778): Piwik\EventDispatcher->postEvent('Request.dispatc...', Array, false, Array) #3 /home/www/piwik/core/FrontController.php(374): Piwik\Piwik::postEvent('Request.dispatc...') #4 /home/www/wordpress/wp-content/plugins/wp-piwik/classes/WP_Piwik/Request/Php.php(40): Piwik\FrontController->init() #5 /home/www/wordpress/wp-content/plugins/wp-piwik/classes/WP_Piwik/Request/Php.php(18): WP_Piwik\Request\Php->call('method=SitesMan...', '/', 'module=API&form...') #6 /home/www/wordpress/wp-content/plugins/wp-piwik/classes/WP_Piwik/Request.php(63): WP_Piwik\Request\Php->request('metho (which lead to: Session must be started before any output has been sent to the browser; output started in /home/www/wordpress/wp-includes/formatting.php/5416)