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.
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.
Para executar um Xen™ Dom0 no FreeBSD, a maquina deve ser inicializada usando o boot legado (BIOS).
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"
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.
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/
-o12.0
/FreeBSD-12.0
-RELEASE-amd64-bootonly.isofreebsd.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"name = "freebsd"
memory = 1024
vcpus = 2
vif = [ 'mac=00:16:3E:74:34:32,bridge=bridge0' ]
disk = [ '/dev/zvol/tank/xendisk0,raw,hda,rw',
'/root/freebsd.iso,raw,hdc:cdrom,r'
] vnc = 1
vnclisten = "0.0.0.0" serial = "pty" usbdevice = "tablet"
Estas linhas são explicadas com mais detalhes:
Isso define que tipo de virtualização usar. | |
Nome desta máquina virtual para distingui-la de outras executadas no mesmo Dom0. Requerido. | |
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. | |
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. | |
Adaptador de rede virtual. Esta é a bridge conectada à interface de rede do host. O parâmetro | |
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. | |
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. | |
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. |
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
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.
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™.
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 <freebsd-xen@FreeBSD.org>
e < xen-devel@lists.xenproject.org>
para uma análise mais aprofundada.
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 <freebsd-xen@FreeBSD.org>
e <xen-devel@lists.xenproject.org>
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>.