Na terceira semana de desenvolvimento relacionado ao Kernel do Linux na disciplina MAC0472 - LabXP objetivo foi compilar e instalar uma versão do ArchLinux em uma máquina virtual (vm). Também iniciei (junto com o Giuliano Belinassi) o desenvolvimento de código para melhoria da ferramenta de trabalho que iremos utilizar.

Como minha distro de desenvolvimento é o Ubuntu 18.04.1 LTS os passos que vou descrever são para utilização nesse ambiente.

  1. Tendo instalado a ferramenta KWorkflow procurei configurar o acesso via ssh à uma vm que possuia um Linux Arch instalado para que o comando kw prepare do KWorkflow configurase o restante do ambiente. Obs.: A própria melhoria em que estamos trabalhando se encarregará de poupar a configuração manual do acesso ssh à vm e este passo não será mais necessário no futuro.
    # @host
    kw up
    ssh-copy-id -i ~/.ssh/arch_ssh.pub -p 2222 marcelo@localhost
    # dizer yes
    # colocar a senha da VM
    
    # @vm
    # Com usuário root, copiar a chave ssh pública para ~/.ssh/authorized_keys 
    # (criar diretório e arquivo se necessário)
    sudo su
    mkdir .ssh
    cd ~/.ssh
    touch authorized_keys
    nano authorized_keys
    # Copiar o conteúdo da sua chave pública (provavelmente em ~/.ssh/<sua_chave>.pub no @host) 
    # para o arquivo ~/.ssh/authorized_keys na @vm
    
    # @host
    kw prepare
    
  2. Instalar os pacotes de dependência necessários para compilar o kernel do linux no Ubuntu.
    sudo apt-get install libguestfs-tools python-guestfs samba libelf-dev
    
  3. Gerar o arquivo de configuração para a compilcação do kernel. Supondo que você clonou o kernel do linux no diretório ~/linux, execute os seguintes comandos:
    # @vm
    cd ~/shared/linux/
    make clean
    zcat /proc/config.gz > .config
    
    # @host
    cd ~/linux
    make nconfig
    make olddefconfig
    
    # @vm
    make kvmconfig
    make localmodconfig
    
  4. Compilar o kernel do linux.
    # @host
    cd ~/linux
    make ARCH=x86_64 -j8
    

    A compilação do kernel deve demorar algum tempo que pode ser de 15 minutos até 2 ou 3 horas. No fim, se tudo tiver dado certo, as últimas linhas na saída do terminal devem indicar que uma nova imagem do kernel foi gerada. Algo semelhante a:

    Setup is 16188 bytes (padded to 16384 bytes).
    System is 5449 kB
    CRC dc413c09
    Kernel: arch/x86/boot/bzImage is ready  (#1)
    
  5. Instalar os módulos do kernel.
    # @vm
    sudo make modules_install
    
  6. Copiar a nova imagem do kernel que foi gerada para o diretório /boot/ para que seja possível iniciar a vm com ela. No lugar de <nome> coloque um nome que o ajude a distinguir a sua compilação do kernel das demais.
    # @vm
    sudo cp -v arch/x86_64/boot/bzImage /boot/vmlinuz-<nome>
    
  7. Criar um novo mkinitcpio. Fazemos isso copiando o mkinitcpio existente e editando-o manualmente.

    7.1 Criar uma cópia do mkinitcpio.

     # @vm
     sudo cp /etc/mkinitcpio.d/linux.preset /etc/mkinitcpio.d/<nome>.preset
    

    7.2. Edite o arquivo criado.

     # @vm
     sudo vim /etc/mkinitcpio.d/<nome>.preset
    

    Na minha instalação eu utilizei LABXP no lugar de <nome> e o meu arquivo /etc/mkinitcpio.d/LABXP.preset ficou com as seguintes linhas:

     # mkinitcpio preset file for the 'linux' package
    
     ALL_config="/etc/mkinitcpio.conf"
     ALL_kver="/boot/vmlinuz-LABXP"
    
     PRESETS=('default' 'fallback')
    
     #default_config="/etc/mkinitcpio.conf"
     default_image="/boot/initramfs-LABXP.img"
     #default_options=""
    
     #fallback_config="/etc/mkinitcpio.conf"
     fallback_image="/boot/initramfs-LABXP-fallback.img"
     fallback_options="-S autodetect"
    

    7.3 Gerar um novo initramfs.

     # @vm
     sudo mkinitcpio -p <nome>
    
  8. Atualizar o grub.
    # @vm
    sudo grub-mkconfig -o /boot/grub/grub.cfg
    sudo reboot
    

    8.1. Se necessário, atualizar as permições de acesso à nova imagem.

     # @host
     # Veja http://libguestfs.org/guestfs-faq.1.html
     sudo chmod 0644 /boot/vmlinuz*
    
  9. Por fim rode kw up, selecione *Advanded options for Arch Linux no menu do grub e em seguida *Arch Linux, with Linux <nome>