QEMU

Quick EMUlator (QEMU)

Atua como emulador ou virtualizador, podendo emular diversas arquiteturas de processadores. Como virtualizador ele pode recorrer a um "acelerador" como o KVM.

Podendo trabalhar em dois modos:

  • User mode emulation: onde permite a execução de programas Linux/BSD originalmente compiladas para uma plataforma alvo sobre outras plataformas. Exemplo: executar aplicações Linux ELF arm64 sobre Linux x86_64.

  • Full system emulation: proporciona todo um ambiente para a virtualização de um sistema operacional (emulando arquiteturas de processadores, chipsets, tratando operações de I/O, e etc).

Ele consegue emular as seguintes arquiteturas: x86, x86_64, MIPS, ARMv7, ARMv8, PowerPC, SPARC. E para cada uma destas arquiteturas ele consegue emular um conjunto de controladoras/chipsets diferentes.

Quando não se usa um acelerador, o QEMU consegue emular uma arquitetura por meio de seu mecanismo de binary translation chamado de dynamic translator. E o dynamic translator se sustenta em técnicas como "block chaining" e "register mapping".

No block chaining o código de máquina da arquitetura original é quebrado em blocos e cada bloco é traduzido para a arquitetura real e executado quando necessário. No register mapping os registradores da arquitetura original são mapeados aos registradores equivalentes na arquitetura real.

Para permitir que essa solução de tradução dinâmica de código de máquina ocorra de forma portável para as diferentes arquiteturas suportadas, o QEMU traduz o código em uma linguagem intermediária chamada TCG Ops e depois traduz o código TCG para a arquitetura real do processador alvo.

Diagrama descrevendo processo do QEMU de tradução de binários de uma arquitetura para outra usando blocos de código via técnicas "block chaining" e "register mapping".

O QEMU é comumente usado na virtualização de infraestruturas e debbuging de aplicações cross-compiladas para outras plataformas de hardware. O Android Studio Emulator o usa para emular sistemas Android, desenvolvedores de sistemas embarcados o usa para testar seus drivers em ambiente de desenvolvimento, e soluções como Red Hat Virtualization e Proxmox o usa para o provisionamento de máquinas virtuais.

Exemplos de uso do QEMU.

Aceleradores

Como o mecanismo padrão de virtualização do QEMU é o binary translation (que é uma técnica sabidamente lenta), o QEMU também dispõe de integrações com outras tecnologias de virtualização para a melhoria da performance. Essas integrações são chamadas de "aceleradores" e são listados aqui:

  • tcg - Tiny Code Generator (acelerador padrão, virtualização baseado em software).

  • kvm - Kernel-based Virtual Machine.

  • hax - Intel Hardware Accelerator.

  • hwf - Apple Hypervisor Framework.

  • whpx - Windows Hypervisor Platform.

  • nvmm - NetBSD Virtual Machine Monitor.

Imagens de disco

Os dispositivos de bloco virtualizados podem ter os dados vindos de imagens de disco nos seguintes formatos:

  • raw (podendo ser arquivos brutos ou arquivos de dispositivos, ex.: /dev/sdb).

  • qcow.

  • qcow2.

  • qed.

  • vdi.

  • vmdk.

  • iso.

  • img.

  • dmg.

O suporte a cada um destes formatos de imagem de disco concede funcionalidades que podem ser interessantes ao administrador. Por exemplo, imagens ISO podem ser usadas para o boot de instalação de um sistema operacional, uma imagem QCOW2 pode ser usada para o armazenamento do rootfs da VM (o recurso de snapshots suportado por este tipo de imagem de disco poderão ser usados também), e o suporte a imagens VDI e VMDK poderá ser útil no throubleshooting de máquinas virtuais de outros virtualizadores.

Gerenciamento de I/O

Quando trabalhando com o KVM, o QEMU dedica uma thread para cada vCPU e uma thread dedicada para I/O.

Para otimizar I/O alguns drivers paravirtualizados como os do projeto VirtIO podem ser usados, ou a comunicação direta com dispositivos poderá ser configurada (device passthrough).

Processos do QEMU

Se três VMs qemu-kvm forem iniciadas, três processos qemu serão executados. Cada vCPU de uma VM qemu será uma thread do processo. Quando uma VM é desligada, o processo é finalizado. Quando reinicializada, o processo pode continuar sua execução.

Memória das VMs

A memória "física" de uma VM é um mapeamento para uma porção de memória do processo do qemu. Mas pode ser alterada para um arquivo com a opção -mem-path.

Rede

Por padrão, criar uma VM sem explicitar configuração de rede irá fazer com que o QEMU utilize o User Networking (baseado em SLIRP).

Sintaxe

Para a virtualização de sistemas operacionais, o QEMU dispõe de duas sintaxes diferentes.

Last updated