Kernel e Internals

Compilando o kernel Linux do zero: configuração, build e instalação

• 5 min de leitura

Compilando o kernel Linux do zero: configuração, build e instalação
Antes de iniciar a compilação do kernel Linux, é fundamental preparar o ambiente com todas as dependências necessárias. Em distribuições baseadas em Debian/Ubuntu, instale os pacotes essenciais:

Compilando o kernel Linux do zero: configuração, build e instalação

1. Preparação do ambiente e obtenção do código-fonte

Antes de iniciar a compilação do kernel Linux, é fundamental preparar o ambiente com todas as dependências necessárias. Em distribuições baseadas em Debian/Ubuntu, instale os pacotes essenciais:

sudo apt update
sudo apt install build-essential libncurses-dev bison flex libssl-dev libelf-dev

Para distribuições Red Hat/Fedora:

sudo dnf groupinstall "Development Tools"
sudo dnf install ncurses-devel bison flex elfutils-libelf-devel openssl-devel

O código-fonte do kernel pode ser obtido no site oficial kernel.org. Baixe o arquivo tar compactado ou utilize o repositório Git:

wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.tar.xz
tar -xf linux-6.6.tar.xz
cd linux-6.6

Para verificar a autenticidade do arquivo baixado, utilize as assinaturas GPG:

gpg --verify linux-6.6.tar.sign linux-6.6.tar.xz

A estrutura de diretórios do kernel é organizada de forma lógica:
- arch/ — código específico para cada arquitetura (x86, ARM, RISC-V)
- drivers/ — drivers de dispositivos
- fs/ — implementações de sistemas de arquivos
- kernel/ — núcleo do sistema (gerenciamento de processos, scheduling)
- net/ — pilha de rede
- Documentation/ — documentação técnica

2. Configuração inicial do kernel

A configuração do kernel é a etapa mais crítica do processo. Existem várias interfaces para realizar essa tarefa:

make menuconfig    # Interface baseada em ncurses (recomendada para iniciantes)
make xconfig       # Interface gráfica Qt
make nconfig       # Interface ncurses aprimorada
make config        # Interface textual interativa (linha por linha)

Para iniciar rapidamente, carregue a configuração atual do sistema como base:

zcat /proc/config.gz > .config
make olddefconfig

O comando make olddefconfig aceita todas as opções padrão para novas configurações, enquanto make localmodconfig cria uma configuração mínima baseada nos módulos atualmente carregados:

make localmodconfig

Personalize a configuração para sua arquitetura (x86_64) e ative suporte a sistemas de arquivos comuns:

make menuconfig
# Navegue para:
#   Processor type and features -> Processor family -> (Sua CPU)
#   File systems -> <*> Ext4, Btrfs, XFS
#   Device Drivers -> <*> SCSI device support

3. Opções avançadas de configuração

Ao compilar o kernel, você precisa decidir entre compilar recursos como módulo (M) ou diretamente no kernel (Y). Módulos oferecem flexibilidade, mas podem impactar o desempenho:

# No menuconfig:
# <*> = Compilado diretamente no kernel (estático)
# <M> = Compilado como módulo carregável
# ( ) = Não compilado

Recursos de segurança podem ser ativados no menu:

Security options ->
    [*] Enable different security models
    <M>   SELinux support
    <M>   AppArmor support
    [*]   Lockdown kernel mode

Para otimizações específicas de hardware, configure:

Processor type and features ->
    [*]   Symmetric multi-processing support
    Preemption Model -> Voluntary Kernel Preemption (Desktop)
    Timer frequency -> 1000 Hz (para desktop)

Device Drivers ->
    Graphics support ->
        <M> DRM driver for NVIDIA GPUs (nouveau)
    <*> NVMe Support

4. Compilação do kernel e seus módulos

Com a configuração concluída, inicie o processo de compilação. O parâmetro -jN define o número de threads paralelas (geralmente N = número de núcleos + 1):

make -j$(nproc)

Para compilar apenas os módulos separadamente:

make modules -j$(nproc)

Durante a compilação, monitore os logs para identificar possíveis erros:

make -j$(nproc) 2>&1 | tee build.log
grep -i "error\|warning" build.log

Erros comuns incluem dependências ausentes de bibliotecas ou configurações incorretas. Se ocorrerem falhas, verifique o arquivo .config e corrija as opções problemáticas.

5. Instalação do kernel e módulos

Após a compilação bem-sucedida, instale os módulos no sistema:

sudo make modules_install

Os módulos serão organizados em /lib/modules/6.6.0-custom/. Em seguida, instale a imagem do kernel:

sudo make install

Este comando copia a imagem do kernel para /boot/vmlinuz-6.6.0-custom e o System.map para /boot/System.map-6.6.0-custom.

Para sistemas que utilizam initramfs, gere a imagem inicial:

# Para distribuições baseadas em Red Hat/Fedora:
sudo dracut --force /boot/initramfs-6.6.0-custom.img 6.6.0-custom

# Para Arch Linux:
sudo mkinitcpio -k 6.6.0-custom -g /boot/initramfs-6.6.0-custom.img

6. Configuração do gerenciador de boot

Atualize o GRUB para reconhecer o novo kernel:

# Para Debian/Ubuntu:
sudo update-grub

# Para Red Hat/Fedora:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg

Para adicionar manualmente uma entrada no GRUB, edite /etc/grub.d/40_custom:

menuentry 'Linux 6.6.0-custom' {
    load_video
    insmod gzio
    insmod part_gpt
    insmod ext2
    set root='hd0,gpt2'
    linux /vmlinuz-6.6.0-custom root=/dev/sda2 ro quiet
    initrd /initramfs-6.6.0-custom.img
}

Para gerenciar múltiplos kernels, defina o kernel padrão em /etc/default/grub:

GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 6.6.0-custom"

Execute sudo update-grub após as alterações.

7. Testes e solução de problemas pós-instalação

Reinicie o sistema e selecione o novo kernel no GRUB. Após a inicialização, verifique os logs:

uname -r
dmesg | grep -i "error\|fail"
journalctl -b | grep -i "kernel"

Verifique se os módulos essenciais foram carregados:

lsmod | grep -E "ext4|nvme|nouveau"

Se ocorrer um kernel panic ou falha de inicialização, reinicie e selecione o kernel anterior no GRUB. Para diagnóstico, adicione parâmetros de boot temporários:

# Na linha do kernel no GRUB, adicione:
systemd.log_level=debug nomodeset

Para reverter completamente, remova os arquivos instalados:

sudo rm /boot/vmlinuz-6.6.0-custom
sudo rm /boot/initramfs-6.6.0-custom.img
sudo rm -rf /lib/modules/6.6.0-custom/
sudo update-grub

Referências

💬 Comentários
Mais em Kernel e Internals