21.8. FreeBSD como Host Xen

O Xen é um hypervisor tipo 1 licenciado sob a GPLv2 para arquiteturas Intel® e ARM®. O FreeBSD suporta domínios não privilegiados (máquina virtual) nas plataformas i386™ e AMD® 64-Bit DomU e Amazon EC2 desde o FreeBSD 8.0 e incluiu o suporte ao domínio de controle Dom0 (host) no FreeBSD 11.0. O suporte para domínios para-virtualizados (PV) foi removido do FreeBSD 11 em favor de domínios virtualizados de hardware (HVM), o que proporciona melhor desempenho.

O Xen™ é um hypervisor bare-metal, o que significa que é o primeiro programa carregado após o BIOS. Um convidado especial privilegiado chamado Domain-0 (Dom0 para abreviar) é então iniciado. O Dom0 usa seus privilégios especiais para acessar diretamente o hardware físico subjacente, tornando-o uma solução de alto desempenho. Ele é capaz de acessar os controladores de disco e adaptadores de rede diretamente. As ferramentas de gerenciamento do Xen™ para gerenciar e controlar o hypervisor Xen™ também são usadas pelo Dom0 para criar, listar e destruir VMs. Dom0 fornece discos virtuais e recursos de rede para domínios sem privilégios, geralmente chamados de DomU. O Xen™ Dom0 pode ser comparado ao console de serviço de outras soluções de hypervisor , enquanto o DomU é onde as VMs convidadas são executadas.

O Xen™ pode migrar VMs entre diferentes servidores Xen™. Quando os dois hosts xen compartilham o mesmo armazenamento subjacente, a migração pode ser feita sem a necessidade de primeiro desligar a VM. Em vez disso, a migração é executada ao vivo enquanto o DomU está em execução e não há necessidade de reiniciá-lo ou planejar um tempo de inatividade. Isso é útil em cenários de manutenção ou em janelas de atualização para garantir que os serviços fornecidos pelo DomU continuem disponiveis. Muitos outros recursos do Xen™ estão listados na página wiki com a visão global sobre o Xen. Note que ainda nem todos os recursos são suportados no FreeBSD.

21.8.1. Requisitos de hardware para o Xen™ Dom0

Para executar o hypervisor Xen™ em um host, são necessárias certas funcionalidades de hardware. Os domínios virtualizados de hardware requerem o suporte à Tabela de Páginas Estendidas (EPT) e à Unidade de Gerenciamento de Memória de Entrada / Saída (IOMMU) no processador do host.

Nota:

Para executar um Xen™ Dom0 no FreeBSD, a maquina deve ser inicializada usando o boot legado (BIOS).

21.8.2. Configuração do Xen™ Dom0 Domínio de Controle

Os usuários do FreeBSD 11 devem instalar os pacotes emulators/xen-kernel47 e sysutils/xen-tools47 que são baseados no Xen versão 4.7. Sistemas rodando o FreeBSD-12.0 ou mais novo podem usar o Xen 4.11 fornecido por emulators/xen-kernel411 e sysutils/xen-tools411, respectivamente.

Os arquivos de configuração devem ser editados para preparar o host para a integração do Dom0 após a instalação dos pacotes do Xen. Uma entrada para /etc/sysctl.conf desabilita o limite de quantas páginas de memória podem ser conectadas. Caso contrário, as VMs do DomU com requisitos de memória mais altos não serão executadas.

# echo 'vm.max_wired=-1' >> /etc/sysctl.conf

Outra configuração relacionada à memória envolve a alteração do /etc/login.conf, configurando a opção memorylocked para unlimited. Caso contrário, a criação de domínios DomU poderá falhar com erros Cannot allocate memory. Depois de fazer a mudança no /etc/login.conf, execute o comando cap_mkdb para atualizar o banco de dados de recursos. Veja Seção 13.13, “Limites de Recursos” para detalhes.

# sed -i '' -e 's/memorylocked=64K/memorylocked=unlimited/' /etc/login.conf
# cap_mkdb /etc/login.conf

Adicione uma entrada para o console do Xen™ ao /etc/ttys:

# echo 'xc0     "/usr/libexec/getty Pc"         xterm   onifconsole  secure' >> /etc/ttys

A seleção de um kernel Xen™ no /boot/loader.conf ativa o Dom0. O Xen™ também requer recursos como CPU e memória da máquina host para ele mesmo e para outros domínios DomU. Quanto de CPU e memória depende dos requisitos individuais e das capacidades de hardware. Neste exemplo, 8 GB de memória e 4 CPUs virtuais são disponibilizados para o Dom0. O console serial também é ativado e as opções de log são definidas.

O seguinte comando é usado para pacotes Xen 4.7:

# sysrc -f /boot/loader.conf hw.pci.mcfg=0
# sysrc -f /boot/loader.conf if_tap_load="YES"
# sysrc -f /boot/loader.conf xen_kernel="/boot/xen"
# sysrc -f /boot/loader.conf xen_cmdline="dom0_mem=8192M dom0_max_vcpus=4 dom0pvh=1 console=com1,vga com1=115200,8n1 guest_loglvl=all loglvl=all"

Para as versões Xen 4.11 e superiores, o seguinte comando deve ser usado:

# sysrc -f /boot/loader.conf if_tap_load="YES"
# sysrc -f /boot/loader.conf xen_kernel="/boot/xen"
# sysrc -f /boot/loader.conf xen_cmdline="dom0_mem=8192M dom0_max_vcpus=4 dom0=pvh console=com1,vga com1=115200,8n1 guest_loglvl=all loglvl=all"

Dica:

Os arquivos de log criados pelo Xen™ para as VMs do DomU são armazenados em /var/log/xen. Por favor, certifique-se de verificar o conteúdo do diretório em caso de problemas.

Ative o serviço xencommons durante a inicialização do sistema:

# sysrc xencommons_enable=yes

Essas configurações são suficientes para iniciar um sistema habilitado para Dom0. No entanto, falta a funcionalidade de rede para as máquinas DomU. Para corrigir isso, defina uma interface em bridge com a NIC principal do sistema que as VMs DomU poderão usar para se conectar à rede. Substitua em0 pelo nome da interface de rede do host.

# sysrc cloned_interfaces="bridge0"
	  # sysrc ifconfig_bridge0="addm em0 SYNCDHCP"
	  # sysrc ifconfig_em0="up"

Reinicie o host para carregar o kernel Xen™ e inicie o Dom0.

# reboot

Após inicializar com sucesso o kernel Xen™ e efetuar login no sistema novamente, a ferramenta de gerenciamento do Xen™, xl é usada para mostrar informações sobre os domínios.

# xl list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0  8192     4     r-----     962.0

A saída confirma que o Dom0 (chamado Domain-0) tem o ID 0 e está em execução. Ele também possui a memória e as CPUs virtuais que foram definidas anteriormente no /boot/loader.conf. Mais informações podem ser encontradas na Documentação do Xen. Agora as VMs convidadas do DomU podem ser criadas.

21.8.3. Configuração da VM Convidada Xen™ DomU

Domínios desprivilegiados consistem em um arquivo de configuração e discos rígidos virtuais ou físicos. Os discos virtuais para armazenamento do DomU podem ser arquivos criados pelo truncate(1) ou volumes ZFS, conforme descrito em Seção 19.4.2, “Criando e Destruindo Volumes”. Neste exemplo, um volume de 20 GB é usado. Uma VM é criada com o volume ZFS, uma imagem ISO do FreeBSD, 1 GB de RAM e duas CPUs virtuais. O arquivo ISO de instalação é obtido com o fetch(1) e salvo localmente em um arquivo chamado freebsd.iso.

# fetch ftp://ftp.freebsd.org/pub/FreeBSD/releases/ISO-IMAGES/12.0/FreeBSD-12.0-RELEASE-amd64-bootonly.iso -o freebsd.iso

Um volume de 20 GB do ZFS chamado xendisk0 é criado para servir como espaço em disco para a VM.

# zfs create -V20G -o volmode=dev zroot/xendisk0

A nova VM DomU convidada é definida em um arquivo. Algumas definições específicas, como nome, mapa de teclado e detalhes da conexão VNC, também são definidas. O seguinte freebsd.cfg contém uma configuração mínima de DomU para este exemplo:

# cat freebsd.cfg
builder = "hvm" 1
name = "freebsd" 2
memory = 1024 3
vcpus = 2 4
vif = [ 'mac=00:16:3E:74:34:32,bridge=bridge0' ] 5
disk = [
'/dev/zvol/tank/xendisk0,raw,hda,rw', 6
'/root/freebsd.iso,raw,hdc:cdrom,r' 7
  ]
vnc = 1 8
vnclisten = "0.0.0.0"
serial = "pty"
usbdevice = "tablet"

Estas linhas são explicadas com mais detalhes:

1

Isso define que tipo de virtualização usar. hvm refere-se à virtualização assistida por hardware ou à máquina virtual de hardware. Os sistemas operacionais convidados podem ser executados sem modificação em CPUs com extensões de virtualização, fornecendo quase o mesmo desempenho que a execução em hardware físico. generic é o valor padrão e cria um domínio PV.

2

Nome desta máquina virtual para distingui-la de outras executadas no mesmo Dom0. Requerido.

3

Quantidade de RAM em megabytes para disponibilizar para a VM. Esse valor é subtraído da memória total disponível do hypervisor, não da memória do Dom0.

4

Número de CPUs virtuais disponíveis para a VM convidada. Para um melhor desempenho, não crie convidados com mais CPUs virtuais do que o número de CPUs físicas no host.

5

Adaptador de rede virtual. Esta é a bridge conectada à interface de rede do host. O parâmetro mac é o endereço MAC definido na interface de rede virtual. Este parâmetro é opcional, se nenhum MAC for fornecido, o Xen™ irá gerar um aleatório.

6

Caminho completo para o disco, arquivo ou volume ZFS do armazenamento em disco para essa VM. As opções e as várias definições de disco são separadas por vírgulas.

7

Define o meio de inicialização a partir do qual o sistema operacional inicial é instalado. Neste exemplo, é a imagem ISO baixada anteriormente. Consulte a documentação do Xen™ para outros tipos de dispositivos e outras opções para configurar.

8

Opções que controlam a conectividade do VNC para o console serial do DomU. Em ordem, estes são: ativa suporte ao VNC, define o endereço IP no qual escutar, device node para o console serial e o método de entrada para posicionamento preciso do mouse e outros métodos de entrada. keymap define qual mapa de teclas usar, sendo english por padrão.

Após o arquivo ter sido criado com todas as opções necessárias, o DomU é criado passando-o como um parâmetro para o comando xl create.

# xl create freebsd.cfg

Nota:

Cada vez que o Dom0 é reiniciado, o arquivo de configuração deve ser passado para xl create novamente para recriar o DomU. Por padrão, somente o Dom0 é criado após uma reinicialização, não as VMs individuais. As VMs podem continuar de onde pararam, pois armazenaram o sistema operacional no disco virtual. A configuração da máquina virtual pode mudar com o tempo (por exemplo, ao adicionar mais memória). Os arquivos de configuração da máquina virtual devem ter um backup e manter-se disponíveis para poder recriar a VM convidada quando necessário.

A saída de xl list confirma que o DomU foi criado.

# xl list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0  8192     4     r-----  1653.4
freebsd                                      1  1024     1     -b----   663.9

Para iniciar a instalação do sistema operacional base, inicie o cliente VNC, direcionando-o para o endereço de rede principal do host ou para o endereço IP definido na linha vnclisten do freebsd.cfg. Depois que o sistema operacional tiver sido instalado, desligue o DomU e desconecte o visualizador VNC. Edite o freebsd.cfg, removendo a linha com a definição cdrom ou comentando-a inserindo um caractere # no início da linha. Para carregar esta nova configuração, é necessário remover o DomU antigo com xl destroy, passando o nome ou o id como parâmetro. Depois, recrie-o usando o freebsd.cfg modificado.

# xl destroy freebsd
# xl create freebsd.cfg

A máquina pode então ser acessada novamente usando o visualizador VNC. Desta vez, ele será inicializado a partir do disco virtual em que o sistema operacional foi instalado e pode ser usado como uma máquina virtual.

21.8.4. Solução de problemas

Esta seção contém informações básicas para ajudar a solucionar problemas encontrados ao usar o FreeBSD como host ou convidado do Xen™.

21.8.4.1. Solução de problemas de inicialização do host

Observe que as dicas de solução de problemas a seguir são destinadas ao Xen™ 4.11 ou mais recente. Se você ainda estiver usando o Xen™ 4.7 e tendo problemas, considere migrar para uma versão mais recente do Xen™.

Para solucionar problemas de inicialização do host, você provavelmente precisará de um cabo serial ou de um cabo USB de depuração. Uma saída de boot verbosa do Xen™ pode ser obtida adicionando-se parametros à opção xen_cmdline encontrada no loader.conf. Alguns parametros de depuração relevantes são:

  • iommu=debug: pode ser usado para imprimir informações de diagnóstico adicionais sobre o iommu.

  • dom0=verbose: pode ser usado para imprimir informações de diagnóstico adicionais sobre o processo de compilação dom0.

  • sync_console: flag para forçar a saída síncrona do console. Útil para depuração para evitar a perda de mensagens devido à limitação de taxa. Nunca use essa opção em ambientes de produção, pois ela pode permitir que convidados mal-intencionados realizem ataques DoS contra o Xen™ usando o console.

O FreeBSD também deve ser inicializado no modo verbose para identificar quaisquer problemas. Para ativar a inicialização detalhada, execute este comando:

# sysrc -f /boot/loader.conf boot_verbose="YES"

Se nenhuma dessas opções ajudar a resolver o problema, envie o registro de inicialização serial para e para uma análise mais aprofundada.

21.8.4.2. Solução de problemas na criação de VMs convidadas

Problemas também podem surgir ao criar convidados, as informações a seguir tentam fornecer alguma ajuda para aqueles que precisarem diagnosticar problemas de criação de convidados.

A causa mais comum de falhas na criação de convidados é o comando xl cuspindo algum erro e saindo com um código de retorno diferente de 0. Se o erro fornecido não for suficiente para ajudar a identificar o problema, uma saída mais detalhada pode ser obtida do comando xl usando-se a opção v repetidamente.

# xl -vvv create freebsd.cfg
Parsing config from freebsd.cfg
libxl: debug: libxl_create.c:1693:do_domain_create: Domain 0:ao 0x800d750a0: create: how=0x0 callback=0x0 poller=0x800d6f0f0
libxl: debug: libxl_device.c:397:libxl__device_disk_set_backend: Disk vdev=xvda spec.backend=unknown
libxl: debug: libxl_device.c:432:libxl__device_disk_set_backend: Disk vdev=xvda, using backend phy
libxl: debug: libxl_create.c:1018:initiate_domain_create: Domain 1:running bootloader
libxl: debug: libxl_bootloader.c:328:libxl__bootloader_run: Domain 1:not a PV/PVH domain, skipping bootloader
libxl: debug: libxl_event.c:689:libxl__ev_xswatch_deregister: watch w=0x800d96b98: deregister unregistered
domainbuilder: detail: xc_dom_allocate: cmdline="", features=""
domainbuilder: detail: xc_dom_kernel_file: filename="/usr/local/lib/xen/boot/hvmloader"
domainbuilder: detail: xc_dom_malloc_filemap    : 326 kB
libxl: debug: libxl_dom.c:988:libxl__load_hvm_firmware_module: Loading BIOS: /usr/local/share/seabios/bios.bin
...

Se a saída detalhada não ajudar a diagnosticar o problema, verifique também os logs do toolstack QEMU e do Xen™ em /var/log/xen. Observe que o nome do domínio é anexado ao nome do registro, portanto, se o domínio tiver o nome freebsd, você deverá encontrar um /var/log/xen/xl-freebsd.log e provavelmente um /var/log/xen/qemu-dm-freebsd.log . Ambos os arquivos de log podem conter informações úteis para a depuração. Se nada disso ajudar a resolver o problema, envie a descrição do problema que você está enfrentando e o máximo de informações possíveis para e para obter ajuda.

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>.