Emulação do Sistema com o QEMU

A máquina dentro da máquina

O QEMU é um emulador de software livre para sistemas de PC completos. Além de emular um processador, o QEMU permite a emulação de todos os subsistemas necessários, como hardware de interligação de redes e de vídeo. Ele também permite a emulação de conceitos avançados, como sistemas de multiprocessamento simétrico (até 255 CPUs) e outras arquiteturas de processador, como ARM ou PowerPC. Este artigo explora o QEMU e sua arquitetura e mostra como emular um sistema operacional convidado em um host Linux® .

M. Tim Jones, Consultant Engineer, Emulex Corp.

M. Tim JonesM. Tim Jones é um arquiteto de firmwares embarcados e autor de Inteligência Artificial: Sistemas de Abordagem, GNU/Linux, Programação de Aplicativos AI (atualmente em sua segunda edição), Programação de Aplicativos AI (em sua segunda edição) e BSD Sockets Programming from a Multilanguage Perspective. Sua formação em engenharia vai desde o desenvolvimento de kernels para nave espacial geossincrônica até a arquitetura de sistema embarcado e o desenvolvimento de protocolos de interligação de redes. Tim é um Engenheiro Consultor para a Emulex Corp. em Longmont, Colorado.


nível de autor Contribuidor do
        developerWorks

25/Set/2007

O Que É QEMU?

Dizer que virtualização é uma tecnologia de ponta hoje é uma meia verdade. Hoje, pesquisar no google a palavra virtualização resulta em cerca de 22 milhões de ocorrências. Por exemplo, em um único mês, a EMC Corporation anunciou um IPO para VMware, a Citrix Systems anunciou planos para comprar a XenSource e novos negócios de virtualização apareceram repentinamente. Novos nichos estão sendo fundados continuamente no que parece ser um mercado astronomicamente grande. Mas, com toda a conversa sobre ofertas públicas iniciais e aquisições em virtualização nos dias de hoje, é fácil esquecer algumas das outras tecnologias de virtualização que existem por aí.

Neste artigo, familiarize-se com um dos mais interessantes aplicativos de virtualização que não está mencionado nas manchetes atuais, o QEMU. O QEMU é um aplicativo que é possível utilizar em uma série de configurações. É possível utilizá-lo para virtualização do sistema operacional convidado ou como um emulador de máquina integral executando sistemas operacionais destinados para a CPU host ou outras arquiteturas de CPU.


Introdução Rápida à Virtualização

Vamos iniciar com uma rápida introdução à virtualização para configurar a etapa para QEMU.

Virtualização no contexto deste artigo é realmente virtualização de plataforma. No hardware físico, um programa de controle pode ser o sistema operacional host ou um hypervisor (consulte a Figura 1). Em alguns casos, o sistema operacional host é o hypervisor. Os sistemas operacionais convidados residem no hypervisor. Em alguns casos, o sistema operacional convidado é destinado à mesma CPU como o programa de controle, mas outros casos podem ser diferentes (por exemplo, um convidado PowerPC em execução no hardware x86).

Figura 1. Arquitetura Básica de Virtualização de Plataforma
Figura 1. Arquitetura Básica de Virtualização de Plataforma

É possível obter a virtualização de diversas maneiras, mas três importantes métodos são vistos mais frequentemente. O primeiro é chamado virtualização nativa (ou integral). Nessa variação, um hypervisor implementa os elementos básicos de isolamento, separando o hardware físico dos sistemas operacionais convidados. Isso foi demonstrado primeiro em 1966 no® sistema operacional de memória de máquina/virtual CP-40 da IBM e também é utilizado pelo VMware ESX Server.

Uma outra técnica de virtualização conhecida é chamada paravirtualização. Na paravirtualização, o programa de controle implementa uma Interface de Programação do Aplicativo (API) do hypervisor que é utilizada pelo sistema operacional convidado. A paravirtualização é utilizada por ambos: o Xen e a Kernel-based Virtual Machine (KVM) Linux.

Uma terceira técnica de virtualização útil é chamada emulação. Emulação, como o nome implica, virtualiza a plataforma convidada simulando o ambiente de hardware completo. Emulação é implementada em uma variedade de maneiras, mesmo dentro da mesma solução. Exemplos de virtualização através de emulação incluem QEMU e Bochs.


Arquitetura de QEMU

Vamos examinar como o QEMU obtém emulação. Esta seção descreve os dois modos de QEMU de operação e também alguns dos aspectos interessantes do conversor dinâmico de QEMU.

Operação de QEMU

O QEMU suporta dois modos operacionais: emulação do modo de usuário e emulação do modo de sistema. A emulação do modo de usuário permite um processo construído para uma CPU a ser executado em outra (executando conversão dinâmica das instruções para a CPU host e conversão de chamadas do sistema Linux apropriadamente). A emulação do modo de sistema permite a emulação de um sistema integral, incluindo o processador e periféricos variados.

Quando o x86 está sendo emulado em um sistema host x86, o desempenho quase nativo pode ser obtido utilizando o que é chamado de acelerador de QEMU. Isso permite a execução do código emulado diretamente na CPU host (no Linux por meio de um módulo do kernel).

Mas o que torna o QEMU interessante a partir de uma perspectiva técnica é seu conversor dinâmico rápido e portátil. O conversor dinâmico permite a conversão em tempo de execução de instruções para uma CPU de destino (convidada) para a CPU host para fornecer emulação. Isso pode ser feito de uma maneira de força bruta (mapeando instruções de uma CPU para outra), mas não é sempre tão simples e, em alguns casos, pode requerer múltiplas instruções ou mudanças no comportamento com base nas arquiteturas sendo convertidas.

O QEMU obtém conversão dinâmica primeiro convertendo instruções de destino em micro-operações. Essas micro-operações são bits do código C que são compilados em objetos. O conversor de núcleo é então construído. Ele mapeia as instruções de destino para micro-operações para conversão dinâmica. Este não é apenas eficiente, mas também portátil.

O conversor dinâmico do QEMU também armazena em cache blocos de código convertido para minimizar a sobrecarga do conversor. Quando um bloco de código de destino é encontrado primeiro, o bloco é convertido e armazenado como um bloco convertido. O QEMU armazena em cache os blocos convertidos mais recentemente utilizados em um bloco de 16 MB. O QEMU pode até suportar código auto-modificável invalidando blocos convertidos no cache.

Para saber mais sobre os detalhes internos do QEMU e seu conversor dinâmico, verifique a seção Recursos para obter um documento interessante por Fabrice Bellard (o autor do QEMU).

Periféricos Suportados

Utilizar o QEMU como um emulador do sistema PC fornece uma extensa variedade de periféricos. Periféricos padrão que são esperadas a inclusão: um emulador Video Graphics Array (VGA) de hardware, mouse e teclado PS/2, disco rígido e interface de CD-ROM do Ambiente de Desenvolvimento embarcado (IDE) e emulação do disco flexível. Além disso, o QEMU inclui a emulação para um adaptador de rede NE2000 Peripheral Controller Interconnect (PCI), portas seriais, numerosas placas de som e um controlador do Universal Serial Bus (USB) da Universal Host Controller Interface (UHCI) de PCI (com um hub do USB virtual). O suporte do Processor Symmetric Multiprocessing (SMP) também é fornecido com o suporte para até 255 CPUs.

Além de emular um PC padrão ou ISA PC (sem um barramento PCI), o QEMU pode também emular outro hardware não-PC como a placa-mãe ARM Versatile (utilizando o 926E) e a placa Malta million instructions per second (MIPS). O trabalho está em andamento para uma variedade de outras plataformas, incluindo o Power Macintosh G3 (Azul & Branco) e o Sun-4u.


Construindo e Instalando o QEMU

Construir e instalar o QEMU é quase tão simples quanto utilizar ferramentas do GNU padrão. Após fazer download e descompactar arquivo tar da distribuição do QEMU, configure, make e, em seguida, make install e está concluído (consulte a Lista 1).

Lista 1. Construindo o Emulador de QEMU
$ wget http://fabrice.bellard.free.fr/qemu/qemu-0.9.0.tar.gz
$ tar xfvz qemu-0.9.0.tar.gz
$ cd qemu-0.9.0
$ ./configure
$ make
$ make install
$

Esse processo cria não apenas uma imagem qemu executável para a arquitetura de destino atual, mas também um conjunto de imagens para outras arquiteturas, incluindo ARM, MIPS, PowerPC, 68k e SPARC. Com estes, é possível inicializar um kernel Linux que foi construído para uma arquitetura de destino diferente.

Se o seu sistema operacional host e convidado estão destinados para a mesma arquitetura de processador, é possível acelerar as coisas até quase um desempenho nativo utilizando o acelerador de QEMU (KQEMU). O KQEMU é um driver (módulo do kernel para Linux) que permite código de modo de usuário e código de kernel para executar diretamente na CPU host. Construir o acelerador de QEMU é o mesmo que construir o próprio QEMU (consulte a Lista 2).

Lista 2. Construindo o Acelerador de QEMU
$ wget http://fabrice.bellard.free.fr/qemu/kqemu-1.3.0pre11.tar.gz
$ tar xvfz kqemu-1.3.0pre11.tar.gz
$ cd kqemu-1.3.0pre11
$ ./configure
$ make
$ make install

É possível compilar ou instalar o KQEMU em uma série de sistemas operacionais, incluindo Microsoft® Windows®, FreeBSD® e Linux. Após construir o acelerador de QEMU, instale-o no Linux utilizando o seguinte comando:

$ insmod kqemu.ko
$

Utilizando o QEMU

Agora, examine Utilizando o QEMU para virtualizar uma outra máquina com um ambiente GNU/Linux de desktop típico. Emular uma outra máquina é semelhante a como você trata um computador novo em folha. A primeira etapa é instalar seu sistema operacional. Seu novo computador primeiro precisa ter um local para instalar o sistema operacional; portanto, é necessário um disco rígido.

O QEMU fornece um comando especial para criar um disco rígido chamado qemu-img. Esse utilitário pode criar imagens com vários formatos, mas o melhor (para qemu) é chamado qcow (ou qemu copy-on-write). A vantagem desse formato é que o tamanho da imagem do disco não é o mesmo que o arquivo físico que representa a imagem. Em outras palavras, o formato permite falhas que levam a uma imagem de disco mais compacta. Por exemplo, uma imagem de disco de 4 GB vazia requer apenas 16 KB.

Para qemu-img, forneça uma operação (create para criar uma nova imagem de disco), um formato (qcow para o formato de imagem qemu ) um tamanho e um nome para a imagem de disco. Esse exemplo emula uma máquina para uma distribuição de Linux muito pequena destinada para uso no Flash. Portanto, sua imagem de disco de 128 MB é criada como:

$ qemu-img create -f qcow disk.img 128M
Formating 'disk.img', fmt=qcow, size=131072 kB
$

Observe que se você planeja instalar um sistema operacional de aplicação geral como Windows, Linux ou FreeBSD, é necessário um tamanho de disco bem maior. O resultado dessa operação é um arquivo chamado disk.img que aparece como um disco de 128 MB quando emulado.

Agora que seu disco rígido foi criado, instale seu novo sistema operacional nele. Para propósitos de demonstração, eu utilizarei uma distribuição de Linux menor chamada cfLinux. cfLinux destina-se a ser utilizado como um sistema baseado em Linux embarcado apropriado para gateways, pontos de acesso wireless, firewalls ou roteadores. É possível fazer download dessa distribuição em formato ISO utilizando wget:

wget ftp://ftp.cflinux.fu/pub/cflinux/iso/cflinux-1.0.iso

Uma imagem ISO é um formato de CD-ROM (também conhecido como o sistema de arquivos ISO 9660).

Agora você tem um disco emulado (disk.img) e um CD-ROM a partir do qual é possível instalar o sistema operacional. A próxima etapa é instalar o sistema operacional em seu disco rígido. Isso é feito simplesmente com qemu:

$ qemu -hda disk.img -cdrom /root/cflinux-1.0.iso -boot d
$

Utilizar qemu, especifique sua imagem do disco rígido com a opção hda e o cdrom (arquivo no qual sua imagem ISO reside) com a opção cdrom . A opção boot especifica o boot a partir do CD-ROM. O argumento d especifica o boot a partir do CD-ROM, onde a inicializa a partir do disquete, c inicializa a partir do disco rígido (o padrão) e n inicializa a partir da rede. Quando esse comando é emitido, uma nova janela de QEMU que representa a máquina emulada aparece (consulte a Figura 2).

Figura 2. Preparando para Instalar cfLinux em um Disco Emulado com o QEMU
Figura 2. Preparando para Instalar cfLinux em um Disco Emulado com o QEMU

Siga as instruções de instalação, pela instalação do CD-ROM, para completar a instalação do ISO no disco rígido emulado. A instalação solicita que você reinicialize. Nesse momento, é possível finalizar a emulação (Ctrl-C na janela qemu ). Agora é possível efetuar boot no sistema operacional recém-instalado com o seguinte comando:

$ qemu -hda disk.img
$

Essa linha de comando simplesmente diz para emular um PC padrão (a opção padrão) com um disco rígido representado pelo arquivo de imagem disk.img. A imagem do Linux efetua boot a partir do disco rígido emulado, resultando na janela do QEMU, conforme mostrado na Figura 3.

Figura 3. Efetuando Boot no cfLinux Recém-instalado a partir do Disco Rígido Emulado
Figura 3. Efetuando Boot no cfLinux Recém-instalado a partir do Disco Rígido Emulado

Isso não poderia ser mais simples. Na verdade, é possível utilizar a mesma sequência para instalar e efetuar boot em qualquer variedade de sistema operacional (distribuição de Linux, Windows de produção ou de outro).


Outros Emuladores

Embora o QEMU seja um ambiente de emulação fantástico, vale a pena explorar outros. Wine é uma implementação de software livre da API do Windows que permite executar programas Windows sem o sistema operacional Windows. Mas, conforme o acrônimo Wine explica, Wine Não É um Emulador. Em vez disso o Wine implementa um conjunto de APIs que permitem a execução de aplicativos para a arquitetura x86. Portanto, aplicativos em execução no Wine tem um bom desempenho.

Um emulador semelhante ao QEMU é Bochs. Bochs é um emulador de máquina que emula não apenas ®i386™, i486™, Pentium®, Pentium Pro da Intel e CPUs AMD64 de Advanced Micro Devices, mas também os periféricos de PC comuns como discos, memória, monitor e dispositivos de rede. O Bochs foi utilizado para emular sistemas operacionais Linux, DOS e Windows 95/98/XP/2000/NT® .


Indo Além

Utilizar o QEMU como um emulador de máquina permite o experimento com muitos sistemas operacionais para os quais pode não ser possível ter uma máquina sobressalente disponível. Um exemplo é o ReactOS, que é um sistema operacional compatível com Windows XP de software livre (cuja emulação é mostrada na Figura 4). O ReactOS visa a compatibilidade binária com Windows XP, de forma que seja possível executar aplicativos construídos para Windows XP diretamente no ReactOS. Consulte os Recursos para obter detalhes sobre a compatibilidade de aplicativo atual.

Figura 4. Emulando um PC Padrão para o ReactOS
Figura 4. Emulando um PC Padrão para o ReactOS

Serão encontradas imagens do QEMU para ReactOS e muitos outros sistemas operacionais no Free Operating Systems Zoo (consulte a seção Recursos para obter detalhes adicionais). Estes incluem imagens de Live CD, imagens de disquete ou imagens de disco (em formato qcow ). O QEMU é uma ótima maneira de tentar um novo sistema operacional sem gastar tempo para a instalação.

Recursos

Aprender

Obter produtos e tecnologias

  • Faça download do emulador do processador de software livre do QEMU e do acelerador do QEMU a partir do Web site do Fabrice Bellard. Lá, será encontrada a documentação, APIs e o status atual do QEMU.
  • Saiba mais sobre cfLinux; o autor utilizou essa pequena distribuição para demonstrar a instalação de um sistema operacional em uma máquina do QEMU.
  • Obtenha imagens pré-compactadas a partir do Free Operating Systems Zoo e economize alguma tempo. Nesse site, serão encontradas muitas imagens do sistema operacional, a partir de distribuições de Linux padrão até outros sistemas operacionais mais exóticos (Plano 9, OpenSolaris, MINUX, ReactOS, Darwin, MenuetOS e outros). Após efetuar download de uma dessas imagens de disco, será obtida uma imagem de disco que está pronta para efetuar boot.
  • ReactOS é um sistema operacional compatível com binário Windows de software livre que permite a execução de muitos aplicativos Windows.
  • Wine permite a execução de aplicativos Windows em sistemas operacionais Windows não-nativos, como Linux.
  • Bochs é semelhante ao QEMU em que ele fornece emulação integral do sistema.
  • Com o Software de período experimental IBM, disponível para download diretamente do developerWorks, construa seu próximo projeto de desenvolvimento em Linux.

Discutir

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Linux, Software livre
ArticleID=382582
ArticleTitle=Emulação do Sistema com o QEMU
publish-date=09252007