Compilação Kernel · 7 min read · Nov 09, 2025
Como Compilar Um Kernel - O Jeito CentOS
Como Compilar Um Kernel - O Jeito CentOS
Versão 1.0
Autor: Falko Timme
Cada distribuição tem algumas ferramentas específicas para construir um kernel personalizado a partir das fontes. Este artigo é sobre compilar um kernel em sistemas CentOS. Ele descreve como construir um kernel personalizado usando as últimas fontes de kernel não modificadas do www.kernel.org (kernel vanilla) para que você fique independente dos kernels fornecidos pela sua distribuição. Também mostra como aplicar patches nas fontes do kernel se você precisar de recursos que não estão lá.
Eu testei isso no CentOS 4.4.
Quero dizer primeiro que este não é o único jeito de configurar tal sistema. Existem muitas maneiras de alcançar esse objetivo, mas este é o caminho que eu sigo. Não dou nenhuma garantia de que isso funcionará para você!
1 Nota Preliminar
Neste artigo, descreverei duas maneiras de construir um kernel para sistemas CentOS. A primeira delas resultará em um pacote rpm do kernel que você pode instalar ou compartilhar com outros. A segunda maneira é a mesma para todas as distribuições Linux, mas você não termina com um pacote rpm.
2 Construindo Um Pacote Kernel rpm
Este capítulo mostra como construir um kernel e terminar com um pacote rpm que você pode instalar e compartilhar com outros.
2.1 Baixar As Fontes do Kernel
Primeiro, baixamos o kernel desejado para /usr/src. Vá para www.kernel.org e selecione o kernel que você deseja instalar, por exemplo, linux-2.6.18.3.tar.bz2 (você pode encontrar todos os kernels 2.6 aqui: http://www.kernel.org/pub/linux/kernel/v2.6/). Então você pode baixá-lo para /usr/src assim:
cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.3.tar.bz2
Então, descompactamos as fontes do kernel e criamos um symlink linux para o diretório das fontes do kernel:
tar xjf linux-2.6.18.3.tar.bz2
ln -s linux-2.6.18.3 linux
cd /usr/src/linux
2.2 Modificar /etc/modprobe.conf
Agora devemos comentar o módulo mptscsi em /etc/modprobe.conf porque, caso contrário, teremos um erro como este:
No module mptscsi found for kernel 2.6.18.3-default, aborting.quando tentamos criar um ramdisk para nosso novo kernel.
vi /etc/modprobe.conf| alias eth0 pcnet32 alias scsi_hostadapter mptbase # alias scsi_hostadapter1 mptscsi alias scsi_hostadapter2 mptfc alias scsi_hostadapter3 mptspi alias scsi_hostadapter4 mptsas alias scsi_hostadapter5 mptscsih |
2.3 Aplicar Patches Nas Fontes do Kernel (Opcional)
Às vezes, você precisa de drivers para hardware que não é suportado pelo novo kernel por padrão, ou precisa de suporte para técnicas de virtualização ou alguma outra tecnologia de ponta que ainda não chegou ao kernel. Em todos esses casos, você precisa aplicar patches nas fontes do kernel (desde que haja um patch disponível…).
Agora vamos supor que você tenha baixado o patch necessário (eu o chamo de patch.bz2 neste exemplo) para /usr/src. É assim que você o aplica às suas fontes do kernel (você deve ainda estar no diretório /usr/src/linux):
bzip2 -dc /usr/src/patch.bz2 | patch -p1 –dry-run
bzip2 -dc /usr/src/patch.bz2 | patch -p1
O primeiro comando é apenas um teste, ele não faz nada com suas fontes. Se não mostrar erros, você pode executar o segundo comando que realmente aplica o patch. Não faça isso se o primeiro comando mostrar erros!
Se seus patches estiverem comprimidos com gzip (.gz) em vez de bzip2 (.bz2), então você aplica seu patch no kernel da seguinte forma:
gunzip -c /usr/src/patch.gz | patch -p1 –dry-run
gunzip -c /usr/src/patch.gz | patch -p1
Você também pode aplicar pré-patches no seu kernel. Por exemplo, se você precisar de um recurso que está disponível apenas no kernel 2.6.19-rc6, mas as fontes completas ainda não foram lançadas para esse kernel. Em vez disso, um patch-2.6.19-rc6.bz2 está disponível. Você pode aplicar esse patch nas fontes do kernel 2.6.18, mas não nas fontes do kernel 2.6.18.1 ou 2.6.18.2 ou 2.6.18.3, etc. Isso é explicado em http://kernel.org/patchtypes/pre.html:
Pré-patches são o equivalente a lançamentos alpha para Linux; eles vivem nos diretórios de teste nos arquivos. Eles devem ser aplicados usando a utilidade patch(1) ao código fonte do lançamento completo anterior com um número de versão de 3 partes (por exemplo, o pré-patch 2.6.12-rc4 deve ser aplicado às fontes do kernel 2.6.11, não, por exemplo, 2.6.11.10.)
Portanto, se você quiser compilar um kernel 2.6.19-rc6, deve baixar as fontes do kernel 2.6.18 (http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2) na etapa 2.1 em vez do kernel 2.6.18.3!
É assim que você aplica o patch 2.6.19-rc6 ao kernel 2.6.18:
cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.19-rc6.bz2
cd /usr/src/linux
bzip2 -dc /usr/src/patch-2.6.19-rc6.bz2 | patch -p1 –dry-run
bzip2 -dc /usr/src/patch-2.6.19-rc6.bz2 | patch -p1
2.4 Configurar O Kernel
É uma boa ideia usar a configuração do seu kernel atual como base para o seu novo kernel. Portanto, copiamos a configuração existente para /usr/src/linux:
make clean && make mrproper
cp /boot/config-uname -r ./.config
Então executamos
make menuconfigque traz o menu de configuração do kernel. Vá para Carregar um Arquivo de Configuração Alternativo e escolha .config (que contém a configuração do seu kernel atual) como o arquivo de configuração:


Então navegue pelo menu de configuração do kernel e faça suas escolhas. Certifique-se de especificar uma string de identificação da versão do kernel em Configuração Geral —> () Versão local - adicionar à liberação do kernel. Eu uso -default para que nosso pacote rpm do kernel seja nomeado kernel-2.6.18.3default-1.i386.rpm. Você pode deixar a string vazia ou especificar uma diferente que ajude a identificar o kernel (por exemplo, -custom ou o que você preferir).
Por favor, note: Depois de ter instalado kernel-2.6.18.3default-1.i386.rpm e decidir compilar outro pacote rpm do kernel 2.6.18.3, é importante usar uma string de versão diferente, por exemplo, -default1, -default2, etc., porque, caso contrário, você não poderá instalar seu novo kernel porque o rpm reclama que kernel-2.6.18.3default-1.i386.rpm já está instalado!




Quando você terminar e selecionar Sair, responda à seguinte pergunta (Você deseja salvar sua nova configuração do kernel?) com Sim:

2.5 Construir O Kernel
Para construir o kernel, basta executar este comando:
make rpmAgora seja paciente, a compilação do kernel pode levar algumas horas, dependendo da configuração do seu kernel e da velocidade do seu processador.
2.6 Instalar O Novo Kernel
Após a construção bem-sucedida do kernel, um src.rpm e um pacote rpm foram criados. O pacote src.rpm pode ser encontrado no diretório /usr/src/redhat/SRPMS/, você pode descobrir seu nome executando
ls -l /usr/src/redhat/SRPMS/No meu sistema, ele foi chamado kernel-2.6.18.3default-1.src.rpm.
O pacote rpm pode ser encontrado em /usr/src/redhat/RPMS/i386/, /usr/src/redhat/RPMS/i586/, /usr/src/redhat/RPMS/i686/, /usr/src/redhat/RPMS/x86_64/, etc., dependendo da sua arquitetura. No meu sistema, ele estava localizado em /usr/src/redhat/RPMS/i386/, e ao executar
ls -l /usr/src/redhat/RPMS/i386/descobri que seu nome era kernel-2.6.18.3default-1.i386.rpm.
Agora podemos instalar nosso pacote rpm do kernel assim:
cd /usr/src/redhat/RPMS/i386/
rpm -ivh –nodeps kernel-2.6.18.3default-1.i386.rpm
Por favor, note o switch –nodeps: se você não usá-lo, verá um erro como este:
error: Failed dependencies:
kernel >= 2.6.10 conflicts with lksctp-tools-1.0.2-6.4E.1.i386
Eu descobri que ignorar essa dependência não causou problemas no meu sistema.
Agora você pode até transferir o pacote rpm do kernel para outros sistemas CentOS e instalá-lo lá da mesma forma, o que significa que você não precisa compilar o kernel lá novamente.
Em seguida, criamos um ramdisk para nosso novo kernel, porque caso contrário, o sistema provavelmente não inicializará nosso novo kernel:
mkinitrd /boot/initrd-2.6.18.3-default.img 2.6.18.3-default2.7 Configurar O Carregador De Inicialização GRUB
Agora devemos configurar nosso carregador de inicialização GRUB para que nossos novos kernels sejam inicializados quando reiniciarmos o sistema.
Execute
ls -l /bootpara descobrir sobre seu novo kernel (geralmente começa com vmlinuz, por exemplo, vmlinuz-2.6.18.3-default) e ramdisk (geralmente começa com initrd, por exemplo, initrd-2.6.18.3-default.img).
Então edite /boot/grub/menu.lst. Dê uma olhada nas estrofes do kernel existentes (funcionando) lá e pegue uma delas como exemplo para sua nova estrofe e substitua o kernel e o ramdisk, depois adicione a estrofe acima de todas as outras estrofes.
vi /boot/grub/menu.lstPor exemplo, meu menu.lst parece assim antes de eu adicionar a nova estrofe:
| # grub.conf gerado pelo anaconda # # Note que você não precisa rerun grub após fazer alterações neste arquivo # AVISO: Você tem uma partição /boot. Isso significa que # todos os caminhos do kernel e initrd são relativos a /boot/, por exemplo. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00 # initrd /initrd-version.img #boot=/dev/sda default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS (2.6.9-42.0.3.EL) root (hd0,0) kernel /vmlinuz-2.6.9-42.0.3.EL ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.9-42.0.3.EL.img title CentOS-4 i386 (2.6.9-42.EL) root (hd0,0) kernel /vmlinuz-2.6.9-42.EL ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.9-42.EL.img |
e assim depois:
| # grub.conf gerado pelo anaconda # # Note que você não precisa rerun grub após fazer alterações neste arquivo # AVISO: Você tem uma partição /boot. Isso significa que # todos os caminhos do kernel e initrd são relativos a /boot/, por exemplo. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00 # initrd /initrd-version.img #boot=/dev/sda default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS (2.6.18.3-default) root (hd0,0) kernel /vmlinuz-2.6.18.3-default ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.18.3-default.img title CentOS (2.6.9-42.0.3.EL) root (hd0,0) kernel /vmlinuz-2.6.9-42.0.3.EL ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.9-42.0.3.EL.img title CentOS-4 i386 (2.6.9-42.EL) root (hd0,0) kernel /vmlinuz-2.6.9-42.EL ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.9-42.EL.img |
Agora reinicie o sistema:
shutdown -r nowSe tudo correr bem, ele deve iniciar com o novo kernel. Você pode verificar se realmente está usando seu novo kernel executando
uname -rIsso deve exibir algo como
2.6.18.3-defaultSe o sistema não iniciar, reinicie-o, e quando você ver isso:
 pressione qualquer tecla para entrar no menu GRUB:
Selecione seu kernel antigo e inicie o sistema. Você pode agora tentar novamente compilar um kernel funcional. Não se esqueça de remover a estrofe do kernel que não está funcionando de /boot/grub/menu.lst.
Receba novas postagens na sua caixa de entrada
Sem spam. Cancele a assinatura a qualquer momento.