Monthly Archives: February 2017

QEMU para desenvolvimento do Linux Kernel

Este post é um complemento do artigo anterior: Introdução a módulos no Linux Kernel.

QEMU é software livre hypervisor do tipo 2 que faz virtualização de hardware. É uma ótima ferramenta de auxílio ao desenvolvimento do Linux, conforme eu postei no artigo anterior. Neste artigo eu gostaria de expandir um pouco como usar o QEMU para desenvolvimento de novas funcionalidades no Kernel que afetam o user-space. Neste caso é interessante ter mais do que o busy-box como ferramentas de user-space, pois várias ferramentas de desenvolvimento, daemons e outros programas  estariam faltando. Por isso vamos utilizar uma imagem QEMU com Arch-Linux instalado básico.

Criar imagem para o QEMU

Obviamente é necessário fazer o download do QEMU e da iso Arch-Linux na sua máquina.

O QEMU provê ferramentas para a criação de um disco virtual que o próprio entende. Para isso vamos então criar um disco de 2G de tamanho, por exemplo:

Agora vamos bootar com a iso Arch-Linux previamente baixada:

Onde <archlinux.iso> é o arquivo baixado enteriormente.

Siga as instruções básicas de instalação do Arch. No meu caso, o que eu fiz foi o seguinte:

  1. Criei uma partição no disco usando fdisk
  2. Formatei esta partição como ext4 usando mkfs.ext4
  3. Montei ela em /mnt com # mount /dev/sda1 /mnt
  4. Criei uma pasta de boot em /mnt/boot  que não será usada (vamos usar nossa versão do Kernel e não a do Arch)
  5. Rodei # pacstrap /mnt base
  6. Criei fstab com # genfstab -U /mnt >> /mnt/etc/fstab
  7. Fiz chroot # arch-chroot /mnt
  8. Configurei o Time Zone e Locale apenas. O resto não é necessário para o que vamos fazer.
  9. No meu caso eu também instalei vim, bluez e alsa, já que uso esses pacotes para desenvolvimento. # pacman -S vim bluez alsa gdb . Se isso não functionar, rode o dhcpcd  antes na interface de rede habilitada.
  10. # exit  e # umount /mnt

Pronto!

Rodando tudo

Agora é tudo muito simples. Como não vamos usar o Kernel que vem com o Arch, eu recomendo configurar seu Kernel com todos os módulos que você precisa como built-in. Isso é important, já que o udev  da distro não conseguirá rodar modprobe  nos módulos que vem no Arch.

Também usamos a flag -enable-kvm  no QEMU. Isso faz com que o mesmo não interprete as instruções x86_64 e sim o processador nativo, aumentando muito a performance da nossa máquina virtual.

Tudo isso é meio que auto explicativo. Mas algumas coisas interessantes aqui é o argumento -nographic  e o -append . Ambos são usados para o QEMU direcionar o output do console no terminal. -m  é a quantidade de memória RAM.

Dicas

QEMU é uma ferramente bem avançada com suporte a muitas coisas. É preciso ler sua documentação e tentar brincar um pouco com as configurações.

Mas posso dar alguns exemplos aqui que eu mesmo uso.

Acessar periféricos USB

Adicione as seguintes linhas na chamada

Óbvio que 0xAAAA e 0xBBBB devem ser os valores respectivos do seu aparelho. Você pode facilmente obtê-lo com lsusb .

Seu usuário precisará ter acesso privilegiado ao device node.

Pasta compartilhada

Por padrão o QEMU já roda com -net nic -net user . Mas como queremos compartilhar pastas entre o host e o guest, vamos usar uma opção de rodar o samba junto.

O QEMU irá rodar o samba já tudo configurado, e dentro do sistema guest (ArchLinux) você precisa montar uma pasta com o seguinte comando:

O IP é fixo pelo QEMU mesmo e o caminho do SMB também. Agora o ~/host  pode ser qualquer lugar, claro.

Outras dicas

  • Uma dica importante é usar # shutdown -h now  na máquina virtual para desligá-la.
  • Rode # stty -F /dev/ttyS0 cols <X> rows <Y>  para configurar o terminal do Linux para não limitar as linhas e colunas menores do que seu terminal é capaz, ficando muito chato de usar. Para conseguir os valores de X e Y, eu rodo o comando resize  existente no xterm do host.

Se tiver mais dicas, exemplos ou correções, por favor, poste nos comentários. Eu vou agregar todas as dicas e exemplos de comandos que forem úteis para desenvolvimento do Linux.


Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts and no Back-Cover Texts.