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.1.
Informação do Pacote
-
Transferência (HTTP): https://download.qemu.org/qemu-8.2.1.tar.xz
-
Transferência (FTP):
-
Soma de verificação MD5: bda54248d773be2599df66f8995f10e1
-
Tamanho da transferência: 124 MB
-
Espaço em disco estimado exigido: 2,2 GB (373 MB instalado)
-
Tempo de construção estimado: 1,3 UPC (adicionar 0,8 UPC para
testes, ambos usando paralelismo=4)
Dependências do Qemu
Exigidas
GLib-2.78.4 e Pixman-0.43.2
Recomendadas
alsa-lib-1.2.11, Libslirp-4.7.0 e SDL2-2.30.0
Opcionais
pipewire-1.0.3 ou PulseAudio-17.0 (pode ser usado em vez de
alsa-lib), BlueZ-5.72, cURL-8.6.0,
Cyrus SASL-2.1.28, Fuse-3.16.2, GnuTLS-3.8.3, GTK+-3.24.41,
keyutils-1.6.3, libaio-0.3.113,
libusb-1.0.27, libgcrypt-1.10.3, libjpeg-turbo-3.0.1, libseccomp-2.5.5, libssh2-1.11.0, libpng-1.6.42,
libtasn1-4.19.0, Linux-PAM-1.6.0,
LZO-2.10, Nettle-3.9.1, Mesa-24.0.1, VTE-0.74.2,
capstone, ceph, daxctl, JACK, glusterfs, libbpf,
libcacard,
libcap-ng,
libdw,
libfdt,
libiscsi, libnfs,
libpmem,
libssh,
libu2f-emu,
lzfse,
netmap, numactl, rdma-core, SELinux, snappy,
spice, usbredir e
VDE
Opcionais (tempo de execução)
Systemd-255
Opcional (para construir a documentação)
sphinx_rtd_theme-2.0.0
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-255 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-255 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-8.2.1 &&
unset QEMU_ARCH &&
make
qemu usa ninja como um subprocesso ao
construir. Para executar os testes, emita: ninja test. Dois testes,
bios-tables-test e migration-test, são conhecidos por falharem.
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-255 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á decidir
a respeito de CPU, memória, disco, dispositivos USB, placa(s) de
rede de comunicaçã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. A seguir,
mostramos maneiras básicas de realizar essas etapas. Porém, o qemu
é muito mais que isso, e é fortemente aconselhado ler-se a
documentação do qemu em /usr/share/doc/qemu-8.2.1/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”. Usaremos
essas notações a seguir.
Nota
As instruções a seguir assumem que o link simbólico opcional,
qemu
, tenha sido criado. Além
disso, o qemu
deveria ser executado em um ambiente gráfico. Mas é possível usar
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), d (primeiro
CD-ROM). A opção -m
é a
quantidade de memória a usar para a máquina virtual. A escolha
depende da carga do anfitrião. As distribuições modernas deveriam
estar confortáveis com 1 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 como um CDROM. Aqui usamos um
disco de resgate do GRUB, que pode ser útil quando algo der errado
no momento da 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 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 o
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 os controladores Virtio
habilitados, então faça sua personalização. E, se o núcleo do
convidado for Linux, [então] 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 interface
Virtio para o núcleo do convidado para acessar a interface de rede
de comunicação, em vez de simular uma placa real de interface de
rede de comunicação. Isso pode melhorar o desempenho de
Entrada/Saída da rede de comunicaçã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 o
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 comunicação permite que o convidado
acesse a rede local de comunicaçã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 estiverem executando,
eles não conseguirão se comunicarem uns com os outros. Outros
dispositivos de rede de comunicaçã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 comunicação
comum. A seguir, descrevemos em mais detalhes como configurar o
dispositivo “bridge”, que permite que os convidados
apareçam como se estivessem conectados à rede local de comunicaçã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,...
.