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 http://ark.intel.com/search/advanced?s=t&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:
#ifconfigtap0create#sysctl net.link.tap.up_on_open=1net.link.tap.up_on_open: 0 -> 1#ifconfigbridge0create#ifconfigbridge0addmigb0addmtap0#ifconfigbridge0up
Crie um arquivo para usar como o disco virtual da máquina convidada. Especifique o tamanho e o nome do disco virtual:
#truncate -s16Gguest.img
Baixe uma imagem de instalação do FreeBSD para instalar:
#fetchFreeBSD-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 -c1-m1024M-ttap0-dguest.img-i -IFreeBSD-10.3-RELEASE-amd64-bootonly.isoguestname
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 -c4-m1024M-ttap0-dguest.imgguestname
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 -s16Glinux.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 -M1024Mlinuxguest
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)/isolinuxboot.cat boot.msg grub.conf initrd.img isolinux.bin isolinux.cfg memtest splash.jpg TRANS.TBL vesamenu.c32 vmlinuz grub>linux (cd0)/isolinux/vmlinuzgrub>initrd (cd0)/isolinux/initrd.imggrub>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-m1024Mlinuxguest
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 -Mgrub>1024Mlinuxguestls(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_rootgrub>initrd (hd0,msdos1)/initramfs-2.6.32-431.el6.x86_64.imggrub>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-m1024Mlinuxguest
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:5900w= e 800h= e o bhyve pode ser instruído para aguardar uma conexão VNC antes de inicializar o sistema operacional convidado adicionando 600wait. O framebuffer pode ser acessado pelo host ou pela rede através do protocolo VNC.
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 \ -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 -V16G-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-m1024Mlinuxguest
É 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-m1024Mlinuxguest#cu -lConnected 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/vmmtotal 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="bridge0tap0" ifconfig_bridge0="addmigb0addmtap0" 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>.