351 Full Virtualization

From Documentacao LPI
Jump to: navigation, search

Contents

351.1 Virtualization Concepts and Theory (peso: 6)

Objetivo do tópico:

351.1 Virtualização, conceitos e teoria (weight: 6)

Peso 6
Description Candidato deve conhecer e entender os conceitos gerais, teoricos e terminologias da virtualização. Isto inclui Xen, QEMU e Libvirt.

Principais áreas de conhecimento:

  • Compreender a terminologia de virtualização
  • Compreender os prós e contras da virtualização
  • Compreender os vários tipos de Hypervisors e Virtual Machine Monitors
  • Compreender os principais aspectos da migração de máquinas físicas para virtuais (p2v)
  • Compreender os principais aspectos da migração de máquinas virtuais entre sistemas host (v2v)
  • Compreender os recursos e implicações da virtualização para uma máquina virtual, tais como snapshotting, pausing, cloning e resource limits
  • Conhecimento de oVirt, Proxmox, systemd-machined e VirtualBox
  • Conhecimento de Open vSwitch

The following is a partial list of the used files, terms and utilities:

  • Hypervisor
  • Hardware Virtual Machine (HVM)
  • Paravirtualization (PV)
  • Emulation and Simulation
  • CPU flags
  • /proc/cpuinfo
  • Migration (P2V, V2V)



Terminologia

  • Hypervisor

Hypervisor, também chamado de Virtual Machine Manager (VMM), é uma de muitas técnicas de virtualização por hardware, permitindo múltiplos sistemas operacionais, chamados guests, rodarem concorrentemente em um mesmo computador host. É chamado de hypervisor porque conceitualmente é um nível superior que um programa de supervisão. O hypervisor apresenta para os sistemas operacionais convidados uma plataforma operacional virtual e gerencia a execução dos sistemas operacionais convidados. Múltiplas instâncias de uma variedade de sistemas operacionais podem compartilhar o recurso de hardware virtualizado. Hypervisors são muito comumente instalados no hardware do servidor, com a função de executar sistemas operacionais convidados. Alguns exemplos de Hypervisors são: Xen, KVM.

  • HVM (HardwareVirtualMachine)

Hardware com suporte a virtualização (hardware-assisted virtualization) é um tipo de plataforma de virtualização que habilita uma eficiente virtualização completa (full virtualization) usando a ajuda de recursos de hardware compatível, principalmente do processador do host. Virtualização completa (full virtualization) é utilizada para simular um completo ambiente de hardware, ou maquina virtual, no qual um sistema operacional não modificado (usando as mesmas instruções configuradas na maquina host) executa em um isolamento completo. O hardware com suporte a virtualização (hardware-assisted virtualization) foi adicionado aos processadores x86 (Intel VT-x ou AMD-V) em 2006. Virtualização assistida por hardware também é conhecida como virtualização acelerada; Xen chama de hardware da máquina virtual (HVM).

  • PV(Paravirtualization)- Paravirtualização

Paravirtualização é uma tecnica de virtualização que apresenta uma interface de software para a maquina virtual similar mas não idêntica a do hardware.

    • A intenção da interface de software modificada é reduzir a parcela de tempo de execução do cliente gasto em operações que são substancialmente mais difíceis de serem executadas em um ambiente virtual em comparação com a realizada em um ambiente não virtualizado. A paravirtualização fornece "ganchos" especialmente definidos para permitir que o visitante 'realoque' estas tarefas sendo acolhidas pelo Host que reconhece essas tarefas, que seriam executados no domínio virtual (onde o desempenho de execução é pior). Uma plataforma paravirtualizada bem sucedida pode permitir que o monitor de máquina virtual (VMM) (realocando a execução de tarefas críticas da maquina virtual(Dominio virtual) para o host (Domínio Host)), reduza a degradação do desempenho geral da máquina em execução dentro do cliente(guest).
    • Com isso a paravirtualização requer que o sistema operacional do cliente(guest) seja portado para esta API. Os sistemas operacionais convencionais não suportam paravirtualização e não podem ser executados em um gerenciador de maquinas virtuais paravirtualizado, eles devem ser modificados para que suportem a paravirtualização. No caso do GNU/Linux, Kernels específicos adotando estas modificações são necessários. No entanto, mesmo nos casos em que o sistema operacional não pode ser modificado, ainda componentes podem estar disponíveis que permitem muitas das vantagens significativas de desempenho de virtualização; por exemplo, o projeto XenWindowsGplPv fornece um kit de drivers de dispositivo de paravirtualização, licenciado sob os termos da GPL, que se destinam a ser instalado em um cliente(Guest) Microsoft Windows em execução no hypervisor Xen. Outro exemplo é o conjunto de drivers Virtio que são instalados no Windows e Linux, permitindo o uso de dispositivos paravirtualizados, como placas de rede e controladores de disco em ambientes KVM.
  • Emulação e simulação (Emulation and simulation):

Em design de circuitos integrados, emulação de hardware é o processo de imitar o comportamento de uma ou mais peças de hardware (tipicamente um sistema em desenvolvimento) com outra peça de hardware, tipicamente uma emulação de sistema para fins específicos. O modelo de emulação é baseado usualmente no código fonte RTL (ex. Verilog) que é compilado no formato pelo sistema de emulação. O objetivo é normalmente depuração e verificação funcional do sistema que está sendo projetado. Muitas vezes, um emulador é rápido o suficiente para ser conectado no lugar de um chip ainda a ser construído, por isso todo o sistema pode ser depurado com dados ao vivo. Este é um caso específico de emulação em circuito.

    • Às vezes emulação de hardware pode ser confundida com dispositivos de hardware como placas de expansão com processadores de hardware que auxiliam funções de emulação de software, tais como placas de expansão mais velhas com chips x86 para permitir que sistemas operacionais x86 rodem em placas-mãe de diferentes famílias de processadores.
    • Uma simulação de computador, um modelo de computador, ou um modelo computacional é um programa de computador ou rede de computadores, que tenta simular um modelo abstrato de um sistema particular. As simulações de computador tornaram-se uma parte útil de modelagem matemática de muitos sistemas naturais em física (física computacional), astrofísica, química e biologia, sistemas humanos em economia, psicologia, ciências sociais e engenharia. Simulação de um sistema é representada como o funcionamento do modelo do sistema. Ele pode ser usado para explorar e obter novas perspectivas sobre novas tecnologias, e para estimar o desempenho de sistemas muito complexos de soluções analíticas.
  • CPU Flags:

Indicam os recursos suportados pelos processadores. Flags relevantes para virtualização:

    • HVM: Suporte de Hardware para maquinas virtuais (No Xen AMD SVM / Intel VMX)
    • SVM: Secure Virtual Machine. (Extensão de virtualização da AMD para arquitetura 64-bits e x86, equivalente ao intel VMX, ambos são conhecidos como HVM no Hypervisor Xen)
    • VMX: Equivalente Intel do AMD SVM

Onde identificar estas informações no Host Gnu/linux:

# cat /proc/cpuinfo
  • Container Virtualization:

Uma virtualização baseada em container, provê compartilhamento, imagem de sistema operacional virtualizada consistindo em um filesystem root, um compartilhamento seguro de bibliotecas de sistemas e executáveis. Cada VM pode ser iniciada, desligada e reiniciada, como uma operação regular de sistema. Recursos como espaço em disco, garantias de CPU, memória, etc. são definidos para cada VM na criação, ou podem ser alteradas dinamicamente como o sistema em execução. As aplicações e usuários de uma maquina virtual baseada em container ficam isolados em cada VM assim como em hosts separados.

  • Principais Características:
    • O kernel do host é compartilhado com os containers
    • Não necessita de virtualização de hardware assistida (HVM)
    • Limita-se a guests com Sistemas Operacionais Linux pela necessidade de compartilhamento de kernel
    • Menor utilização de recursos de memória e CPU em comparação com a utilização de virtualização tradicional, por trabalhar sobre o mesmo kernel

Prós e contra da virtualização

Vantagens do sistema de virtualização

  • Múltiplos ambientes de sistemas operacionais podem coexistir em um mesmo computador, com forte isolamento entre eles
  • A máquina virtual pode proporcionar um conjunto de instruções que é diferente do que a da máquina real
  • Provisionamento de aplicações, manutenção, alta disponibilidade e recuperação de desastres
  • Utilização mais eficiente dos recursos de hardware

As principais desvantagens do sistema de virtualização são:

  • A maquina virtual é menos eficiente que a maquina real por acessar recursos de hardware indiretamente.
  • Quando múltiplas maquinas virtuais rodam concorrentemente no mesmo host físico, cada VM pode exibir uma performance instável e variada, porque dependente da carga de trabalho impostas ao sistema por outras VMs, a menos que as técnicas apropriadas sejam utilizados para isolamento temporal entre máquina virtual

Vários tipos de Hypervisors e Virtual Machine Monitors

Virtual Machine Monitor, ou Monitor de Maquina virtual é o software que cria um ambiente de máquina virtual em um computador. Em um ambiente regular, não-virtual, o sistema operacional é o programa de controle mestre, que gerencia a execução de todas as aplicações e atua como uma interface entre os aplicativos e o hardware. O sistema operacional tem o maior nível de privilégio na máquina, conhecida como "ring 0" (Anel 0).

  • Em um ambiente de maquinas virtuais, o virtual machine monitor (VMM) torna-se o programa controlador mestre, com o maior nível de privilégio e o VMM gerencia um ou mais sistemas operacionais, agora referidos como guest ou sistemas operacionais clientes. Cada Sistema Operacional guest, gere suas aplicações normalmente como um ambiente não virtual, exceto pelo fato de estar isolado pelo VMM. Cada sistema operacional guest com suas aplicações é conhecido também como uma "máquina virtual" e é às vezes chamado de "Guest OS Stack".
  • Antes da introdução do hardware com suporte a virtualização, o VMM apenas usava técnicas de software para virtualização de processadores x86 e provendo hardware virtual. Esta abordagem de software, tradução binária (BT), foi usada para instruções de virtualização e unidades de gerenciamento de memória. Hoje e dia tanto a Intel como a AMD provem suporte de hardware para virtualziação com Inter VT-x e AMD-V, respectivamente. Mais recentemente foi adicionado suporte para virtualização do gerenciamento de unidade de memória (memory management unit - MMU) com Intel EPT e AMD RVI. Em processadores x86 modernos o VMM tem a opção de escolher entre vários modos de gerenciamento possíveis. No entanto, nem todos os modos proporcionam um desempenho similar. Depende de muita coisa como os recursos de CPU disponíveis e o comportamento sistema operacional convidado (guest). O VMware ESX identifica a plataforma de hardware e escolhe um modo de gerenciamento padrão para um guest especial nessa plataforma. Esta decisão é feita pelo VMM com base nos recursos de CPU disponíveis na plataforma e do comportamento do convidado nessa plataforma.

Migrações P2V

A conversão de hosts físicos para maquinas virtuais é uma técnica chamada de p2v Physical to Virtual. O procedimento P2V pode ser feito de várias formas e depende do tipo do host e algumas características particulares.

  • Uma das maneiras é utilizar um software de cópia das configurações da maquina, como Clonezilla ou outro similar, restaurando em seguida esta cópia em uma Maquina Virtual anteriormente criada.
  • Outra técnica é a utilização de um programa intermediário e outro software cliente. A máquina física é iniciada pelo software cliente que é acessado pelo programa intermediário. Com esta conexão estabelecida o software intermediário faz a cópia dos dados, seguido pela criação da maquina virtual e a restauração dos dados da maquina física na maquina virtual criada.
    • Um exemplo de software que trabalha desta forma é o virt-v2v e virt-p2v.

Migrações V2V

A migração de maquinas virtuais entre hosts com diferentes Virtual Machine Managers são chamados de V2V ou seja Virtual para Virtual. Existem várias tecnicas que permitem a migração das maquinas virtuais entre hosts diferentes. No caso de hosts compatíveis, a migração é basicamente transparente.

  • No caso de hosts diferentes e com VMM não diretamente compatíveis, pode-se utilizar as mesmas técnicas do modelo P2V ou fazer a exportação dos discos da Maquina Virtual utilizando o formato comum padrão chamado de OVF (Open Virtualization Format), seguido da importação da imagem pelo novo host.

Snapshotting, pausing, cloning e resource limits

  • Snapshot: É um recurso que permite salvar o estado atual da máquina virtual. Com o guest inicializado, salva os dados de memória, CPU e disco. Trabalha da seguinte forma: 1 - Pausa as operações na VM; 2 - Cria uma imagem de disco especial; 3 - Salva o estado da CPU e o conteúdo da RAM; 4- Garante que o disco virtual original não será modificado por operações de escrita; 5 - Continua com as operações de escrita na VM. Por definição após o snapshot, os dados modificados (a diferença da imagem original) são salvos no novo ambiente. Modelo chamado de copy-On-write. O snapshot permite executar o rolling-back ou seja retornar ao estado anterior ao snapshot. Detalhes Snapshot no qemu. Ao Excluir o snapshot, antigo um 'merge' é feito com o disco principal.
  • Pause: É um recurso que pausa a máquina virtual e todos os seus trabalhos em execução. Pode ser importante para pausar processamento que compromete o host, por exemplo. O resume, retoma os dados a partir do ponto pausado.
  • Clone: Permite fazer uma cópia da VM. Pode ser feito de forma on-line utilizando os mesmos métodos do snapshot. Existe a opção do linked clone, onde o novo disco é criado, como uma snapshot do disco principal. Essa funcionalidade reduz espaço em disco ocupado, porém não é muito performático.
  • Limitação de recursos: É possível limitar os recursos máximos que serão consumidos pela máquina virtual, para que ela não comprometa os recursos de outras VMs que rodam no mesmo host, CPU, memória, rede e disco[1]. No geral é utilizado o CGroups Cgroups in freedesktop para priorizar o consumo de recursos. Isto faz parte do conceito de isolamento da VM (guest)

oVirt, Proxmox, systemd-machined e VirtualBox

oVIrt:

oVirt é uma aplicação de gerenciamento de virtualização. A arquitetura da aplicação utiliza o oVirt Management interface (oVirt engine) para gerenciar os nodes, storages e resursos de rede, assim como criar e monitorar maquinas virtuais rodando no data center. oVirt é a base do Red Hat Enterprise Virtualization (RHEV).

  • Algumas características do oVirt:
    • Gerencia múltiplas maquinas virtuais
    • Sofisticada interface de usuário permite gerenciar todos os aspectos de um datacenter de virtualização
    • Escolha de maneiras de alocação de VMs no host
    • Live Migration de VMs de um hypervisor para outro
    • Adição de um novo nó hypervisor é fácil e centralizado
    • Monitorar recursos usados nas VMs
    • Gerenciar cotas de uso de recursos (Storage, compute, rede)
    • Console de Auto-serviço para uso simples (para usuarios-VDI) ou avançado
    • Contruído no hypervisor KVM
    • OpenSource
  • Arquitetura Ovirt: O oVirt é dividido em módulos que cumprem tarefas específicas
    • Host: RH (ou CentOS) 6 ou 7 com KVM
    • Agentes e ferramentas que rodam no HOST(Node): VDSM, QEMU e Libvirt.
    • oVirt Manager: RH (ou CentOS) 6. Gerenciamento centralizado. Aplicação Java e Interface gráfica de gerenciamento
    • Storage Domains: Armazenamento
    • Database: Pode ficar junto com o oVirt. Banco de dados do estado das VMs
    • Acesso a Serviço de diretório externo para autenticação
    • Networking: Links fisicos e logicos
  • Ambiente Ovirt: Definições dentro do uso do oVirt
    • Data Center: Container de mais alto nível tanto para recusrsos físicos como lógicos. è uma coleção de cluster, VM, storage e networks
    • Cluster: É a configuração de hosts físicos e trata Pool de recursos. Hosts no cluster compartilham mesma infra estrutura de rede e storage. No cluster as vms podem ser movidas de um host para outro.
    • Logical Network: É a representação lógica da rede física. Grupo de redes lógicas agrupam trafico de rede e comunicação entre oVirt, Hosts, storage e VM
    • Host: O Host é um servidor físico que pode rodar uma ou várias VMs. Hosts são agrupados no cluster.
    • Storage Pool: É a entidade lógica que contém o repositório padrão para imagens. Pode ser tipo iSCSI, Fibre Channel, NFS ou POSIX. Cada storage pool pode conter vários domains para guardar virtual machine disks, ISO imagens e outros.
    • Virtual Machine: É a maquina virtual (VM) com o sistema operacional e configuração de aplicativos. VMs semelhantes podem ser criadas em um Pool.
    • Template: É um modelo de VM com as configuraçoes pré-definidas. Usando o Template é possível criar várias maquinas virtuais com apenas um passo.
    • Virtual Machine Pool: É um grupo de VMs identicas que estão disponíveis sob demanda por membros do grupo. Pode ser usado para diferentes propósitos. Por exemplo para dvidir VMs por departamentos.
    • Snapshot: É a visão de uma VM com suas configurações em um determinado tempo.
    • User Types: Vários levels de permissões podem ser usados
    • Events and Monitors: Alertas, warnings e outras noticias sobre atividades. Monitor de performance e status de recursos
    • Reports: Baseado no JasperReports. Relatórios gerados pelo report module. Usuarios podem usar comandos SQL para ver dados de hosts, VMs e storages.

Proxmox:

O Proxmox é um ambiente completo de gerenciamento de virtualização de máquinas e containers [2]. Utiliza para virtualização o KVM/Qemu e para containers o LXC. Apesenta uma interface gráfica web para gerenciamento completo do ambiente.

  • Permite trabalhar em cluster com vários nós e suporta várias funcionalidades, entre elas se destaca:
    • Suporte a vários modelos de storages locais e de rede, como LVM, LVM-thin, ZFS, NFS, SMB, iSCSI, FibreChannel, SAS
    • Suporta migração on-line, replicação de disco, etc
    • Suporte a conexão por API e uso por linha de comando
    • Integração com Ceph e Open-VSwitch

systemd-machined:

É uma implementação do SystemD para gerenciamento de containers e máquinas virtuais. Incluído a partir da versão 205(Jul/2013) ele permite o controle de VMs e containers através da integração destes com o SystemD.[3] , [4]

  • Componentes:
    • Biblioteca C: Para saber qual o status da VM
    • Dbus: Além do status permite o controle com inicialização e finalização destas.
    • Daemon systemd-machined [5]
  • Ferramentas:
    • Integrado ao systemctl
    • machinectl: Controla o daemon [6]
    • systemd-importd: Para importação como import-raw [7]

Virtualbox:

VirtualBox é uma aplicação de virtualização cross-platform, o que significa que ele pode ser instalado em arquiteturas Intel/AMD que estejam rodando Windows, Mac, Linux ou Solaris. o VirtualBox estende a capacidade do computador par que possa rodar múltiplos sistemas operacionais dentro de maquinas virtuais ao mesmo tempo. Por exempplo você pode rodar um Linux ou Windows dentro de um Mac, rodar Windows 2008 no seu servidor Linux ou mesmo rodar Linux em um PC com Windows. É possível instalar e rodar multiplas maquinas virtuais praticamente limitados pelo hardware (espaço em disco, e memória).

  • VirtualBox é simples, mas também muito poderoso. Ele pode ser executado em qualquer lugare a partir de pequenos sistemas embarcados ou máquinas desktop, até implantações de data center e até mesmo ambientes de nuvem.
  • Principais características:
    • Portabilidade: VirtualBox roda um largo número de sistemas operacionais 32 e 62 bits. (Várias versões de Windows, Linux, Mac e Solaris). O VirtualBox requer um sistema operacional existente para ser instalado. Assim, pode executar aplicativos existentes ao lado nesse host (Maquina que tem o VirtualBox instalado, também chamada de hospedeira). Maquinas virtuais criadas em um Host podem ser executadas em outro host com outro sistema operacional sem problemas. Adicionalmente as maquinas virtuais podem ser importadas e exportadas usando o formato OVF (Open Virtualization Format).
    • Hardware de Virtualização Não é necessário: Os recursos de processador como VT-x e AMD-V não são necessários para a criação e execução de maquinas virtuais.
    • Adição de funcionalidades de clientes: Chamado de Guest Additions, adicionam funcionalidades caso instalados nas maquinas virtuais, como compartilhamento de pastas e virtualização 3D. Provê um incremento de performance e integrações adicionais entre as maquinas virtuais e o Host.
    • Grande suporte a hardware: Multiprocessamnto SMP para VMs, até 32 CPUs virtuais; Suporte a dispositivos USB; Virtualização de inúmeros dispositivos como controladores SATA, placas de rede, placas de som assim como portas virtuais seriais e parelelas.
    • Suporte ACPI: A Advanced Configuration and Power Interface (ACPI) é suportada. VirtualBox pode até mesmo relatar a sistemas operacionais guests, alertas da ACPI sobre o status de energia do host.
    • Resoluções Multiscreen: o VirtualBox suporta várias resoluções de tela, permitindo inclusive o uso de vários monitores.
    • Suporte ISCSI: Esta feature permite conectar uma maquina virtual diretamente a um storage iSCSI sem passar pelo sistema do Host.
    • Boot-PXE: As VMs (guest) suportam boot por PXE
    • Snapshots: VirtualBox pode salvar snapshots arbitrárias do estado da máquina virtual. Você pode voltar no tempo e reverter a máquina virtual de qualquer snapshot e iniciar uma configuração alternativa da VM a partir daí. É possível criar e apagar snapshots enquanto a máquina virtual estiver em execução.
    • Grupos de maquinas virtuais: VirtualBox fornece um recurso de grupos que permite ao usuário organizar e controlar máquinas virtuais coletivamente, bem como individualmente. Em geral, as operações que podem ser realizadas em grupos são as mesmas que as que podem ser aplicadas para uma Maquina Virtual, ou seja, iniciar, pausar, Reset, Fechar, etc.
    • Arquitetura limpa: VirtualBox é estremamente modular e existe uma separação clara entre os códigos de cliente e servidor
    • Display de maquina remota: A Extensão da Área de Trabalho Remota do VirtualBox (VRDE) permite o acesso remoto de alto desempenho para qualquer máquina virtual em execução. Esta extensão suporta o Remote Desktop Protocol (RDP) originalmente construído para Microsoft Windows, com adições especiais para suporte ao cliente USB completo. Ele suporta diferentes sistemas operacionais na Maquina Virtual e não requer suporte a aplicativos na máquina virtual.
  • Funcionamento do VirtualBox:
    • Na ausência de um hardware com suporte a virtualização (VT-x e AMD-V), o VirtualBox adota a abordagem padrão de virtualização baseada a software. Neste modo guests de 32 bits são suportados.
    • O VirtualBox suporta tanto VT-x como AMD-V. Fazendo uso desta facilidade, o VirtualBox pode rodar cada VM Guest em um espaço de endereço separado. Alguns guests, incluindo maquinas virtuais de 64 bits, os guests SMP e certos OS proprietários, só são suportados por VirtualBox em hosts com virtualização assistida por hardware.
  • Os discos rígidos são emulados em um dos três formatos de imagem de disco:
    • Um recipiente de formato específico do VirtualBox, chamado de "Virtual Disk Image" (VDI), que são armazenados como arquivos (com a extensão .vdi) no sistema operacional hospedeiro;
    • VMware Virtual Machine Format Disk (VMDK);
    • Formato VHD Microsoft Virtual PC. Uma máquina virtual VirtualBox pode, portanto, usar discos que foram criados em VMware ou Microsoft Virtual PC, bem como o seu próprio formato nativo. O VirtualBox pode se conectar a partições raw no host, usando para isso os discos rígidos virtuais. VirtualBox emula IDE (PIIX4 e controladores ICH6), SCSI, SATA (controlador ICH8M) e controladores SAS para que os discos rígidos possam ser anexados.
  • Na configuração de rede Virtual Box utiliza por padrão o NAT para disponibilizar internet as maquinas virtuais. Rede Bridge via adaptador de rede do host ou rede virtual entre as maquinas virtuais guest podem ser configuradas. Até 36 adaptadores de rede podem ser atachados simultaneamente, mas somente 4 são configurados através da interface gráfica.
  • Gerenciamento

O VirtualBox possue duas interfaces padrões para gerenciamento, a primeira gráfica com acesso as configurações das maquinas virtuais e demais opções como rede, storage, etc. As maquinas virtuais podem ser iniciadas, paradas, pausadas por esta interface. Snapshots podem ser criados, e restaurados. Enfim praticamente todas as tarefas necessárias para administração e gerenciamento do VirtualBox.

  • A segunda interface de gerenciamento é o VBoxManage que é um utilitário de linha de comando que inclui opções de clonagem de discos e importação e exportação de sistemas de arquivos. Utilizando a interface de administração por linha de comando, o host não necessita de ambiente gráfico, liberando mais recursos para as maquinas virtuais. Abaixo alguns exemplos de utilização do VBoxManage.
* Lista as VMs registradas no host
# $ vboxmanage list vms

* Inicia a VM; onde VMNAME é o nome do guest
$ vboxmanage startvm "VMNAME"

* Pausar Máquina virtual
$ vboxmanage controlvm "VMNAME" pause

* Resummir Máquina virtual
$ vboxmanage controlvm "VMNAME" resume

* Parar Máquina virtual
$ vboxmanage controlvm "VMNAME" poweroff

* Mostra informações detalhadas da Maquina Virtual
$ vboxmanage showvminfo "VMNAME"

Open vSwitch

Open vSwitch[8] é uma espécie de switch virtual que serve para conectar, segmentar e rotear diferentes VMs e containers, inclusive entre hosts diferentes. Ele é populado/alimentado e consumido pelo SDN (rede definida por software) do controlador de virtuaização.

  • Implementa Segurança, QOS, Monitoramento e controle automatizado.

Open vSwitch (openvswitch, OVS) é uma alternativa à Linux native bridges, bonds, e interfaces vlan. Open vSwitch suporte, além das características clássicas dos switchs físicos, funções avançadas, como suporte RSTP (Rapid Spanning Tree) para prevenção de loops de rede, VXLANs, OpenFlow, e suporta multiple vlans em uma única bridge.

  • Tipos de configurações Open Vswitch:
    • HUB: Envia os pacotes para todas as portas (padrão)
    • Isolamento de portas: Configura portas separadas, sem acesso entre elas, conectando apenas grupos de vms
    • Aprendizado ou Learning, também chamado de l2population: Quando o switch aprende qual MAC responde por uma determinada porta e guarda essas informações em suas tabelas para otimizar o tráfego. Se não está em tabela alguma então envia para todas as portas.
    • Roteamento de VLANs: Permite rotear o tráfego internamente no switch, através de diferentes segmentos de redes. Vlans
    • Conexão entre OVS: Permite conectar diferentes hosts físicos comunicando com outros open vswitchs (OVS) conectando também com portas físicas do provedor para saída de rede.

A grande vantagem da utilização do Open vSwitch é a capacidade de gerenciamento e integração de diferentes hosts de virtualização para prover um ambiente de rede único e interconectado[9].

351.2 Xen (peso: 3)

Objetivo do tópico:

Peso 3
Description Os candidatos devem ser capazes de instalar, configurar, manter, migrar e solucionar problemas de instalações do Xen. O foco é no Xen versão 4.x.

Key Knowledge Areas:

  • Compreender a arquitetura do Xen, incluindo rede e storage
  • Configuração básica de nó Xen e domínios
  • Gerenciamento básico de nó Xen e domínios
  • Solução de problemas básico de instalações Xen
  • Conhecimento de XAPI
  • Conhecimento de XenStore
  • Conhecimento de Xen Boot Parameters
  • Conhecimento do xm utility

The following is a partial list of the used files, terms and utilities:

  • Domain0 (Dom0), DomainU (DomU)
  • PV-DomU, HVM-DomU
  • /etc/xen/
  • xl
  • xl.cfg
  • xl.conf
  • xentop


Arquitetura do Xen

Neste tópico serão apresentados os detalhes do funcionamento e a arquitetura do Project Xen.

  • O hypervisor Xen, roda diretamente sob o hardware e é responsável pelo tratamento de CPU, memória e interrupções. Ele é o primeiro programa rodando após finalizar o bootloader. Sob o hypervisor, rodam as maquinas virtuais. Uma instância de máquina virtual é chamada de domain (dominio) ou guest. O domínio especial chamado domain-0 contem os drivers para todos os dispositivos no sistema. Domain-0 também tem uma pilha de controle para o gerenciamento, criação, destruição e configuração da maquina virtual guest.
  • Imagem com detalhes da arquitetura Xen.
Arquitetura xen.png


Detalhes sobre os tipos de Maquinas Virtuais (Guests)

  • O hypervisor suporta a execução de dois tipos diferentes de guests: Paravirtualização (PV) e virtualização completa assistida por Hardware (HVM). Ambos os tipos de clientes podem ser usados ao mesmo tempo em um único hipervisor. É também possível a utilização de técnicas utilizadas para Paravirtualização em um Guest HVM e vice-versa: criando essencialmente uma mescla entre as capacidades de PV e HVM. São usadas diferentes siglas para se referir a essas configurações, chamados HVM drivers PV, PVHVM e PVH.
  • PV:
    • Para-virtualização (PV) é uma eficiente e leve técnica de virtualização, originalmente introduzida pelo Xen Project, depois adotada por outras plataformas de virtualização. PV não requer extenção de virtualização da CPU do Host, contudo, guests paravirtualizados requerem um Kernel com PV habilitado e PV drivers, assim os guests estão "conscientes" que estão sob um hypervisor e podem rodar de forma eficiente sem emulação ou hardware virtual emulado. Kernel com PV habilitado existe para Linux, NetBSD, FreeBSD e OpenSolaris. Kernels Linux tem o PV habilitado a partir da versão 2.6.24, usando o Linux pvops framework. Na prática isso significa que o PV irá funcionar na maioria das distribuições Linux.
  • HVM
    • Full Virtualization ou Hardware-assisted virtualization (HVM) usa a extensão de virtualização da CPU do host para virtualizar guests. HVM requer Intel VT ou AMD-V. O software Xen Project uso o Qemu para emular o hardware PC, incluindo BIOS, Controlador de disco IDE, adaptador gráfico VGA, controlador USB, adaptador de rede, etc. A extensão de virtualização é utilizada para aumentar a performance da emulação. Clientes Full Virtualization não precisam nenhum suporte de Kernel. O sistema operacional Windows pode ser usado no modo HVM. Clientes Full virtualizados são usualmente mais lentos que clientes para-virtualizados, pela necessidade da emulação.
    • É possível utilizar Drivers Para-virtualizados para incrementar velocidade de I/O dos clientes. No Windows isto requer a instalação destes drivers. Em sistemas operacionais com suporte o Xen, os drivers PV são selecionados automaticamente.
  • PVHVM
    • Para aumentar o desempenho, os guests HVM full virtualizados podem usar drivers de dispositivos especiais para-virtuais (PVHVM ou driver PV-no-HVM). Estes drivers PV são otimizados para ambientes HVM e ignoram a emulação I/O para discos e rede, dando o PV um melhor desempenho em sistemas HVM. Isto significa que pode-se obter um ótimo desempenho nos sistemas operacionais guests como o Windows.
  • PVH
    • O Xen Project 4.4 introduz um modo de virtualização chamado PVH para DomUs. PVHv1, mais tarde foi alterado no Xen 4.9 para PVHv2, que consiste em iniciar com um guest HVM e remover a funcionalidade que não é necessário. Os guests PVHv2 são convidados HVM leves que usam suporte de virtualização de hardware para memória e instruções privilegiadas, drivers PV para E/S e interfaces de sistema operacional nativas para todo o resto. PVHv2 também não usa QEMU para emulação de dispositivo, mas ainda pode ser usado para back-ends de user-spaces. O PVH tem o potencial de combinar as melhores trade-offs de todos os modos de virtualização, além de simplificar a arquitetura Xen.


Configuração básica de nó Xen e domínios

  • O nó principal do XEN precisa de basicamente as configurações de rede e storage para que uma VM tenha as funcionalidades.
    • Rede: Pode ser configurada no host, como bridge, também suporta NAT, Routing e Open vSwitch. Mais detalhes(interno)

Exemplo de configuração do guest, referente a rede:

vif = [ 'mac=00:16:3E:74:34:32,bridge=xenbr1' ]

Exemplo da configuração do guest, referente ao acesso à storage.

disk = [ 'phy:dom0,domU,mode' ]

* Onde:
dom0 : Caminho do dispositivo em Domain0, 
domU : Como o Dominio Host apresenta o dispositivo ao dominio guest
mode :'r' para read-only, 'w' para read-write. 

Obs: O caminho e o arquivo do dispositivo de bloco no Domain-0 vai depender dos modulos e configurações de hardware deste dispositivo.

Exemplo de uso:
disk = [ 'phy:/dev/vg/guest-volume,raw,xvda,rw' ]

Gerenciamento básico de nó Xen e domínios

  • Uso do Comando xl: Gerencia guests Xen[10]. Sua notação é xl subcomando [OPTIONS] domain-id[11]
  • Alguns utilitários usados na administração do XEN:
    • xentop: Exibe informações de guests(dominios) em tempo real
    • xenpm [12]: Gerenciador de capacidade de processamento

Solução de problemas de instalação

Alguns erros podem ocorrer durante a instalação e uso do Xen Project.

  • Verificar se as requisições de hardware e software estão correspondidas
* Verificar se o hardware tem suporte a virtualização completa:
# egrep '(vmx|svm)' /proc/cpuinfo
  • Após instalado o Xen, o respectivo kernel deve ser inicializado e não o kernel anteior. Para isso, o grub deve ser configurado.
  • Verificar se o Kernel atual tem suporte ao uso do Xen.
  • A rede deve estar configurada para Bridge a fim de disponibilizar acesso a rede para os demais DOMs
  • Configurar ou desabilitar SeLinux (Fedora)
# grep <vairous_stuff_here> /var/log/audit/audit.log | audit2allow -M mypol
# semodule -i mypol.pp
  • Alguns erros comuns:
    • Dom0 (Host) reinicia sozinho: Quando ocorre um crash em Dom0 ele pode reiniciar sozinho se a opção GRUB_CMDLINE_XEN="noreboot" Não estiver configurada em: /etc/default/grub
    • Erro: unknown compression format, isto ocorre quando novos kernels que utilizam compreesão xz são botados em antigas instalações Xen.
    • Problemas com muitos pacotes de rede perdidos: Pode ser resolvido aumentando uma TAG chamada qlen da placa de rede, para valor semelhante a 1000
ip link set qlen 1000 dev vif-mydomU
  • Por fim, o comando:
# xl info → Mostra se o Xen está conforme, inclusive memória livre
# xl list → Lista as VMs rodando e a ocupação individual de memória

Conhecimento de componentes

XAPI

O projeto XAPI é um sub-projeto do Xen Project, que desenvolve o enterprise ready XAPI toolstack. O hypervisor usado com o toolstack XAPI consolida as cargas de trabalho do servidor, permite economia em energia, refrigeração e custos de gestão, contribuindo, assim, para a computação ambientalmente sustentável, uma maior capacidade de adaptação às constantes mudanças dos ambientes de TI, uma utilização otimizada do hardware existente, e um melhorado nível de confiabilidade de TI.

Arquitetura xapi.png
  • O Xen Project Management API (XAPI) é:
    • O Xen Project Toolstack que expõe a interface XAPI.
    • Uma interface para configurar e controlar remotamente guests virtualizados rodando em um host Xen habilitado. XAPI é o componente central do XenServer e XCP.
    • A utilização do XAPI permite o uso do XEN em grandes ambientes, ambientes em nuvem e a capacidade de trabalho em pool.
  • O XAPI toolstack inclui uma poderosa interface de linha de comando chamada 'xe que fala com ambos hosts e grupos de recursos sobre https, invocando operações XenAPI sobre XMLRPC. Os comandos podem ser evocados tanto do próprio Host Dom-0 como de outros hosts. Ou seja, o comando xe utiliza as funcionalidades disponibilizadas pelo projeto XAPI para fazer a interação com os hosts XEN.
    • Alguns usos do comando;
* Uso padrão:
# xe -s <host> -u <username> -pw <password> <command-name> <argument=value>*

* Iniciar VM:
# xe vm-start vm=<target VM name>

* Listar VM
# xe vm-list 

* Deletar VM
# xe vm-destroy uuid=<UUID of target VM> 

* Criar repositórios STORAGE
# xe sr-create name-label=<name> physical-size=<size> type=<type> content-type=<content_type> device-config:<config_name>=<value> 
                                                               [host-uuid=<Xen Cloud Platform host UUID>] [shared=<true | false>] 

* Criação de uma VM
# xe vm-install template=<name of target template> new-name-label=<name of  VM>

* Adicionar uma interface de rede virtual a uma VM
# xe vif-create network-uuid=<network uuid from above>  vm-uuid=<uuid of new VM> device=0



XenStore

XenStore é um espaço de armazenamento de informações compartilhadas entre domínios mantidos pelo Xenstored. Ele é destinado a configuração e informações de status e não para grandes transferências de dados. Cada domínio recebe o seu próprio caminho no store, o que é um pouco semelhante ao procfs. Quando os valores são alterados no store, os drivers apropriados são notificados.

  • XenStore é um banco de dados, armazenado no domain 0, com suporte transacional e atomicidade.
  • Os comandos xenstore-* permitem consultar e interagir com xenstored.
  • Alguns exemplos de uso:
* Lista as informações de status dos domínios
# xenstore-ls -f

* Adiciona ou modifica chaves e valores:
# xenstore-write

Xen Boot Parameters

Algumas questões sobre parâmetros de boot de Kernel para o Host Xen que devem ser observadas e adicionadas em /etc/default/grub

mem: Limita a quantidade de memória que está disponível para o kernel hipervisor
dom0_mem: Limita a memória disponível para o hypervisor
dom0_max_vcpus: Limita a CPU visível em Dom-0

* Opções referentes a ACPI
acpi=off: Disables both ACPI table parsing and interpreter.   
acpi=force: Subscreve o blacklist desabilitado.
acpi=strict: Disables out-of-spec workarounds.
acpi=ht: Limits ACPI from boot-time to enable HT.
acpi=noirq: Desablita roteamento de interrupção ACPI. 
noacpi: Desabilita a entrega de ACPI

Utilitário xm

Xm é uma obsoleta interface de usuário para gerenciamento do Xen. Este comando foi substituído pelo xl que manteve uma compatibilidade básica.

  • Todas as operações do xm são executadas acessando o daemon xend, que deve estar rodando para que o xm funcione. Este daemon também não é mais utilizado e está obsoleto.

351.3 QEMU (peso: 4)

Objetivo do tópico:

Peso 4
Description Os candidatos devem ser capazes de instalar, configurar, manter, migrar e solucionar problemas de instalações QEMU.

Key Knowledge Areas:

  • Compreender a arquitetura do QEMU, incluíndo KVM, rede e storage
  • Iniciar instâncias QEMU a partir da linha de comando
  • Gerenciar snapshots usando QEMU monitor
  • Instalar QEMU Guest Agent e VirtIO device drivers
  • Solução de problemas em instalações do QEMU, incluindo rede e storage
  • Conhecimento de parâmetros de configurações importantes do QEMU

The following is a partial list of the used files, terms and utilities:

  • Kernel modules: kvm, kvm-intel and kvm-amd
  • /dev/kvm
  • QEMU monitor
  • qemu
  • qemu-system-x86_64
  • ip
  • brctl
  • tunctl


Arquitetura do QEMU, KVM, rede e storage

KVM é um módulo de baixo nível para utilização de virtualização e o QEMU é a ferramenta a nível de usuário que cria e gerencia realmente as VMs, acessando o recurso de virtualização completa do servidor através do módulo /dev/kvm. Os módulos de kernel kvm; kvm_amd|kvm_intel são carregados. O QEMU é anterior ao KVM, já existia antes dele e sofreu modificações primeiro em um Fork e posteriormente dentro do código oficial para suportar as funcionalidades extras do KVM.

  • O QEMU é um emulador completo, não apenas é capaz de virtualização completa (através do KVM) como também permite emulação de processadores, tudo isso por software, tornando a emulação algo bem mais lento que a virtualização completa.
  • Para criação de uma nova imagem de disco, é utilizado o binário: qemu-img. Para instalar/inicializar uma VM é utilizado o binário: qemu-system-x86_64

Iniciar instâncias QEMU pela linha de comando

O comando qemu-system-x86_64 é responsável por iniciar maquinas virtuais pelo QEMU. Muitas configurações são possíveis na execução do comado[13], [14], [15].

# qemu-system-x86_64 [options] [disk_image]

# qemu-system-x86_64 -name "TesteUbuntu" -machine accel=kvm -m 1g -nographic bionic-server-cloudimg-amd64.img
  • Exemplo de um comando qemu-system-x86_64 para inicialização de VM Windows
Obs: O comando kvm é um link simbólico para: qemu-system-x86_64

# /usr/bin/kvm -id 101 -name Win7 -no-shutdown -chardev socket,id=qmp,path=/var/run/qemu-server/101.qmp,server,nowait 
-mon chardev=qmp,mode=control -chardev socket,id=qmp-event,path=/var/run/qmeventd.sock,reconnect=5 
-mon chardev=qmp-event,mode=control 
-pidfile /var/run/qemu-server/101.pid 
-daemonize -smbios type=1,uuid=dfcffd4f-17c4-4b35-8207-4b55d1df7e5c 
-smp 2,sockets=1,cores=2,maxcpus=2 
-nodefaults -boot menu=on,strict=on,reboot-timeout=1000,splash=/usr/share/qemu-server/bootsplash.jpg 
-vnc unix:/var/run/qemu-server/101.vnc,password -no-hpet 
-cpu kvm64,enforce,hv_ipi,hv_relaxed,hv_reset,hv_runtime,hv_spinlocks=0x1fff,hv_stimer,hv_synic,hv_time,hv_vapic,hv_vpindex,
+kvm_pv_eoi,+kvm_pv_unhalt,+lahf_lm,+sep 
-m 3052 -device pci-bridge,id=pci.1,chassis_nr=1,bus=pci.0,addr=0x1e -device pci-bridge,id=pci.2,chassis_nr=2,bus=pci.0,addr=0x1f 
-device vmgenid,guid=375b2284-d945-41d9-b3e5-9094acc4bf76 -device piix3-usb-uhci,id=uhci,bus=pci.0,addr=0x1.0x2 
-device usb-tablet,id=tablet,bus=uhci.0,port=1 
-device VGA,id=vga,vgamem_mb=32,bus=pci.0,addr=0x2,edid=off 
-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 
-iscsi initiator-name=iqn.1993-08.org.debian:01:cd7099383bfd 
-drive if=none,id=drive-ide2,media=cdrom,aio=threads -device ide-cd,bus=ide.1,unit=0,drive=drive-ide2,id=ide2,bootindex=200 
-device ahci,id=ahci0,multifunction=on,bus=pci.0,addr=0x7 
-drive file=/dev/StorLvmT/vm-101-disk-0,if=none,id=drive-sata0,format=raw,cache=none,aio=native,detect-zeroes=on 
-device ide-hd,bus=ahci0.0,drive=drive-sata0,id=sata0,bootindex=100 
-netdev type=tap,id=net0,ifname=tap101i0,script=/var/lib/qemu-server/pve-bridge,downscript=/var/lib/qemu-server/pve-bridgedown 
-device e1000,mac=FA:88:1C:A4:D0:04,netdev=net0,bus=pci.0,addr=0x12,id=net0,bootindex=300 
-rtc driftfix=slew,base=localtime 
-machine type=pc+pve0 -global kvm-pit.lost_tick_policy=discard
  • Exemplo para inicializar uma VM pelo cd-rom(iso) e depois inicializar pelo disco:
. Inicializando pelo cd-rom para fazer a instalação do S.O.
$ qemu-system-x86_64 -hda debian.img -cdrom debian-testing-amd64-netinst.iso -boot d -m 512

. Inicializando a VM depois de instalada
$ qemu-system-x86_64 -hda debian.img -m 512

Gerenciar snapshots usando QEMU monitor

O qemu disponibiliza uma ferramenta para interação em tempo real com a VM em execução. Este utilitário se chama Qemu Monitor e pode ser acessado usando as teclas: Control + Alt + 2. Por console, pode ser acessado através da opção -monitor stdio.

  • Algumas opções:
(qemu) info status → Exibe o status da VM
(qemu) info block  → Exibe as informações de disco
(qemu) change ...  → Altera o cd da maquina
  • Para gerar snapshots, através do monitor os comandos abaixo podem ser utilizados:
(qemu) savevm      → Cria um snapshot da VM
(qemu) loadvm      → Carrega o snapshot anteriormente criado
(qemu) delvm       → Apaga o snapshot
(qemu) snapshots   → Lista os snapshots salvos


Instalar QEMU Guest agent e drivers VirtIO

O Qemu Guest Agent serve para interagir com o sistema operacional do convidado. Geralmente roda como um daemon, deve ser instalado e faz o acesso entre o host e o guest através de uma interface virtual serial.

  • Algumas de suas funções são:
    • Congelar o sistema de arquivos da VM para execução do backup (usar o VSS do windows, por exemplo)
    • Desligar ou suspender a VM de forma apropriada
    • Requisitar e configurar o system time no guest
    • Executar operação de sincronia no filesystem do guest
    • Acessar arquivos do guest
  • Instalação:
    • No Linux, o pacote qemu-guest-agent esta presente nos repositórios de grande parte das distribuições
    • No Windows ele pode ser baixado no github do projeto, anexado como uma iso a VM e instalado. [16]


Os drivers Virt-IO são usados para permitir o uso de dispositivos para-virtualizados, que são mais rápidos que dispositivos emulados pelo Qemu.

  • Para guests Linux, os drivers virtio já vem embutidos no kernel
  • Para guests Windows, é necessário instalar os drivers

Solução de problemas em instalações do QEMU, incluindo rede e storage

  • Para uma VM obter acesso a rede física, o host de virtualização deve compartilhar sua placa de rede física através de uma conexão do tipo bridge
    • Configuração de uma placa do tipo bridge:
. Conteúdo do arquivo /etc/network/interfaces (debian)

iface enp4s5 inet manual

auto vmbr0
iface vmbr0 inet static
	address  192.168.0.201
	netmask  255.255.255.0
	bridge-ports enp4s5
	bridge-stp off
	bridge-fd 0
#Rede VMs
  • Existem outras maneiras de configurar uma rede bridge, através de comandos[17].
Os comandos:
. brctl
. tunctl
estão depreciados e não estão mais em uso.

O comando 'ip' é utilizado atualmente
Exemplo:
# ip link add br0 type bridge ; ifconfig br0 up
A bridge br0 criada, não esta associada a nenhuma placa de rede física e funciona como uma rede privada das VMs

Na execução de rede, o qemu executa um script ao iniciar a VM, para criar um vmbr assim que o sistema guest inicializar. Este script fica em /etc/qemu-ifup; /etc/qemu-ifdown.

  • O parâmetro -netdev script=??? pode definir uma localização alternativa para os script de rede


  • Alguns problemas comuns no uso de storage são:
    • Storage não acessível
    • Arquivo de imagem de maquina virtual não compatível
    • Tipos de storages:
      • Storages de bloco
      • Storages de arquivos: RAW e QCOW2
  • Principais problemas e soluções: Baseado em KVM
    • Erro de suporte ao KVM: Carregar o modulo KVM ou verificar se a Bios e o Processador tem suporte HVM)
# lsmod|grep
    • Sem acesso a rede da VM: Revisar as configurações de rede bridge
    • Mouse 'preso' ao acessar a console da VM: Utilizar o parâmetro -usb -usbdevice tablet
  • Gerenciamento de imagem:
      • qemu-img
# qemu-img info filename   → Informações
# qemu-img convert         → Conversão de formatos, de vmdk para qcow2 por exemplo
      • Montar imagem
. Para imagens de arquivo tipo raw
# mount -o loop,offset=32256 /path/to/image.img /mnt/mountpoint

. Para imagens de arquivo tipo qcow2
# kvm-nbd --connect=/dev/nbd0 imagename.qcow
# mount /dev/nbd0 /mnt/imagem

Conhecimento de parâmetros de configurações importantes do QEMU

  • Parâmetros de configuração[18]:
. Huge Pages: Maneira de direcionar paginas grandes de endereçamento de memórias. Até 2gb
. Transparente Huge Pages:
. KSM: Compartilhamento de uso de memória entre os hosts
. NUMA: Alocação de partes de memórias para uma CPU física. O UMA era o antecessor.
  • Opções básicas ao iniciar um guest: [19]
- machine → Tipo de maquina
- cpu     → Tipo de CPU
- smp     → Limite de processador
- m       → Limite de memória
- name    → Nome da vm

351.4 Libvirt Virtual Machine Management (peso: 9)

Objetivo do tópico:

Peso 9
Description Os candidatos devem ser capazes de gerenciar hosts de virtualização e máquinas virtuais (‘libvirt domains’) usando libvirt e ferramentas relacionadas.

Key Knowledge Areas:

  • Compreender a arquitetura do libvirt
  • Gerenciar conexões e nós libvirt
  • Criar e gerenciar QEMU e dominios Xen, incluíndo snapshots
  • Gerenciar e analisar consumo de recursos de domínios
  • Criar e gerenciar storage pools e volumes
  • Criar e gerenciar virtual networks
  • Migrar domínios entre nós
  • Entender como o libvirt interage com Xen e QEMU
  • Entender como o libvirt interage com serviços de rede como dnsmasq e radvd
  • Entender arquivo de configuração XML do libvirt
  • Conhecimento de virtlogd e virtlockd

The following is a partial list of the used files, terms and utilities:

  • libvirtd
  • /etc/libvirt/
  • virsh (including relevant subcommands)


Compreender a arquitetura do libvirt

  • API de virtualização Libvirt: Libvirt é uma coleção de softwares que provê uma via conveniente para gerenciar maquinas virtuais e outras funcionalidades de virtualização, como gerenciamento de storage e interfaces de rede. Este software inclui biblioteca API, o daemon libvirtd e um utilitário de linha de comando chamado virsh.
  • O primeiro objetivo do libvirt é prover uma via única para gerenciar multiplos diferentes provedores ou hypervisors de virtualização. Por exemplo, o comando virsh list --all pode ser usado para listar maquinas virtuais em vários hypervisors suportados, como KVM, Xen, VmWare ESX, etc, não precisando utilizar a ferramenta específica do hypervisor correspondente.
Comparação de arquitetura sem e com libvirt
  • O libvirt provê:
    • Gerenciamento remoto utilizando encriptação TLS e certifcados x509
    • Gerenciamento remoto utilizando autenticação com Kerberos e SASL
    • Controle de acesso local utilizando PolicyKit
    • Zero-conf usando Avahi multicast-DNS
    • Gerenciamento de maquinas virtuais, redes virtuais e storage
    • Cliente API portável para Linux, Solaris e Windows
    • Ela atualmente suporta QEMU, KVM, XEN, LXC, VMWare ESX e VirtualBox
  • Instalação
    • Para instalar os pacotes necessários, digite a partir de um terminal:
# apt-get install libvirt-daemon libvirt-daemon-system
  • Arquivos de configuração: Os arquivos de configurações do libvirt ficam em /etc/libvirt/.
    • libvirtd.conf: Arquivo de configuração do daemon responsável por receber as conexões libvirtd
    • libvirt.conf: Utilizado pelo cliente de linha de comando virsh
    • lxc.conf, qemu.conf e outros: Arquivos de configuração dos drivers de conexão conforme o hypervisor utilizado.

Gerenciar conexões e nós libvirt

    • A instalação do Libvirt no Host cria o daemon libvirtd que pode ser acessado pelo cliente virsh tanto do próprio host como de outro computador a fim de gerenciar as maquinas virtuais.
    • Dependendo do virtualizado, deve ser utilizada uma URI de conexão específica.
    • Exemplo de conexão a um hypervisor
* Conexão a um hypervisor Xen
# virsh -c xen+ssh://root@192.168.0.200/

* Conexão a um hypervisor qemu/KMV
# virsh -c qemu+ssh://root@192.168.0.200/

* Após conectado, o mesmo comando é executado, independente do Hypervior 
# virsh list     → Lista domínios (VMs) Informações do host
# virsh sysinfo  → Mostra informações do hypervisor 
# virsh nodeinfo → Exibe informações do Nó

  • A console do servidor virtualizado, pode ser visualizada utilizando o programa virt-viewer
# virt-viewer -c xen+ssh://root@192.168.0.200/ ID_VM
  • Configuração das Maquinas Virtuais, como editar os configs XML?

As configurações das VMs ficam armazenadas de acordo com o hypervisor utlizado. Por exemplo, o Xen e o VMWare amrazenam em seus próprios configs e o libvirt traduz para o modo XML quando o sub-comando virsh dumpxml é chamado. Já o qemu e o lxc são armazenados em formato XML no disco e na memória do host /etc/libvirtd/qemu. De qualquer modo, editar diretamente os arquivos .XML armazenados no disco não é aconselhado e provavelmente o daemon libvirtd subscreverá as alterações feitas. Para editar as configurações, deve-se editar os parametros XML através dos comandos abaixo:

* Para redes virtuais:(Virtual Networks): net-list, net-edit, net-dumpxml
* Storage Pools: pool-list, pool-edit, pool-dumpxml
* Storage Volumes: vol-list, vol-edit, vol-dumpxml
* Interfaces: iface-edit, iface-dumpxml 

Fontes: Explicação completa da arquitetura; Wiki

Criar e gerenciar QEMU e dominios Xen, incluíndo snapshots

  • Exemplo de uso geral do comando virsh:
 
* Se o virsh esta sendo executado no próprio hypervisor não é necessário conectar por ip ou utilizar o virsh conectando por ssh (qemu+ssh), bastando o acesso
 direto conforme os exemplos abaixo:

* Listar todas máquinas virtuais:
# virsh -c qemu:///system list --all

* Iniciar uma máquina virtual:
# virsh -c qemu:///system start NOME_MAQUINA_VIRTUAL

* Iniciar uma maquina virtual automaticamente ao iniciar o Host
# virsh -c qemu:///system autostart NOME_MAQUINA_VIRTUAL

* Reiniciar uma máquina virtual:
# virsh -c qemu:///system reboot NOME_MAQUINA_VIRTUAL

* Para desligar uma máquina virtual:
# virsh -c qemu:///system shutdown NOME_MAQUINA_VIRTUAL

* Montar um dispositivo de CD-DROM em uma máquina virtual:
# virsh -c qemu:///system attach-disk NOME_MAQUINA_VIRTUAL /dev/cdrom /media/cdrom

* Semelhante a uma hibernação ou pausar uma VM ativa, é possível salvar o estado atual da VM em um aquivo para liberação de memória e CPU.
# virsh -c qemu:///system save NOME_MAQUINA_VIRTUAL NOME_MAQUINA_VIRTUAL-02022015.state

* Para restaurar a VM, executar o comando:
# virsh -c qemu:///system restore NOME_MAQUINA_VIRTUAL-02022015.state
  • As maquinas virtuais criadas pelo libvirt são parametrizadas através de arquivos .XML, ou seja, cada Guest criado em um hypervisor utilizando o libvirt tem uma configuração com todos os seus parametros de configuração dentro de uma formatação .XML. Esta configuração pode ser exportada, assim como novas maquinas virtuais podem ser criadas a partir de arquivos .XML corretamente parametrizados.
* Exportar configurações .XML de uma maquina virtual
# virsh -c xen:///system dumpxml NOME_MAQUINA_VIRTUAL
* Criar uma Maquina Virtual a partir de um arquivo XML. Ele vai inicializar a VM porém não irá salvar as definições da imagem, 
ou seja, após o desligamento as definições não serão salvas 

# virsh -c xen:///system create Arquivo.XML
  • Criar uma Maquina Virtual a partir de um arquivo XML. Ele não vai inicializar a VM, porém as definições ficarão salvas.
# virsh -c xen:///system define Arquivo.XML
  • Outra maneira de criar uma Maquina Virtual é utilizando o programa virt-install do pacote virtinst, conforme os exemplos abaixo:
. Pacote virtinst
# virt-install --name=windows7 --memory 2048 --cdrom /dev/sr0 --os-variant=win7 --disk /mnt/storage/domains/windows7.qcow2,size=20GiB --network network=vm-net
--graphics spice

Criando VM QEMU/Xen e executando snapshots

  • Os comandos para utilização de snapshots são:
    snapshot-create                Criar snapshots a partir de XML
    snapshot-create-as             Criar snapshots com args
    snapshot-current               Pegar ou setar current snapshot
    snapshot-delete                Deletar domínio snapshot
    snapshot-dumpxml               Dump XML para um dominio snapshot
    snapshot-edit                  Editar XML para um snapshot
    snapshot-info                  Informação de snapshot
    snapshot-list                  Listar snapshots para um domain
    snapshot-parent                Pegar o nome de parent de um snapshot
    snapshot-revert                Reverter um snapshot para um dominio
  • Exemplo de criação de um snapshot usando libvirt:
# virsh snapshot-create-as --domain debian9_libvirt --name "snap_teste01" --description "primeiro snap teste"

Gerenciar e analisar consumo de recursos de domínios

  • virt-top: Semelhante ao comando top, exibe informações sobre o consumo de maquinas virtuais em um domínio
# virsh domstats --cpu-total
. Exibe informações de processamento de um domínio

Criar e gerenciar storage pools e volumes

  • Arquitetura: O gerenciamento de armazenamento do libvirt é baseado em dois conceitos chaves:
    • Volume: Um volume simples de storage pode ser associado a um guest ou usado para criação de novos pools. O volume pode ser um dispositivo de bloco, um arquivo raw ou um arquivo com formato especial.
    • Pool: Fornece uma maneira de pegar uma parte de um storage e cria-lo como um volume. O Pool pode ser usado para gerenciar as coisas, como um disco físico, um servidor NFS, um target iSCSI, um adaptador de host, um grupo LVM.
  • Tipos de Storage Manager: Libvirt suporta os seguintes tipos de Storage Pool:
    Directory backend
    Local filesystem backend
    Network filesystem backend
    Logical backend
    Disk backend
    iSCSI backend
    SCSI backend
    Multipath backend
    RBD (RADOS Block Device) backend
    Sheepdog backend
    Gluster backend
    ZFS backend 
    • Pool de diretório:

Exemplo de configuração XML

      <pool type="dir">
        <name>virtimages</name>
        <target>
          <path>/var/lib/virt/images</path>
        </target>
      </pool>

Tipos de volumes suportados para um pool de diretório:

    raw: a plain file
    bochs: Bochs disk image format
    cloop: compressed loopback disk image format
    cow: User Mode Linux disk image format
    dmg: Mac disk image format
    iso: CDROM disk image format
    qcow: QEMU v1 disk image format
    qcow2: QEMU v2 disk image format
    qed: QEMU Enhanced Disk image format
    vmdk: VMWare disk image format
    vpc: VirtualPC disk image format

Os volumes podem ser criados utilizando a ferramenta qemu-img

    • Pool de filesystem:

Neste caso, o dispositivo de bloco é automaticamente montado. Abaixo exemplo de Configuração XML

    <pool type="fs">
        <name>virtimages</name>
        <source>
          <device path="/dev/VolGroup00/VirtImages"/>
        </source>
        <target>
          <path>/var/lib/virt/images</path>
        </target>
      </pool>

Vários tipos de sistemas de arquivos são suportados, como ext3, ext4, xfs, etc. Os Volumes suportados são os mesmos dos diretórios.


    • Network Filesystem Pool:

Ele requer o nome de um host e caminho de um diretório exportado. Ele vai montar este sistema de arquivos de rede e gerenciar arquivos dentro do diretório de seu ponto de montagem. Geralmente utiliza NFS. Abaixo exemplo de uso XML

    <pool type="netfs">
        <name>virtimages</name>
        <source>
          <host name="nfs.example.com"/>
          <dir path="/var/lib/virt/images"/>
          <format type='nfs'/>
        </source>
        <target>
          <path>/var/lib/virt/images</path>
        </target>
      </pool>

Os tipos de Pools de network suportados são: nfs, glusterfs, cifs. Os Volumes suportados são os mesmos dos diretórios.

    • Pool de Volume Logico:

Baseado em grupo de volume LVM. Para utilizar um grupo de volumes definido anteriormente, basta o nome dele. Para criação de um grupo de volumes, a origem é necessária, conforme exemplo de configuração XML abaixo:

  <pool type="logical">
        <name>HostVG</name>
        <source>
          <device path="/dev/sda1"/>
          <device path="/dev/sdb1"/>
          <device path="/dev/sdc1"/>
        </source>
        <target>
          <path>/dev/HostVG</path>
        </target>
      </pool>
    • Pool de Volume de disco:

Associado a disco adição de disco físico. Os volumes são criados, criando partições no disco. Abaixo exemplo do XML de configuração:

      <pool type="disk">
        <name>sda</name>
        <source>
          <device path='/dev/sda'/>
        </source>
        <target>
          <path>/dev</path>
        </target>
      </pool>
    • Pool iSCSI:

Os volumes devem ser pré-alocados no servidor iSCSI, e não pode ser criado por meio de APIs libvirt.

   <pool type="iscsi">
        <name>virtimages</name>
        <source>
          <host name="iscsi.example.com"/>
          <device path="iqn.2013-06.com.example:iscsi-pool"/>
        </source>
        <target>
          <path>/dev/disk/by-path</path>
        </target>
      </pool>
    • Pool de volume SCSI:

Os volumes devem pré existir nas LUNs e não pode ser criado por meio de APIs libvirt

     <pool type="scsi">
        <name>virtimages</name>
        <source>
          <adapter name="host0"/>
        </source>
        <target>
          <path>/dev/disk/by-path</path>
        </target>
      </pool>
    • Pool e volume Multipath:

Multipath com suporte parcial.

      <pool type="mpath">
        <name>virtimages</name>
        <target>
          <path>/dev/mapper</path>
        </target>
      </pool>
    • Pool de volumes RBD

Suporte parcial e somente utilizando QEMU.

    • Pool de volumes Sheepdog:

Provê alta disponibilidade a nível de bloco. Abaixo exemplo de configuração de Pool

      <pool type="sheepdog">
        <name>mysheeppool</name>
        <source>
          <name>mysheeppool</name>
          <host name='localhost' port='7000'/>
        </source>
      </pool>

Abaixo exemplo de saída de configuração de volume:

<volume>
         <name>myvol</name>
         <key>sheep/myvol</key>
         <source>
         </source>
         <capacity unit='bytes'>53687091200</capacity>
         <allocation unit='bytes'>53687091200</allocation>
         <target>
           <path>sheepdog:myvol</path>
           <format type='unknown'/>
           <permissions>
             <mode>00</mode>
             <owner>0</owner>
             <group>0</group>
           </permissions>
         </target>
       </volume>
    • Pool de volumes Gluster:

O gluster pode ser montado como um diretório de rede, porém não necessariamente, conforme exemplo abaixo:

   <pool type="gluster">
        <name>myglusterpool</name>
        <source>
          <name>volname</name>
          <host name='localhost'/>
          <dir path='/'/>
        </source>
      </pool>

Exemplo de criação de volumes:

      <volume>
         <name>myfile</name>
         <key>gluster://localhost/volname/myfile</key>
         <source>
         </source>
         <capacity unit='bytes'>53687091200</capacity>
         <allocation unit='bytes'>53687091200</allocation>
       </volume>
    • Pool de volume ZFS:

O ZFS deve ser criado anteriormente, abaixo a configuração do XML em Libvirt.

      <pool type="zfs">
        <name>myzfspool</name>
        <source>
          <name>zpoolname</name>
          <device path="/dev/ada1"/>
          <device path="/dev/ada2"/>
        </source>
      </pool>
  • Criando e alterando storages com virsh:

No Virsh, para gerenciar os armazenamentos os seguintes comandos são usados:

** Comandos relacionados a criação e gerenciamento de pools

* Listar Pools configurados do sistema
# virsh -c xen:///system pool-list

* Informação de um Pool
# virsh -c xen:///system pool-info nome_pool

* Editar um Pool
# virsh -c xen:///system pool-edit nome_pool

* Exportar informações de XML de um Pool
# virsh -c xen:///system pool-dumpxml nome_pool

* Criar um novo Pool
# virsh -c xen:///system pool-create arquivo.xml

** Comandos relacionados a criação e gerenciamento de volumes

* Criar um volume a partir de um arquivo .XML
# virsh -c xen:///system vol-create nome_pool arquivo.xml

* Dump das configurações XML de um volume
# virsh -c xen:///system vol-dumpxml nome_volume nome_pool

* Informação sobre o Storage Volume
# virsh -c xen:///system vol-info nome_volume nome_pool

* Listar Volumes de um determinado Pool
# virsh -c xen:///system vol-list nome_pool

Criar e gerenciar virtual networks

  • Rede Virtual:

Existem várias diferentes maneiras para permtir que uma maquina virtual acesse a rede externa. A configuração padrão de configuração de rede inclui bridging e regras de iptables. O tráfico é 'NATeado' através da interface do host para rede externa. Para habilitar a possibilidade de hosts externos acessarem diretamente as maquinas virtuais, então uma configuração de bridge é necessária . Isto permite que uma interface virtual consiga conectar a rede externa através da interface física do host, tornando a Maquina Virtual semelhante a um equipamento físico normal na rede.

  • Como o Libvirt define as configurações de rede:
    • Libvirt usa o conceito de switch virtual de rede, que é uma construção de software no host server, onde a maquina virtual é "conectada" e o tráfico passa diretamente através dele.
    • No host server, o switch virtual de rede é exibido como uma interface de rede, por padrão com a nomenclatura: virbr0
    • Por padrão o switch virtual funciona em modo NAT
    • Cada switch de rede virtual pode disponibilizar um intervalo de endereços IP, fornecendo aos clientes por meio de DHCP. O libvirt utilza o dnsmasq para isso
    • Outro modo de trabalho do Switch virtual é o Routed Mode onde os pacotes são passados através da interface do Host para a rede externa
    • No Isolated mode as Maquinas Virtuais se comunicam através do switch virtual porém não acessam a rede externa ou mesmo não podem ser acessadas da rede externa.
  • O gerenciamento das opções de rede e tipos de roteamento do switch virtual podem ser feitas pelo software com uma GUI gráfica chamado virt-manager ou diretamente nas linhas de comando com o programa virsh conforme as linhas abaixo:
* Listar as configurações de rede;
# virsh -c xen:///system net-list [--all] [--inactive].

* Iniciar uma rede inativa
# virsh -c xen:///system net-start [--network] <network-identifier>

* Parar uma configuração da rede em uso e desalocar todos os recursos provenientes dela (como o dnsmasq por exemplo)
# virsh -c xen:///system net-destroy [--network] <network-identifier>

* Remove uma rede virtual persistente inativa a partir da configuração libvirt.
# virsh -c xen:///system net-undefine [--network] <network-identifier>

* Ativar ou desabilitar a ativação da rede ao iniciar o host
# virsh -c xen:///system net-autostart [--network] <network-identifier> [--disable]

* Fazer o dump XML da configuração da rede 
# virsh -c xen:///system net-dumpxml [--network] <network-identifier>
  • Para edição das configurações da rede utilizar:
# virsh -c xen:///system net-edit nome_rede
  • Para criação de novas configurações de rede, utiliza-se o mesmo mecanismo da criação de maquinas virtuais por XML. Deve-se criar um XML com as configurações da rede e utilizar os comandos abaixo para importa-lo no libvirt.
* Para criar a rede, inicializa-la mas não deixar como definitiva
# virsh -c xen:///system net-create --file ./nova_rede.xml

* Para criar a rede, não inicializa-la e deixar como definitiva
# virsh -c xen:///system net-define --file ./nova_rede.xml

Migrar domínios entre nós

  • Conceito: Migrar os guests de um nó físico para outro.
    • Indicado o uso de um storage de rede compartilhado
    • Pode ser feita de forma live ou non-live. (vm rodando ou não)
  • O Comando básico para migração entre hosts é: virsh migrate
    • Onde os dois hosts trabalham com libvirt
# virsh migrate VM URI_de_destino
Outras opções:
-- live → Para fazer a migração com a máquina guest ligada
-- offline → Para migração de guests offline
    • Tipos de migração usando libvirt:
      • Migração direta gerenciada (Managed direct migration): O programa cliente se conecta nos daemons libvirtd dos dois hosts e gerencia a migração. Em caso de problema com o cliente, a migração é interrompida e o guest é reiniciado na origem.
      • Migração ponto a ponto gerenciada (Managed peer to peer migration): Opção --p2p. O cliente libvirt conecta ao host de origem que gerencia toda a migração através do libvirtd. Se o cliente é interrompido, a operação prossegue.
      • Migração direta não gerenciada (Unmanaged direct migration): Nem o cliente libvirt nem o daemon libvirtd controlam o processo de migração. Em vez disso, o controle é delegado ao serviço de gerenciamento do hipervisor que faz a migração direta.

Entender como o libvirt interage com Xen e QEMU

  • Interage através do daemon libvirtd. Existem as opções de uso da arquitetura monolítica onde o daemon libvirtd faz todas as tarefas ou a arquitetura modular, onde existem daemons específicos para cada tarefa.[20]
    • Na arquitetura modular podemos perceber que o daemon virtxend é responsável por rodar maquinas virtuais em um hypervidor do tipo Xen, já o daemon virtqemud é responsável por executar e manter maquinas virtuais do tipo kvm/qemu.
  • A função de controle de configuração por XML já foi explicada anteriormente.

Entender como o libvirt interage com serviços de rede como dnsmasq e radvd

  • dnsmasq [21]: Em servidores host linux, libvirtd usa dnsmasq para atender as redes virtuais, como a rede padrão. Uma nova instância de dnsmasq é iniciada para cada rede virtual, acessível apenas para guests nessa rede específica. Os comandos para configuração, foram explicados acima. (net-list,net-dhcp-leases, etc)
  • radvd [22]: Nas versões anteriores a 2.64 do dnsmasq, o uso do daemon radvd é necessária para fornecer ips do tipo ipv6 para os guests.

Entender arquivo de configuração XML do libvirt

  • Utiliza para validação de estrutura o esquema Relax-NG
  • O comando virt-xml-validate pode ser usado para validar as configurações.
  • Exemplo de configuração de uma Maquina Virtual Linux, do tipo QEMU HVM.
<domain type='kvm'>
  <name>debian9_libvirt</name>
  <uuid>666d89b9-0c92-4b61-b152-20420345e83d</uuid>
  <metadata>
    <libosinfo:libosinfo xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0">
      <libosinfo:os id="http://debian.org/debian/9"/>
    </libosinfo:libosinfo>
  </metadata>
  <memory unit='KiB'>524288</memory>
  <currentMemory unit='KiB'>524288</currentMemory>
  <vcpu placement='static'>1</vcpu>
  <os>
    <type arch='x86_64' machine='pc-q35-4.2'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <vmport state='off'/>
  </features>
  <cpu mode='host-model' check='partial'/>
  <clock offset='utc'>
    <timer name='rtc' tickpolicy='catchup'/>
    <timer name='pit' tickpolicy='delay'/>
    <timer name='hpet' present='no'/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <pm>
    <suspend-to-mem enabled='no'/>
    <suspend-to-disk enabled='no'/>
  </pm>
  <devices>
    <emulator>/usr/bin/qemu-system-x86_64</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/var/lib/libvirt/images/debian9_libvirt.qcow2'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <target dev='sda' bus='sata'/>
      <readonly/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
    <controller type='usb' index='0' model='qemu-xhci' ports='15'>
      <address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
    </controller>
    <controller type='sata' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x2'/>
    </controller>
    <controller type='pci' index='0' model='pcie-root'/>
    <controller type='virtio-serial' index='0'>
      <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
    </controller>
    <controller type='pci' index='1' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='1' port='0x10'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0' multifunction='on'/>
    </controller>
    <controller type='pci' index='2' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='2' port='0x11'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x1'/>
    </controller>
    <controller type='pci' index='3' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='3' port='0x12'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x2'/>
    </controller>
    <controller type='pci' index='4' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='4' port='0x13'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x3'/>
    </controller>
    <controller type='pci' index='5' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='5' port='0x14'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x4'/>
    </controller>
    <controller type='pci' index='6' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='6' port='0x15'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x5'/>
    </controller>
    <controller type='pci' index='7' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='7' port='0x16'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x6'/>
    </controller>
    <interface type='network'>
      <mac address='52:54:00:4c:b3:b7'/>
      <source network='default'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target type='isa-serial' port='0'>
        <model name='isa-serial'/>
      </target>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <channel type='unix'>
      <target type='virtio' name='org.qemu.guest_agent.0'/>
      <address type='virtio-serial' controller='0' bus='0' port='1'/>
    </channel>
    <channel type='spicevmc'>
      <target type='virtio' name='com.redhat.spice.0'/>
      <address type='virtio-serial' controller='0' bus='0' port='2'/>
    </channel>
    <input type='tablet' bus='usb'>
      <address type='usb' bus='0' port='1'/>
    </input>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <graphics type='spice' autoport='yes'>
      <listen type='address'/>
    </graphics>
    <sound model='ich9'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x1b' function='0x0'/>
    </sound>
    <video>
      <model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1' primary='yes'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
    </video>
    <redirdev bus='usb' type='spicevmc'>
      <address type='usb' bus='0' port='2'/>
    </redirdev>
    <redirdev bus='usb' type='spicevmc'>
      <address type='usb' bus='0' port='3'/>
    </redirdev>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x05' slot='0x00' function='0x0'/>
    </memballoon>
    <rng model='virtio'>
      <backend model='random'>/dev/urandom</backend>
      <address type='pci' domain='0x0000' bus='0x06' slot='0x00' function='0x0'/>
    </rng>
  </devices>
</domain>

Conhecimento de virtlogd e virtlockd

  • Virtlogd [23]: Daemon integrado ao libvirtd que tem como função gerenciar os logs das maquinas virtuais. Não é acessado pelo cliente libvirt, apenas pelo libvirtd.
. Localização do arquivo de configuração:
/etc/virtlogd.conf (ou /etc/libvirt/virtlogd.conf)
  • Virtlockd [24]:É usado para gerenciar bloqueios mantidos em relação aos recursos da máquina virtual, como seus discos. Não é acessado pelo cliente libvirt, apenas pelo libvirtd.
. Local do arquivo de configuração:
/etc/libvirt/virtlockd.conf



  • Fontes importantes:
    • RedHat Guia de Virtualização: v6; v7

351.5 Virtual Machine Disk Image Management (peso: 3)

Objetivo do tópico:

Weight 3
Description Os candidatos devem ser capazes de gerenciar imagens de disco de máquinas virtuais. Isso inclui a conversão de imagens de disco entre vários formatos e hipervisores e o acesso a dados armazenados em uma imagem.

Key Knowledge Areas:

  • Compreender características dos vários formatos de virtual disks, como imagens raw, qcow2 e VMDK
  • Gerenciar virtual machine disk images usando qemu-img
  • Montar partições e acessar arquivos contidos nas imagens de disco virtual, usando libguestfish
  • Copiar conteúdo do disco físico para a imagem do disco virtual
  • Migrar o conteúdo do disco entre vários formatos de imagens de disco virtual.
  • Conhecimento de Open Virtualization Format (OVF)

The following is a partial list of the used files, terms and utilities:

  • qemu-img
  • guestfish (including relevant subcommands)
  • guestmount
  • guestumount
  • virt-cat
  • virt-copy-in
  • virt-copy-out
  • virt-diff
  • virt-inspector
  • virt-filesystems
  • virt-rescue
  • virt-df
  • virt-resize
  • virt-sparsify
  • virt-p2v
  • virt-p2v-make-disk
  • virt-v2v
  • virt-sysprep


Formatos de virtual disks, como imagens raw, qcow2 e VMDK

  • Formatos de discos (imagens virtuais)
    • raw: Formato de imagem de disco bruto (padrão). Este formato tem a vantagem de ser simples e facilmente exportável para todos os outros emuladores. Se o sistema de arquivos suportar buracos (holes) (por exemplo em ext2 ou ext3 no Linux ou NTFS no Windows), então apenas os setores gravados irão reservar espaço.
    • qcow2[25]: Formato de imagem QEMU (QEMU copy-on-write), o formato mais versátil. Usado para ter imagens menores (útil se o seu sistema de arquivos não suportar buracos (holes), por exemplo no Windows), criptografia AES opcional, compactação baseada em zlib e suporte a vários snapshots. Ligeiramente mais lenta que imagens do tipo raw.
    • vmdk[26]: Formato de imagem utilizado pelo VMWare, é aberto dês de 2011, Suporta thin-provision e copy-on-write. Formado por vários tipos de discos com características específicas: 2GbMaxExtentFlat; 2GbMaxExtentSparse; monolithicFlat; monolithicSparse; vmfs; vmfsSparse


    • vhd/vhdx: Formato de imagem utilizado pelo Microsoft Hyper-v, sendo o vhdx à partir do 2012 em diante.
    • vdi: Formato utilizado pelo virtualbox

Usando qemu-img

  • A ferramenta de linha de comando qemu-img é usada para formatar, modificar e verificar vários sistemas de arquivos usados pelo KVM
    • Uso diverso:
# qemu-img
Parâmetros importantes:
# qemu-img info [-f format] imgname → Mostra o tamanho real usado por uma imagem
# qemu-img check [-f format] imgname → Checa consistência da imagem
# qemu-img map [-f fmt] [--output=fmt] imgname → Exporta o metadata do disco (human ou json)
# qemu-img convert [-O output format] [-S esparsado (não thinprovision)] imgname output_imgname → Converte uma imagem
# qemu-img create [-f format] [-o options] filename [size] → Cria uma nova imagem. 
# qemu-img resize filename [+|-]size[K|M|G|T] → Altera tamanho da imagem. RAW permite diminuir e aumentar. Qcow2 somente aumentar
    • Para backup
# qemu-img create [-f format] [-o -o backing_file=filename] filename [size] → Cria a nova imagem com o diferencial em relação a imagem base.
# qemu-img rebase [-f fmt] [-t cache] [-p] [-u] -b backing_file [-F backing_fmt] filename → Altera o arquivo base de backup
    • Para snapshot
# qemu-img snapshot -l imgname → Lista os snapshots de uma imagem
# qemu-img snapshot -a snapshot imgname → Aplica o snap a imagem, ou seja, reverte o disco para o snapshot salvo
# qemu-img snapshot -c snapshot imgname → Cria um snapshot para uma imagem
# qemu-img snapshot -d snapshot imgname → Deleta um snapshot


Montando partições e acessando arquivos de imagem usando libguestfish

Libguestfs é um conjunto de ferramentas para acessar e modificar disco/imagens de maquinas virtuais. Pode ser usado para:

    • Modificar discos de VMs
    • Monitorar estatísticas de uso de disco
    • Migrações do tipo P2V e V2V
    • Fazer clones, construir VMs, formatar e modificar tamanho de discos, etc
  • Shell de resgate de VM virt-rescue[27]: Inicia a maquina virtual, semelhante a um Rescue-CD, permite analisar os danos no disco virtual da VM
. Abre o rescue montando as unidades em /sysrep
# virt-rescue -a imagem.img -i
  • Usa um script interativo shell chamado guestfish
    • guestfish (e subcomandos)[28]:

Guestfish não monta a imagem diretamente no sistema de arquivos local. Em vez disso, ele fornece uma interface de shell que permite visualizar, editar e excluir arquivos. Muitos dos comandos guestfish, como touch, chmod e rm, são semelhantes aos comandos bash tradicionais.

      • Subcomandos do Shell interativo
add [imagem do disco] → Adiciona imagem para ser analisada
run → Inicia imagem do disco
list-filesystems → Exibe os sistemas de arquivos presentes na imagem
mount [caminho] / → monta o sistema de arquivos no / 
cat /etc/fstab → Exibe o conteúdo do arquivo da montado dentro da imagem
      • Subcomandos do comando (não interativo)
# guestfish --rw -a disk.img -i edit /boot/grub/grub.conf → Acessa a imagem permitindo escrita editando o arquivo grup.conf
# guestfish --ro -a disk.img -i cat /etc/passwd → Acessa a imagem, exibindo o conteúdo de um arquivo

# guestfish -N → Prepara um novo disco ??
  • guestmount[29]: A ferramenta guestmount permite montar imagem de máquina virtual no sistema de arquivos local.
. Monta a imagem no diretório /mnt. Opção '-i' inspeciona a imagem procurando os pontos de montagem
# guestmount -a centos63_desktop.qcow2 -i --rw /mnt

. Monta o disco virtual de uma VM através do libvirt, por isso a opção '-d' e o nome do guest
# guestmount -d Guest -i --ro /mnt
  • guestunmount[30]: Desmonta os sistemas de arquivos montados pelo guestmount.
# guestunmount /mnt

Serve também para monitorar um programa e desmontar o ponto de montagem se este programa for interrompido inesperadamente.

Copiar conteúdo do disco físico para a imagem do disco virtual

  • Para copiar dados para a imagem da máquina virtual, podemos fazer a montagem local através do guestmount e fazer a cópia normalmente.
  • Também podemos usar as aplicações abaixo:
    • virt-copy-in: Copia arquivos ou pastas da máquina local para dentro de um disco virtual
. Copiar o arquivolocal.txt para o diretório /etc dentro da imagem imagem.img
# virt-copy-in -a imagem.img arquivo_local.txt /etc
    • virt-copy-out: Copia arquivos ou pastas de dentro da imagem da máquina virtual para o sistema de arquivos local.
. Copia o diretório usuarioY de dentro da imagem da VM para dentro do /tmp/ local
# virt-copy-out -a imagem.img /home/usuarioY /tmp/
  • Algumas outras aplicações e utilitários:
    • virt-diff: Lista as diferenças entre arquivos em duas máquinas virtuais ou imagens de disco. O caso de uso usual é mostrar as mudanças em uma VM após sua execução por um tempo, tirando um snapshot, executando a VM e, em seguida, usando esta ferramenta para mostrar o que mudou entre o novo estado da VM e o instantâneo antigo.
# virt-diff -a imagem_antiga.img -A imagem_atual.img
  • virt-inspector: Examina a maquina virtual ou imagem de disco e tenta determinar a versão do sistema operacional e muitas outras informações do guest. Gera uma saída do tipo .XML
# virt-inspector -a imagem.img
  • virt-filesystems: Lista os sistemas de arquivos, partições, volumes lógicos da imagem da VM.
# virt-filesystems -a imagem.img
  • virt-df: Exibe o espaço livre em uma imagem de máquina virtual
#virt-df -h -a imagem.img
  • virt-resize: Redimensiona o disco virtual da VM, transformando para maior ou menor; redimensionando ou excluindo partições contidas nele.
# virt-resize --resize /dev/sda1=+200M --expand /dev/sda2 olddisk newdisk
  • virt-sparsify: Transforma o disco ou imagem no tipo thin-provision, devolvendo ao hypervisor o espaço livre.
# virt-sparsify indisk outdisk

Migrar o conteúdo do disco entre vários formatos de imagens de disco virtual

  • Para converter imagens em vários formatos, podemos utilizar o qemu-img convert visto acima. Além disso para auxiliar nas tarefas de migração de maquinas virtuais, temos as seguinte aplicação:
    • virt-v2v[31]: Converte um único guest de um hipervisor externo para rodar em KVM. Ele pode ler VMs Linux e Windows em execução em VMware, Xen, Hyper-V e alguns outros hipervisores e convertê-los em KVM gerenciado por libvirt, OpenStack, oVirt, Red Hat Virtualization (RHV) ou vários outros destinos. Ele pode modificar o guest para torná-lo inicializável no KVM e instalar drivers virtio para que seja executado rapidamente.
. Converte uma instância do VMware Vcenter para libvirt local
# virt-v2v -ic vpx://vcenter.example.com/Datacenter/esxi vmware_guest

. Converte uma imagem de outro hypervisor para KVM
# virt-v2v -i disk disk.img -o local -os /var/tmp

. Converte um Xen para KVM local tipo raw
# virt-v2v -ic "xen+ssh://root@xen-sample-host.com" -os default rhel5-para -of raw
  • virt-p2v[32]: Serve para migrar máquinas físicas para rodar no KVM. Geralmente inicia a máquina a ser migrada com um disco de boot separado. O virt-p2v é executado neste ambiente e exporta o S.O. do convidado para o hypervisor no formato suportado pelo KVM.
  • virt-p2v-make-disk: Este é o script que cria um disco inicializável para ser usado no procedimento de exportação de máquina física para virtual, usando o virt-p2v.
. Cria um disco de inicialização com o virt-p2v no pendrive
# virt-p2v-make-disk -o /dev/sdX


  • virt-sysprep[33]: Redefine ou desconfigura uma máquina virtual para que clones possam ser feitos a partir dela. As etapas desse processo incluem a remoção de chaves de host SSH, a remoção da configuração MAC persistente da rede e a remoção de contas de usuário. O Virt-sysprep também pode personalizar uma máquina virtual, por exemplo, adicionando chaves SSH, usuários ou logotipos. Deve ser aplicado em uma VM Template ou que vai se tornar um template.
. Exemplo utilizando uma VM administrada pelo Libvirt
# virt-sysprep -d {vmDomainHere} --enable ssh-hostkeys,udev-persistent-net

. Exemplo configurando o hostname e adicionando uma conta. Usado em VMs após o clone
# virt-sysprep -d testvm --hostname testvm --enable user-account --keep-user-accounts vivek

Conhecimento de Open Virtualization Format (OVF)

O padrão Open Virtualization Format (OVF) da DMTF fornece à indústria um formato de pacote padrão para soluções de software baseadas em sistemas virtuais, resolvendo necessidades críticas de negócios para fornecedores de software e provedores de serviços de computação em nuvem. O OVF foi adotado e publicado pela Organização Internacional de Padronização (ISO) como ISO 17203[34].

  • Disponível nas versões 1 e 2, a estrutura de um pacote ovf é utilizado para migração entre diferentes hypervisors. Compactado no formato .ova, ele compõe:
    • Um descritor OVF (.ovf)
    • Um arquivo de manifesto (.mf) - Não obrigatório
    • Um certificado (.cert) - Não obrigatório
    • Um ou mais imagem de disco - Não obrigatório
    • Um ou mais arquivos de recursos, como imagem ISO - Não obrigatório
  • O formato da imagem de disco deve ter informação suficiente para uma pessoa conseguir identificar como acessá-lo, através do atributo ovf:format.