O hypervisor bhyve BSD-licensed tornou-se parte do sistema base com o FreeBSD 10.0-RELEASE. Este hypervisor suporta uma grande variedade de sistemas operacionais convidados, incluindo FreeBSD, OpenBSD e muitas distribuições Linux®. Por padrão, o bhyve fornece acesso ao console serial e não emula um console gráfico. Os recursos de offload de virtualização das CPUs mais recentes são usados para evitar os métodos legados de tradução de instruções e de gerenciamento manual de mapeamentos de memória.
O design do bhyve requer um processador que suporte tabelas de páginas estendidas da Intel® (EPT) ou a Indexação Rápida de Virtualização da AMD® (RVI) ou Tabelas de Páginas Aninhadas (NPT). Hospedar sistemas operacionais convidados Linux® ou convidados FreeBSD com mais de uma vCPU requer suporte a modo irrestrito de VMX (UG). A maioria dos processadores mais recentes, especificamente o Intel® Core™ i3/i5/i7 e o Intel® Xeon™ E3/E5/E7, suportam esses recursos. O suporte UG foi introduzido com a microarquitetura Westmere da Intel. Para obter uma lista completa dos processadores Intel® que suportam EPT, consulte https://ark.intel.com/content/www/us/en/ark/search/featurefilter.html?productType=873&0_ExtendedPageTables=True. O RVI é encontrado na terceira geração e depois nos processadores AMD Opteron™ (Barcelona). A maneira mais fácil de saber se um processador suporta o bhyve é executar o dmesg
ou procurar no /var/run/dmesg.boot
pelo o Sinalizador de recurso do processador POPCNT
na linha Features2
para processadores AMD® ou EPT
e UG
na linha VT-x
para os processadores Intel®.
O primeiro passo para criar uma máquina virtual no bhyve é configurar o sistema host. Primeiro, carregue o módulo do kernel bhyve:
#
kldload vmm
Em seguida, crie uma interface tap
para o dispositivo de rede na máquina virtual para anexar. Para que o dispositivo de rede participe da rede, crie também uma interface de bridge contendo a interface tap
e a interface física como membros. Neste exemplo, a interface física é igb0
:
#
ifconfig
tap0
create#
sysctl net.link.tap.up_on_open=1
net.link.tap.up_on_open: 0 -> 1#
ifconfig
bridge0
create#
ifconfig
bridge0
addmigb0
addmtap0
#
ifconfig
bridge0
up
Crie um arquivo para usar como o disco virtual da máquina convidada. Especifique o tamanho e o nome do disco virtual:
#
truncate -s
16G
guest.img
Baixe uma imagem de instalação do FreeBSD para instalar:
#
fetch
FreeBSD-10.3-RELEASE-amd64-bootonly.iso 100% of 230 MB 570 kBps 06m17sftp://ftp.freebsd.org/pub/FreeBSD/releases/ISO-IMAGES/10.3/FreeBSD-10.3-RELEASE-amd64-bootonly.iso
O FreeBSD vem com um script de exemplo para executar uma máquina virtual com o bhyve. O script iniciará a máquina virtual e a executará em um loop, para que ela seja reiniciada automaticamente se houver falha. O script usa várias opções para controlar a configuração da máquina: -c
controla o número de CPUs virtuais, -m
limita a quantidade de memória disponível para o sistema operacional convidado, -t
define qual dispositivo tap
usar, -d
indica qual imagem de disco usar, -i
indica ao bhyve para inicializar a partir da imagem CD em vez do disco, e -I
define qual imagem de CD deve ser usada. O último parâmetro é o nome da máquina virtual, usada para rastrear as máquinas em execução. Este exemplo inicia a máquina virtual no modo de instalação:
#
sh /usr/share/examples/bhyve/vmrun.sh -c
1
-m1024M
-ttap0
-dguest.img
-i -IFreeBSD-10.3-RELEASE-amd64-bootonly.iso
guestname
A máquina virtual inicializará e iniciará o instalador. Depois de instalar um sistema na máquina virtual, quando o sistema perguntar sobre a inserção em um shell no final da instalação, escolha
.Reinicialize a máquina virtual. Enquanto a reinicialização da máquina virtual fará o bhyve finalizar, o script vmrun.sh
executa o bhyve
em um loop e o reiniciará automaticamente. Quando isso acontecer, escolha a opção de reinicialização no menu do carregador de inicialização para escapar do loop. Agora o convidado pode ser iniciado a partir do disco virtual:
#
sh /usr/share/examples/bhyve/vmrun.sh -c
4
-m1024M
-ttap0
-dguest.img
guestname
Para inicializar sistemas operacionais diferentes do FreeBSD, o port sysutils/grub2-bhyve deve ser instalada primeiro.
Em seguida, crie um arquivo para usar como o disco virtual da máquina convidada:
#
truncate -s
16G
linux.img
Iniciar uma máquina virtual com o bhyve é um processo de duas etapas. Primeiro um kernel deve ser carregado, então o sistema operacional convidado pode ser iniciado. O kernel Linux® é carregado com o sysutils/grub2-bhyve. Crie um device.map
que o grub usará para mapear os dispositivos virtuais para os arquivos no sistema host:
(hd0) ./linux.img (cd0) ./somelinux.iso
Use o sysutils/grub2-bhyve para carregar o kernel Linux® de uma imagem ISO:
#
grub-bhyve -m device.map -r cd0 -M
1024M
linuxguest
Isto irá iniciar o grub. Se o CD de instalação contiver um grub.cfg
, um menu será exibido. Caso contrário, os arquivos vmlinuz
e initrd
devem ser localizados e carregados manualmente:
grub>ls
(hd0) (cd0) (cd0,msdos1) (host) grub>ls (cd0)/isolinux
boot.cat boot.msg grub.conf initrd.img isolinux.bin isolinux.cfg memtest splash.jpg TRANS.TBL vesamenu.c32 vmlinuz grub>linux (cd0)/isolinux/vmlinuz
grub>initrd (cd0)/isolinux/initrd.img
grub>boot
Agora que o kernel Linux® está carregado, o sistema convidado pode ser iniciado:
#
bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,
tap0
-s 3:0,virtio-blk,./linux.img
\ -s 4:0,ahci-cd,./somelinux.iso
-l com1,stdio -c4
-m1024M
linuxguest
O sistema inicializará e iniciará o instalador. Depois de instalar um sistema na máquina virtual, reinicialize a máquina virtual. Isso fará com que o bhyve seja encerrado. A instância da máquina virtual precisa ser destruída antes de poder ser iniciada novamente:
#
bhyvectl --destroy --vm=
linuxguest
Agora, o sistema convidado pode ser iniciado diretamente do disco virtual. Carregue o kernel:
#
grub-bhyve -m device.map -r hd0,msdos1 -M
grub>1024M
linuxguest
ls
(hd0) (hd0,msdos2) (hd0,msdos1) (cd0) (cd0,msdos1) (host) (lvm/VolGroup-lv_swap) (lvm/VolGroup-lv_root) grub>ls (hd0,msdos1)/
lost+found/ grub/ efi/ System.map-2.6.32-431.el6.x86_64 config-2.6.32-431.el6.x 86_64 symvers-2.6.32-431.el6.x86_64.gz vmlinuz-2.6.32-431.el6.x86_64 initramfs-2.6.32-431.el6.x86_64.img grub>linux (hd0,msdos1)/vmlinuz-2.6.32-431.el6.x86_64 root=/dev/mapper/VolGroup-lv_root
grub>initrd (hd0,msdos1)/initramfs-2.6.32-431.el6.x86_64.img
grub>boot
Inicialize a máquina virtual:
#
bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,
tap0
\ -s 3:0,virtio-blk,./linux.img
-l com1,stdio -c4
-m1024M
linuxguest
O Linux® iniciará agora na máquina virtual e, eventualmente, apresentará o prompt de login. Faça o login e use a máquina virtual. Quando terminar, reinicialize a máquina virtual para sair do bhyve. Destrua a instância da máquina virtual:
#
bhyvectl --destroy --vm=
linuxguest
Além do bhyveload e do grub-bhyve, o hypervisor bhyve também pode inicializar máquinas virtuais usando o firmware do espaço de usuário UEFI . Esta opção pode suportar sistemas operacionais convidados que não são suportados pelos outros carregadores.
Para utilizar o suporte ao UEFI no bhyve, primeiro obtenha as imagens de firmware UEFI. Isto pode ser feito instalando o port ou pacote sysutils/bhyve-firmware .
Com o firmware no lugar, adicione os sinalizadores -l bootrom,
à linha de comando do bhyve. A sintaxe real do bhyve pode se parecer com a seguinte:/path/to/firmware
#
bhyve -AHP -s 0:0,hostbridge -s 1:0,lpc \ -s 2:0,virtio-net,
tap1
-s 3:0,virtio-blk,./disk.img
\ -s 4:0,ahci-cd,./install.iso
-c4
-m1024M
\ -l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd
\guest
O sysutils/bhyve-firmware também contém um firmware habilitado para CSM, para inicializar sistemas operacionais hóspedes sem suporte à UEFI no modo de BIOS legado:
#
bhyve -AHP -s 0:0,hostbridge -s 1:0,lpc \ -s 2:0,virtio-net,
tap1
-s 3:0,virtio-blk,./disk.img
\ -s 4:0,ahci-cd,./install.iso
-c4
-m1024M
\ -l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI_CSM.fd
\guest
O suporte ao firmware UEFI é particularmente útil em sistemas operacionais convidados predominantemente gráficos, como o Microsoft Windows®.
O suporte para o framebuffer UEFI-GOP também pode ser ativado com os sinalizadores -s 29,fbuf,tcp=
. A resolução do framebuffer pode ser configurada com 0.0.0.0:5900
w=
e 800
h=
e o bhyve pode ser instruído para aguardar uma conexão VNC antes de inicializar o sistema operacional convidado adicionando 600
wait
. O framebuffer pode ser acessado pelo host ou pela rede através do protocolo VNC. Além disso, -s 30,xhci,tablet
pode ser adicionado para obter a sincronização precisa do cursor do mouse com o host.
O comando bhyve resultante ficaria assim:
#
bhyve -AHP -s 0:0,hostbridge -s 31:0,lpc \ -s 2:0,virtio-net,
tap1
-s 3:0,virtio-blk,./disk.img
\ -s 4:0,ahci-cd,./install.iso
-c4
-m1024M
\ -s 29,fbuf,tcp=0.0.0.0:5900
,w=800
,h=600
,wait \ -s 30,xhci,tablet \ -l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd
\guest
Observe que, no modo de emulação do BIOS, o framebuffer deixará de receber atualizações quando o controle for passado do firmware para o sistema operacional convidado.
Se o ZFS estiver disponível na máquina host, o uso de volumes ZFS em vez de arquivos de imagem de disco pode fornecer benefícios significativos de desempenho para as VMs convidadas. Um volume ZFS pode ser criado por:
#
zfs create -V
16G
-o volmode=devzroot/linuxdisk0
Ao iniciar a VM, especifique o volume ZFS como a unidade de disco:
#
bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,
tap0
-s3:0,virtio-blk,/dev/zvol/zroot/linuxdisk0
\ -l com1,stdio
-c4
-m1024M
linuxguest
É vantajoso executar o console do bhyve em uma ferramenta de gerenciamento de sessão, como o sysutils/tmux ou sysutils/screen, para que possa desanexar e reanexar o console. Também é possível ter o console do bhyve como um dispositivo de modem nulo o qual pode ser acessado com o comando cu
. Para fazer isso, carregue o módulo do kernel nmdm
e substitua -l com1,stdio
with -l com1,/dev/nmdm0A
. Os dispositivos /dev/nmdm
são criados automaticamente conforme necessário, onde cada um é um par, correspondente às duas extremidades do cabo de modem nulo (/dev/nmdm0A
e /dev/nmdm0B
). Veja nmdm(4) para maiores informações.
#
kldload nmdm
#
bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,
tap0
-s 3:0,virtio-blk,./linux.img
\ -l com1,/dev/nmdm0A
-c4
-m1024M
linuxguest
#
cu -l
Connected Ubuntu 13.10 handbook ttyS0 handbook login:/dev/nmdm0B
Um nó de dispositivo é criado em /dev/vmm
para cada máquina virtual. Isso permite que o administrador veja facilmente uma lista das máquinas virtuais em execução:
#
ls -al /dev/vmm
total 1 dr-xr-xr-x 2 root wheel 512 Mar 17 12:19 ./ dr-xr-xr-x 14 root wheel 512 Mar 17 06:38 ../ crw------- 1 root wheel 0x1a2 Mar 17 12:20 guestname crw------- 1 root wheel 0x19f Mar 17 12:19 linuxguest crw------- 1 root wheel 0x1a1 Mar 17 12:19 otherguest
Uma máquina virtual especificada pode ser destruída usando bhyvectl
:
#
bhyvectl --destroy --vm=
guestname
Para configurar o sistema para iniciar os sistemas operacionais convidados do bhyve no momento da inicialização, as seguintes configurações devem ser feitas nos arquivos especificados:
/etc/sysctl.conf
net.link.tap.up_on_open=1
/etc/rc.conf
cloned_interfaces="bridge0
tap0
" ifconfig_bridge0="addmigb0
addmtap0
" kld_list="nmdm vmm"
All FreeBSD documents are available for download at https://download.freebsd.org/ftp/doc/
Questions that are not answered by the
documentation may be
sent to <freebsd-questions@FreeBSD.org>.
Send questions about this document to <freebsd-doc@FreeBSD.org>.