Página Pessoal de Giuliano Belinassi

Página Pessoal de Giuliano Belinassi

Tópicos

  1. Setup
  2. Compilação
  3. Libvirt

Links

Kernel do Linux -- Desenvolvimento

1. Setup

O primeiro passo foi configurar uma máquina virtual QEMU com KVM, e instalar o Arch Linux. Não tive dificuldades neste passo, pois já mexi com máquinas virtuais antes. A instalação do Arch também não foi demasiada complicada e o primeiro tutorial encontrado no Google satisfez as necessidades.

O Segundo passo foi a instalação do NeoMutt. Aqui, mesmo usando o Setup fornecido pelo Siqueira, senti algumas dificuldades na configuração do Gmail da USP. A solução foi, infelizmente, habilitar a opção de aplicativos inseguros do gmail.

O terceiro passo foi a instalação do KW (kernel workflow). Aqui tive várias ajudas do autor (Siqueira) pois o script até então contém vários bugs.

2. Compilação

Aqui o objetivo era compilar o kernel fornecido pela branch do Torvalds e instalá-lo no Arch Linux. Basicamente isto constituiu nos seguintes passos:
  1. Clonar o repositório do Torvalds, fornecido em git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git Este procedimento foi trivial, pois bastou usar o git clone .
  2. Compilar o Kernel usando os arquivos de configuração do Arch Linux. Grosseiramente, foi seguido o tutorial disponível nesta página, porém listo algumas modificações que foram necessárias em meu sistema (Ubuntu 18.04):
    • Os comandos make nconfig e make kvmconfig foram executados no host.
    • O comando make oldefconfig não foi executado.
    • O comando make localmodconfig foi executado no guest.
    • O comando make ARCH=x86_64 -j8 foi executado no host.
  3. Instalar o kernel no Arch Linux, que consistiu nos seguintes passos:
    • O comando sudo make modules_install, executado no guest. Isto instala os modulos do kernel no sitema.
    • O comando sudo make headers_install INSTALL_HDR_PATH=/usr, executado no guest. Isto instala os headers (.h) do kernel no sitema.
    • O comando sudo cp -v arch/x86_64/boot/bzImage /boot/vmlinuz-devel, que coloca a imagem bootavel(?) do linux no diretório de boot
    • O comando sudo cp /etc/mkinitcpio.d/linux.preset /etc/mkinitcpio.d/linux-devel.preset, que cria um mkinitcpio para o novo kernel, necessário para o Arch.
    • Editar o arquivo recem-criado /etc/mkinitcpio.d/linux-devel.preset e trocar a linha contendo /boot/vmlinuz para /boot/vmlinuz-devel.
    • Gerar o initramfs através do comando sudo mkinitcpio -p linux-devel.
  4. Atualizar a configuração do grub usando o comando sudo grub-mkconfig -o /boot/grub/grub.cfg.

Seguindo os passos descritos acima, o kernel compilado iniciou e todo o sistema parece funcionar normalmente.

3. Libvirt

Foi nos fornecido um conjunto de scripts para o workflow com o kernel, e uma de suas características é a dependência com o QEMU e KVM. No linux isto não é um problema, a menos de possíveis alterações nos parâmetros de chamada do QEMU, mas sim é um problema para os usuários de Mac OS, pois não há suporte a KVM neste ambiente. Com isto em mente, passamos a criar uma estratégia para migrar para bibiloteca mais genérica -- o libvirt -- que supostamente deve resolver todos esses problemas. Vamos aos detalhes de criação de uma VM no libvirt.
  1. Instalação de pacotes (Debian): libvirt0 libvirt-daemon libvirt-clients virtinst virt-viewer
  2. Adição do usuário no grupo libvirt:
    
    			# usermod -a -G libvirt giulianob
    			
  3. Comunicação entre o Host e a VM. Os scripts usam através do QEMU o Userspace Networking mas aparente o libvirt não dá suporte a esse tipo de rede. A solução então é algo um pouco mais complexo: Criar uma rede no libvirt e fazer a comuniação entre a VM e o Host por este meio. Uma característica muito interessante é o fato da libvirt separar as máquinas e redes por usuário. No Debian, quanto se usa o comando virsh, são usadas as configurações de usuário. Por outro lado, quando sudo virsh é usado, o libvirt usará as configurações do usuário libvirt. Mas para criar a rede é necessario permitir o libvirt fazer uma bridge, que só é permitido em modo sudo. Isto implica que não é possível criar uma rede no libvirt para um usuário, pois caso o sudo seja usado, a rede será criado para o libvirt, e não para o seu usuário. A solução foi exportar a variável:
    
    			export LIBVIRT_DEFAULT_URI=qemu:///system
    			
    que é habilitado por padrão no ambiente Ubuntu. Uma consequência disso é que será visível apenas redes e máquinas do usuário libvirt, mas o sudo não será necessário para lançar as máquinas virtuais.

    Em seguida, foi copiado da configuração padrão do libvirt:

    
    					<network>
    					  <name>papainoel</name>
    					  <uuid>3f94494f-356f-4d9d-893e-4acd18d40a98</uuid>
    					  <forward mode='nat'/>
    					  <bridge name='virbr1337' stp='on' delay='0'/>
    					  <mac address='52:54:00:8a:da:00'/>
    					  <ip address='192.168.122.1' netmask='255.255.255.0'>
    						<dhcp>
    						  <range start='192.168.122.2' end='192.168.122.2'/>
    						</dhcp>
    					  </ip> 
    					</network>
    			
    e salvo em $HOME/papainoel.xml. Para criar a rede:
    
    			virsh net-create --file $HOME/papainoel.xml
    			
    para lançar a rede:
    
    			virsh net-start papainoel
    			
    Em seguida, para instalar a VM no libvirt:
    
    			virt-install -n archlinux --ram 1024 --boot hd \
    			     --vcpus=2 \
    				 --cpu=host \
    				 --os-type=linux \
    				 --os-variant=virtio26 \
    				 --disk=virty.qcow2,format=qcow2 \
    				 --filesystem /home/giulianob,kw_share \
    				 --network network=papainoel
    			
    Por fim, para compartilhar a home com a VM basta montar na vm:
    
    			mount -t 9p -o trans=virtio,version=9p2000.L,rw share_kw /home/giulianob/share/
    			
    Isto são basicamente os passos que deverão ser implementados no setup do kw.