
Desta vez vou escrever sobre um tema que está muito em voga nos dias que correm: virtualização.
A seguir mostrarei como instalei Ubuntu Linux 18.04 LTS numa máquina virtual BHyve.
Como o BHyve do FreeBSD 11.2 ainda não suporta oficialmente o Ubuntu 18.04 LTS será necessário um pequeno truque para funcionar.
Introdução
O BHyve é o hipervisor do FreeBSD. Está disponível desde a versão 10.0 e permite correr máquinas virtuais Linux, FreeBSD, OpenBSD, Solaris e Windows.
Antes de podermos usar o BHyve, temos de nos certificar que o CPU do nosso computador o suporta. Para tal, basta verificar, no ficheiro /var/run/dmesg.boot as flags do CPU: a flagPOPCNT
na linha Features2
para processadores AMD® ou EPT
e UG
na linha VT-x
para processadores Intel®.
Para gerir as nossas máquinas virtual, usarei um utilitário com o nome sugestivo de vm-bhyve. Este utilitário contém um conjunto de scripts que facilitam as tarefas de criação, instalação, configuração e gestão das nossas máquinas virtuais.
Ao correr o comando vm help, obtemos o output 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 Linux em máquinas virtuais BHyve é necessário instalar o pacote sysutils/grub2-bhyve, seja usando a árvore de ports ou pacote pré-compilado.
cd /usr/ports/sysutils/grub2-bhyve
make install
Criação e instalação
O primeiro passo necessário é criar um directório onde guardar as nossas máquinas virtuais. No meu caso, escolhi o directório /home/bhyvevms.
De seguida, é necessário acrescentar as entradas seguintes ao ficheiro /etc/rc.conf:
vm_enable="YES"
vm_dir="/home/bhyvevms"
Depois, inicializar o directório /home/bhyvevms:
vm init
mkdir /home/bhyvevms/.templates
cp /usr/local/share/examples/vm-bhyve/* /home/bhyvevms/.templates
Seguidamente, criar um switch de rede virtual (no exemplo seguinte, o switch chamar-se‑á public) e adicionar um interface de rede físico (neste caso, o bge0):
vm switch create public
vm switch add public bge0
A seguir, faz-se o download do ficheiro ISO de instalação do Ubuntu Server 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 fazer o download, pode-se criar a máquina virtual e iniciar a instalação do sistema operativo. Os comandos seguintes criam um máquina virtual chamada myubuntu, usando o modelo (template) ubuntu, com um disco virtual de 100GB.
vm create -t ubuntu -s 100G myubuntu
vm install myubuntu ubuntu-16.04.2-server-amd64.iso
É necessário ligarmo-nos à consola da máquina virtual para podermos instalar o sistema:
vm console myubuntu
É preferível não usar a opção LVM, por forma a ser mais previsível o file system onde será instalado o sistema. O motivo para esta escolha é explicado abaixo.
Propositadamente, não referi que a última versão suportada pelo BHyve de Ubuntu é a versão 16.04 (mais especificamente, pelo grub2-bhyve). Para conseguirmos arrancar teremos que editar o ficheiro de configuração da máquina virtual e adicionar duas linhas que, resumidamente, dizem ao grub2-bhyve os comandos GRUB2 que terão que ser corridos para iniciar o arranque da máquina.
É necessário verificar qual o kernel que está instalado na máquina. No prompt grub> escrever o comando:
ls (hd0,gpt2)/boot
O output deste comando será qualquer coisa parecida 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
Conseguimos ver que o ficheiro que contém o kernel se chama vmlinuz‑4.15.0–29-generic e o RAM disk, initrd.img‑4.15.0–29-generic.
Sendo assim, teremos que configurar a nossa nova máquina virtual como se segue:
vm configure myubuntu
Adicionar as linhas seguintes ao ficheiro de configuraçã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"
Agora já é possível iniciar a nossa nova máquina virtual automaticamente.
vm start myubuntu
Actualizações
Esta abordagem tem apenas um problema.
Quando se faz actualizações do kernel é necessário, novamente, tomar nota do nome dos ficheiros do próprio kernel e do initrd e actualizar a configuração da máquina virtual com os nomes actualizados.
Por exemplo, após a actualização do kernel para a versão 4.15.0–43, são instalados os ficheiros
initrd.img-4.15.0-43-generic
vmlinuz-4.15.0-43-generic
Para que a nossa máquina virtual use estes ficheiros, é necessário editar a configuração por forma a que a configuração da mesma inclua as linhas:
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"