Introdução ao qemu
qemu é uma solução completa de
virtualização para Linux em hardware x86 contendo extensões de
virtualização (Intel VT ou AMD-V).
Esse pacote é conhecido por construir e funcionar corretamente
usando uma plataforma LFS 12.3.
Informação do Pacote
-
Transferência (HTTP): https://download.qemu.org/qemu-9.2.2.tar.xz
-
Transferência (FTP):
-
Soma de verificação MD5 da transferência:
417dc130a89238ba5347ced224497ee1
-
Tamanho da transferência: 129 MB
-
Espaço em disco estimado exigido: 2,3 GB (475 MB instalado)
-
Tempo de construção estimado: 1,1 UPC (adicionar 0,5 UPC para
testes, ambos usando paralelismo=4)
Dependências do Qemu
Exigidas
GLib-2.82.5 e Pixman-0.44.2
Recomendadas
alsa-lib-1.2.13, dtc-1.7.2, libslirp-4.9.0 e SDL2-2.30.11
Nota
Se dtc-1.7.2 não estiver instalado, o sistema de
construção tentará baixar uma cópia do código-fonte do dtc a
partir da Internet.
Opcionais
pipewire-1.2.7 ou PulseAudio-17.0 (pode ser usado em vez de
alsa-lib), BlueZ-5.79, cURL-8.12.1,
Cyrus SASL-2.1.28, Fuse-3.16.2, GnuTLS-3.8.9, GTK-3.24.48,
keyutils-1.6.3, libaio-0.3.113,
libusb-1.0.27, libgcrypt-1.11.0, libjpeg-turbo-3.0.1, libseccomp-2.6.0, libssh2-1.11.1, libpng-1.6.46,
libtasn1-4.20.0, Linux-PAM-1.7.0,
LZO-2.10, Nettle-3.10.1, Mesa-24.3.4, VTE-0.78.4,
capstone, ceph, daxctl, JACK, glusterfs, libbpf,
libcacard,
libcap-ng,
libdw,
libiscsi, libnfs,
libpmem,
libssh,
libu2f-emu,
lzfse,
netmap, numactl, rdma-core, SELinux, snappy,
spice, usbredir e
VDE
Opcionais (Tempo de execução)
Systemd-257.3
Opcional (para construir a documentação)
sphinx_rtd_theme-3.0.2
Nota
Esta lista de dependências opcionais não está completa. Veja-se a
saída gerada de ./configure
--help para uma lista mais completa.
Observações de Editor(a): https://wiki.linuxfromscratch.org/blfs/wiki/qemu
Instalação do qemu
A regra de udev do LFS permite somente que o(a) usuário(a)
root
, os(as) usuários(as)
proprietários(as) de uma sessão local de login suportada pela
dependência opcional de tempo de execução Systemd-257.3 ou os(as) usuários(as) no
grupo kvm
usem o dispositivo KVM.
Como o(a) usuário(a) root
, adicione
quaisquer usuários(as) não root
que
poderiam usar o dispositivo KVM, mesmo sem o Systemd-257.3 instalado ou remotamente
(por meio de uma conexão SSH), ao grupo kvm
:
usermod -a -G kvm <nome_de_usuário(a)>
Instale o qemu executando os
seguintes comandos:
Nota
O qemu é capaz de executar muitos alvos. O processo de construção
também é capaz de construir vários alvos de uma vez em uma lista
delimitada por vírgulas atribuída a --target-list
. Execute ./configure --help para obter
uma lista completa dos alvos disponíveis.
if [ $(uname -m) = i686 ]; then
QEMU_ARCH=i386-softmmu
else
QEMU_ARCH=x86_64-softmmu
fi
mkdir -vp build &&
cd build &&
../configure --prefix=/usr \
--sysconfdir=/etc \
--localstatedir=/var \
--target-list=$QEMU_ARCH \
--audio-drv-list=alsa \
--disable-pa \
--enable-slirp \
--docdir=/usr/share/doc/qemu-9.2.2 &&
unset QEMU_ARCH &&
make
qemu usa ninja como um subprocesso ao
construir. Para executar os testes, emita: ninja test. Um teste,
qtest-x86_64/bios-tables-test, é conhecido por falhar em alguns
sistemas.
Agora, como o(a) usuário(a) root
:
make install
Mude as permissões e a propriedade de um script auxiliar, que é
necessário ao usar o dispositivo de rede de comunicação
“bridge”
(veja-se abaixo). Novamente, como o(a) usuário(a) root
, emita:
Nota
Você precisa adicionar quaisquer usuários(as) que possam usar o
dispositivo de rede de intercomunicação “bridge” ao grupo
kvm
, mesmo se o Systemd-257.3 estiver instalado.
chgrp kvm /usr/libexec/qemu-bridge-helper &&
chmod 4750 /usr/libexec/qemu-bridge-helper
Nota
Por conveniência, você possivelmente deseje criar um link
simbólico para executar o aplicativo instalado. Por exemplo (como
o(a) usuário(a) root
):
ln -sv qemu-system-`uname -m` /usr/bin/qemu
Usando o Qemu
Como usar o qemu significa usar um computador virtual, as etapas
para configurar a máquina virtual estão em estreita analogia com
aquelas para configurar um computador real. Você precisará tomar
decisões a respeito de CPU, memória, disco, dispositivos USB,
placa(s) de rede de intercomunicação, tamanho da tela, etc. Assim
que o “hardware” estiver decidido, você terá, por
exemplo, de escolher como conectar a máquina à internet e(ou)
instalar um sistema operacional. Na seção seguinte, nós mostramos
maneiras básicas de realizar essas etapas. Porém, o qemu é muito
mais poderoso que isso, e é fortemente aconselhado ler-se a
documentação do qemu em /usr/share/doc/qemu-9.2.2/qemu-doc.html
.
Nota
É uma prática padrão nomear o computador executando qemu como
“anfitrião”
e a máquina emulada executando sob qemu como “convidada”. Nós
usaremos essas notações no texto seguinte.
Nota
As instruções seguintes assumem que o link simbólico opcional,
qemu
, tenha sido criado. Além
disso, o qemu
deveria ser executado em um ambiente gráfico. Também é possível
usar-se o qemu “sem uma
parte superior” ou via SSH. Veja-se a documentação
para as várias possibilidades.
Disco
Um disco virtual pode ser configurado da seguinte maneira:
VDISK_SIZE=50G
VDISK_FILENAME=vdisk.img
qemu-img create -f qcow2 $VDISK_FILENAME $VDISK_SIZE
O tamanho do disco virtual e o nome do arquivo deveriam ser
ajustados conforme desejado. O tamanho atual do arquivo estará
menor que o especificado, mas será expandido conforme necessário,
de forma que é seguro colocar um valor alto.
Operating System
Para instalar um sistema operacional, baixe uma imagem ISO a partir
da sua distribuição preferida Linux. Para os propósitos deste
exemplo, usaremos Fedora-16-x86_64-Live-LXDE.iso
no diretório
atual. Execute o seguinte:
qemu -enable-kvm \
-drive file=$VDISK_FILENAME \
-cdrom Fedora-16-x86_64-Live-LXDE.iso \
-boot d \
-m 1G
Siga os procedimentos normais de instalação para a distribuição
escolhida. A opção -boot
especifica a ordem de inicialização das unidades como uma sequência
de caracteres de letras de unidades. As letras de unidade válidas
são: a, b (disquete 1 e 2), c (primeiro disco rígido), e d
(primeiro CD-ROM). A opção -m
é a quantidade de memória a
usar-se para a máquina virtual. A escolha depende da carga do
anfitrião. As distribuições modernas deveriam estar confortáveis
com 4 GB. A opção -enable-kvm
permite a aceleração de
hardware. Sem essa chave, a emulação é muito mais lenta.
Definindo o hardware virtual
O hardware da máquina virtual é definido pela linha de comando do
qemu. Um exemplo de comando é dado abaixo:
qemu -enable-kvm \
-smp 4 \
-cpu host \
-m 1G \
-drive file=$VDISK_FILENAME \
-cdrom grub-img.iso \
-boot order=c,once=d,menu=on \
-net nic,netdev=net0 \
-netdev user,id=net0 \
-device ac97 \
-vga std \
-serial mon:stdio \
-name "fedora-16"
Significado das opções da linha de comando
-enable-kvm
: habilita o
suporte completo à virtualização KVM. Em alguns hardwares,
possivelmente seja necessário adicionar a opção não documentada
-machine smm=off
para a finalidade de
habilitar o KVM.
-smp <N>
: habilita o
multiprocessamento simétrico com <N> CPUs.
-cpu <model>
: simula
a CPU <model>. A lista dos modelos suportados pode ser obtida
com -cpu help
.
-drive
file=<nome_do_arquivo>
: define um disco virtual
cuja imagem está armazenada em <nome_de_arquivo>
.
-cdrom grub-img.iso
: define
um arquivo em formato ISO para usar-se como um CDROM. Aqui nós
usamos um disco de resgate do GRUB, que possivelmente seja útil se
algo der errado em tempo de inicialização.
-boot
order=c,once=d,menu=on
: define a ordem da inicialização
para o BIOS virtual.
-net
nic,netdev=<netid>
: define uma placa de rede de
comunicação conectada ao dispositivo de rede de comunicação com id
<netid>.
-netdev
user,id=<netid>
: define o dispositivo do(a)
“usuário(a)”
da rede de comunicação. Essa é uma rede de comunicação local
virtual com endereços 10.0.2.0/24, onde o anfitrião tem o endereço
10.0.2.2 e atua como um gateway para a Internet; e com um servidor
de nomes no endereço 10.0.2.3 e um servidor SMB no endereço
10.0.2.4 . Um servidor DHCP integrado consegue alocar endereços
entre 10.0.2.15 e 10.0.2.31.
-soundhw <modelo>
:
define o modelo da placa de som. A lista pode ser obtida com
-soundhw help
.
-vga <tipo>
: define o
tipo de placa VGA a emular. Para -vga
std
, se você estiver construindo um núcleo Linux para o
convidado, é recomendado habilitar CONFIG_DRM_BOCHS
(como parte do núcleo ou um módulo
do núcleo) para controlar todos os recursos da placa VGA emulada e
CONFIG_FB
para exibir o console do
Linux nela. Os outros valores <tipo>
não estão testados pelos(as)
editores(as) e possivelmente exijam dependências adicionais.
-serial mon:stdio
: envia a
porta serial do convidado (/dev/ttyS0
em convidados Linux), multiplexada com o monitor do qemu, para a
entrada e saída padrão do processo do qemu.
-name <nome>
:
configura o nome do convidado. Esse nome é exibido na legenda da
janela do convidado. Possivelmente seja útil se você executar
vários convidados ao mesmo tempo.
-drive
if=pflash,format=raw,readonly=on,file=/usr/share/qemu/edk2-x86_64-code.fd
:
Carrega um firmware EDK2 UEFI pré construído, em vez do BIOS padrão
do PC. Use essa opção se você quiser inicializar o Sistema
Operacional convidado com UEFI.
-drive
file=<nome_do_arquivo>,if=virtio
: fornece uma
interface Virtio para o núcleo do convidado para acessar a imagem
do disco, em vez de simular um hardware real de disco. Isso pode
melhorar o desempenho de Entrada/Saída do disco, mas exige um
controlador Virtio no núcleo do convidado. Use-o em vez de um
-drive
simples se o núcleo do convidado
suportar Virtio. Para construir um núcleo Linux com suporte Virtio
para o convidado, use make defconfig
&& make kvm_guest.config para criar uma
configuração inicial do núcleo com as unidades Virtio habilitadas,
então faça tua personalização. E, se o núcleo do convidado for
Linux, os discos virtuais usando a interface Virtio serão nomeados
vdx
no devtmpfs, em vez de
sdx
.
-net
nic,netdev=net0,model=virtio-net-pci
: fornece uma interface
Virtio para o núcleo do convidado para acessar a interface de rede
de intercomunicação, em vez de simular uma placa real de interface
de rede de intercomunicação. Isso pode melhorar o desempenho de
Entrada/Saída da rede de intercomunicação, mas exige um controlador
Virtio no núcleo do convidado. Use-o em vez de um -net
simples se o núcleo do convidado suportar
Virtio.
Controlando a Tela Emulada
Para configurar a resolução da tela emulada para um servidor Xorg
executando no sistema Linux convidado, leia-se “Configurações de Ajuste
Fino de Exibição”.
Rede de comunicação
A solução acima para rede de intercomunicação permite que o
convidado acesse a rede local de intercomunicação por meio do
anfitrião (e possivelmente acesse a Internet por meio de roteadores
locais), mas o inverso não é verdadeiro. Nem mesmo o anfitrião
consegue acessar o convidado, a menos que o encaminhamento de porta
esteja habilitado. E, no caso de vários convidados estarem
executando, eles não conseguirão se comunicarem uns com os outros.
Outros dispositivos de rede de intercomunicação podem ser usados
para esse propósito. Por exemplo, existe o dispositivo “socket”, que permite que
vários convidados compartilhem uma rede virtual de intercomunicação
comum. Na seção seguinte, nós descrevemos em mais detalhes como
configurar o dispositivo “bridge”, que permite que os convidados
apareçam como se estivessem conectados à rede local de
intercomunicação. Todos os comandos abaixo deveriam ser executados
como o(a) usuário(a) root
.
Permite que o anfitrião encaminhe pacotes IP:
sysctl -w net.ipv4.ip_forward=1
Para tornar isso permanente, adicione o comando a /etc/sysctl.d/60-net-forward.conf:
cat >> /etc/sysctl.d/60-net-forward.conf << EOF
net.ipv4.ip_forward=1
EOF
Apronte um arquivo exigido de configuração:
install -vdm 755 /etc/qemu &&
echo allow br0 > /etc/qemu/bridge.conf
Na linha de comando do qemu acima, substitua a chave -netdev user,...
por -netdev bridge,...
.