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:- 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 ogit clone
. -
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
emake 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.
- Os comandos
-
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
.
- O comando
-
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.-
Instalação de pacotes (Debian):
libvirt0 libvirt-daemon libvirt-clients virtinst virt-viewer
-
Adição do usuário no grupo libvirt:
# usermod -a -G libvirt giulianob
-
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, quandosudo 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:
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.export LIBVIRT_DEFAULT_URI=qemu:///system
Em seguida, foi copiado da configuração padrão do libvirt:
e salvo em<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>
$HOME/papainoel.xml
. Para criar a rede:
para lançar a rede:virsh net-create --file $HOME/papainoel.xml
Em seguida, para instalar a VM no libvirt:virsh net-start papainoel
Por fim, para compartilhar a home com a VM basta montar na vm: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
Isto são basicamente os passos que deverão ser implementados no setup do kw.mount -t 9p -o trans=virtio,version=9p2000.L,rw share_kw /home/giulianob/share/