Pular para o conteúdo

Compilando um novo kernel (2.6.30.5) no Linux CentOS 5.3 / Red Hat 5.3

Avatar de DK
DKTrabalha com Linux e Unix a mais de 23 anos e possui as certificações LPI 3, RHCE, AIX e VIO.

02 set, 2009
6 min de leitura

Você adquiriu um novo hardware mas o kernel atual não suporta ele, ou precisa acrescentar uma funcionalidade ao kernel que não vem por padrão.

É nessas horas que é necessário compilar um novo kernel para que o dispositivo seja reconhecido ou a nova funcionalidade possa ser usada por um software por exemplo.

Vou mostrar aqui como proceder para compilar um novo kernel no CentOS / Red Hat Linux.

Pré requisitos

Download da última versão do kernel do Linux

A última versão pode ser obtida diretamente pelo link http://www.kernel.org/pub/linux/kernel/v2.6/ Baixando o source do Kernel (no momento em que escrevo a última versão é a 2.6.30.5)

wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.30.5.tar.bz2

Depois de feito o download, descompactar para o diretório /usr/src

tar jxvf linux-2.6.30.5.tar.bz2 -C /usr/src
...
linux-2.6.30.5/virt/
linux-2.6.30.5/virt/kvm/
linux-2.6.30.5/virt/kvm/coalesced_mmio.c
linux-2.6.30.5/virt/kvm/coalesced_mmio.h
linux-2.6.30.5/virt/kvm/ioapic.c
linux-2.6.30.5/virt/kvm/ioapic.h
linux-2.6.30.5/virt/kvm/iodev.h
linux-2.6.30.5/virt/kvm/iommu.c
linux-2.6.30.5/virt/kvm/irq_comm.c
linux-2.6.30.5/virt/kvm/kvm_main.c
linux-2.6.30.5/virt/kvm/kvm_trace.c

Para facilitar as coisas, ir até o diretório /usr/src e criar um link simbólico para o código fonte chamado linux, ficando assim:

cd /usr/src
ln -sf linux-2.6.30.5 linux

Resultado:

ls -al
drwxr-xr-x  3 root root 4.0K Sep  2 06:18 .
drwxr-xr-x 13 root root 4.0K Aug 31 14:25 ..
lrwxrwxrwx  1 root root   14 Sep  2 06:18 linux -> linux-2.6.30.5
drwxrwxr-x 22 root root 4.0K Aug 16 18:19 linux-2.6.30.5

Preparando o ambiente para compilar o Kernel

Para compilar o Kernel no Linux, o ambiente do SO precisa estar preparado, com o gcc, ncurses etc. Se sua instalação do CentOS ou do RedHat foi a mínima, o ambiente de desenvolvimento não foi instalado, sendo necessário fazer agora, isto é simples com o utilitário Yum que já resolverá todas as dependências.

yum install gcc make bison ncurses-devel rpm-build
...
Installed: bison.i386 0:2.3-2.1 gcc.i386 0:4.1.2-44.el5 ncurses-devel.i386 0:5.5-24.20060715
Dependency Installed: cpp.i386 0:4.1.2-44.el5 glibc-devel.i386 0:2.5-34.el5_3.1 glibc-headers.i386 0:2.5-34.el5_3.1 kernel-headers.i386 0:2.6.18-128.7.1.el5 libgomp.i386 0:4.3.2-7.el5
Updated: glibc.i686 0:2.5-34.el5_3.1 glibc-common.i386 0:2.5-34.el5_3.1 nscd.i386 0:2.5-34.el5_3.1

Compilando o kernel para CentOS ou RedHat

Antes de iniciar com o processo da compilação, é interessante limpar algum lixo que possa ter ficado.

make clean

Uma boa idéia é pegar os parâmetros de configuração do kernel que vem com o original e esse arquivo encontra-se no diretório /boot, vamos copiá-lo para a raiz do source do kernel e executar o menuconfig.

cd /usr/src/linux
cp /boot/config-`uname -r` .config

Certifique-se de estar sempre no diretório /usr/src/linux. Acessar o menu de configuração é a forma mais fácil de configurá-lo.

make menuconfig

[singlepic id=30 w=320 h=240 float=]

Como essa é uma compilação customizada então fica a sugestão de adicionar uma tag personalizada para o kernel que resultará, para fazer isso, faça da seguinte forma:

  • Na tela incial, vá ao menu General setup  —>

[singlepic id=31 w=320 h=240 float=]

  • Selecione Local version – append to kernel release

[singlepic id=32 w=320 h=240 float=]

Isto feito o kernel resultante terá uma Tag de identificação.

Essa é a hora de customizar as configurações de hardware do seu kernel.

Após feita essa configuração e adequação, é hora de sair do menu de configuração e iniciar a compilação.

Ao sair da configuração, será solicitado que você grave as alterações feitas. Responda Yes.

[singlepic id=34 w=320 h=240 float=]

Agora é a hora mais aguardada… a compilação.

Execute o comando make rpm

make rpm
...
  HOSTLD  scripts/kconfig/conf
scripts/kconfig/conf -s arch/x86/Kconfig
make clean
set -e; cd ..; ln -sf /usr/src/linux-2.6.30.5 kernel-2.6.30.5fogonacaixadagua
/bin/sh /usr/src/linux-2.6.30.5/scripts/setlocalversion > /usr/src/linux-2.6.30.5/.scmversion
set -e; cd ..; tar -cz --exclude SCCS --exclude BitKeeper --exclude .svn --exclude CVS --exclude .pc --exclude .hg --exclude .git -f kernel-2.6.30.5fogonacaixadagua.tar.gz kernel-2.6.30.5fogonacaixadagua/.
...

E dará início à compilação, vai demorar bastante tempo. Término da compilação, sem erros:

...
Wrote: /usr/src/redhat/SRPMS/kernel-2.6.30.5fogonacaixadagua-1.src.rpm
Wrote: /usr/src/redhat/RPMS/i386/kernel-2.6.30.5fogonacaixadagua-1.i386.rpm
...

O kernel está compilado e foi gerado um .rpm para sua instalação. Para confirmar que o kernel existe no formato rpm, execute o comando:

ls -alh /usr/src/redhat/RPMS/i386/
total 164M
drwxr-xr-x 2 root root 4.0K Sep  2 11:45 .
drwxr-xr-x 9 root root 4.0K Sep  2 10:39 ..
-rw-r--r-- 1 root root 164M Sep  2 11:45 kernel-2.6.30.5fogonacaixadagua-1.i386.rpm

Pacote RPM do novo kernel (32 bits)

Estou disponbilizando aqui o kernel compilado e empacotado.

Instalando o novo kernel

Como foi gerado um RPM do kernel, sua instalação ficou bem simples.

rpm -ivh /usr/src/redhat/RPMS/i386/kernel-2.6.30.5fogonacaixadagua-1.i386.rpm
Preparing...                ########################################### [100%]
   1:kernel                 ########################################### [100%]

Confirmando que o novo kernel foi instalado.

ls /boot
config-2.6.18-128.el5                 symvers-2.6.18-128.el5.gz
config-2.6.30.5-fogonacaixadagua      System.map-2.6.18-128.el5
grub                                  System.map-2.6.30.5-fogonacaixadagua
initrd-2.6.18-128.el5.img             vmlinux-2.6.30.5-fogonacaixadagua.bz2
initrd-2.6.30.5-fogonacaixadagua.img  vmlinuz-2.6.18-128.el5
lost+found                            vmlinuz-2.6.30.5-fogonacaixadagua

Criando o initrd para o novo kernel

Criar as dependências dos módulos:

depmod 2.6.30.5-fogonacaixadagua

É necessário criar um novo initrd para que o SO possa iniciar e pré-carregar os módulos de hardware necessário.

mkinitrd -v /boot/initrd-2.6.30.5-fogonacaixadagua.img 2.6.30.5-fogonacaixadagua

Caso o seguinte erro ocorra:

No module dm-mem-cache found for kernel 2.6.30.5-fogonacaixadagua, aborting.

Para contornar isso, utilizar o parâmetro --without-dmraid com o mkinitrd

mkinitrd --without-dmraid -v /boot/initrd-2.6.30.5-fogonacaixadagua.img 2.6.30.5-fogonacaixadagua

Editando o grub

Fase final, resta apenas editar o grub.conf para utilizar o novo kernel. Com seu editor de textos favorito, adicione as seguintes linhas:

title CentOS (2.6.30.5-fogonacaixadagua)
        root (hd0,0)
        kernel /vmlinuz-2.6.30.5-fogonacaixadagua ro root=/dev/VolGroup00/LogVol00
        initrd /initrd-2.6.30.5-fogonacaixadagua.img

O final do arquivo /boot/grub/grub.conf parecerá com o seguinte:

# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          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-128.el5)
    root (hd0,0)
    kernel /vmlinuz-2.6.18-128.el5 ro root=/dev/VolGroup00/LogVol00
    initrd /initrd-2.6.18-128.el5.img
title CentOS (2.6.30.5-fogonacaixadagua)
        root (hd0,0)
        kernel /vmlinuz-2.6.30.5-fogonacaixadagua ro root=/dev/VolGroup00/LogVol00
        initrd /initrd-2.6.30.5-fogonacaixadagua.img

Como primeiro boot, deixe a linha default=0 para testar, se o novo kernel inicilizar sem problemas é possível deixar default=1 para sempre utilizar o novo kernel num reboot.

Testando um boot com o novo kernel

Reinicie o computador.

shutdown -r now
  • Pressione uma tecla na tela de boot para entrar no menu de seleção de kernel

[singlepic id=35 w=320 h=240 float=]

  • Selecione o novo kernel configurado no Grub

[singlepic id=36 w=320 h=240 float=]

  • No final do boot é possível ver que o novo kernel iniciou normalmente

[singlepic id=37 w=320 h=240 float=]

Avatar de DK

Comentários

Comentários fechados para visitantes. Entre ou registre-se para comentar.

17 respostas para “Compilando um novo kernel (2.6.30.5) no Linux CentOS 5.3 / Red Hat 5.3”

  1. Avatar de Clovis

    Ola, Tentei compilar o kernel no meu centos como vc explica acima, durante o processo não deu nenhum erro depois no reboot Kernel Panic, baixei o rpm que vc disponibilizou e funcionou o que fiz de errado.

    1. Avatar de DK

      Oi Clovis,

      Edita o arquivo .config e coloque y para o parâmetro CONFIG_SYSFS_DEPRECATED_V2

      Ficando assim:
      CONFIG_SYSFS_DEPRECATED_V2=y

      1. Avatar de Clovis

        Testei e funcionou, estava bem complicado fazer funcionar. Valeu, muito obrigado tambem pela resposta rapida.

      2. Avatar de Clovis

        Cara você sabe me dizer qual opção que configuro para ter os drivers de integração com Hyper-v, estou compilando a versão 2.6.32.12

  2. Avatar de Farzin

    hi i have tried this on a xen vps , centos 5.5 64 bit , 2.6.18-194.8.1.el5xen , but it failed in the last steps ,

    No module xenblk found for kernel 2.6.34

    i have searched and tried the following commands with no result :(
    mkinitrd -v –with=xenblk –omit-scsi-modules –omit-raid-modules …
    mkinitrd -v –preload=xenblk –omit-scsi-modules –omit-raid-modules …

    any ideas ? thanks for this great post. :X

    1. Avatar de DK

      Hello,

      You need to have those rpm installed:

      kernel-xen-devel.x86_64
      kernel-xen.x86_64

      To install, execute the following command:

      yum install kernel-xen-devel.x86_64 kernel-xen.x86_64

      Thanks for your comment!

      1. Avatar de Farzin

        i have installed these 2 rpm s , but no changes , still the error is comung up :( anyway thanks for your fast reply.

  3. Avatar de Sebuba

    Olá, Parabéns pelo artigo.

    Estou tendo problemas com o IPTABLES,alguns módulos como nat etc, não carregam.

    Sabe qual módulo que preciso ativar no menuconfig para funcionar?

    []’s

  4. Avatar de Marcos

    Olá Grande !
    Primeiramente venho parabenizá-lo pelo seu artigo.
    Sou novato no linux, fiz o passo a passo só que na hora do reboot me surgiu a seguinte mensagem – “Kernel panic – not syncing: Attempetd to kill init !”
    Se puder me ajudar, desde já agradeço.
    Att,
    Marcos

    1. Avatar de DK

      Olá,
      O que você pode fazer é editar o arquivo .config no diretório /usr/src/linux-xxx e procurar pela linha:

      CONFIG_SYSFS_DEPRECATED_V2=y

      E definir o valor para y, conforme acima.

      Sucesso!

  5. Avatar de Bruno

    Cara, apaguei o meu diretorio /lib/modules eu uso Centos o que eu faco?

    1. Avatar de DK

      Veja qual é o kernel ativo com o comando uname -a e então baixe o kernel no repositorio do CentOS e instale-lo com o comando rpm -iUvh kernel.rpm –force.

      Isto restaurará os arquivos no /lib/modules/versao-do-kernel.

      Valeu

  6. Avatar de Bruno

    rsrs achei q ninguem ia responder
    ai eu ja tinha seguido a receita de cima.

    Depois q reiniciar ele nao vai dar nenhum problema?

    ( ainda nao reiniciei pq é o Firewall da empresa).

    1. Avatar de DK

      aeouahe :)

      Se você instalou um kernel do repositório oficial do CentOS (defaul) .

      Como você não disse se é 32bits ou 64bits nem qual a versão do CentOS, estou considerando ser a 5.6.

      O kernel 32bits recomendo baixar esse aqui:
      http://centos.mirror.nexicom.net/5.6/os/i386/CentOS/kernel-2.6.18-238.el5.i686.rpm

      Se for 64bits, baixa esse kernel
      http://centos.mirror.nexicom.net/5.6/os/x86_64/CentOS/kernel-2.6.18-238.el5.x86_64.rpm

      Instale com o comando que disse no comentário anterior:

      32 bits:
      rpm -iUvh kernel-2.6.18-238.el5.i686.rpm --force

      64 bits:
      rpm -iUvh kernel-2.6.18-238.el5.x86_64.rpm --force

      Não esqueça de conferir no /boot/grub/grub.conf se o kernel está definido e é o padrão.

      Seguindo esses passos é dificil acontecer algo errado (Não impossível) e o servidor retornará de um reboot.

      Aceita um aviso? Reinicie esse servidor no final de semana, aí você terá tempo para intervir caso algo aconteça.

  7. Avatar de Marcos

    Olá Grande !

    Como sempre ajudando demais os amigos que buscam respostas e sempre as tem !

    Com a saída do Kernel 3.0.1, gostaria de saber como faria para atualizar meu Centos 5.5 para o kernel 3.0.1, meu kernel é 2.6.18-194.32.1.el5.

    Se puder me ajudar, desde já agradeço.
    Att,
    Marcos

    1. Avatar de DK

      Opa! Obrigado Marcos pelo gentil comentário :)

      Pretendo fazer um sobre o kernel 3.0.x logo!

      Valeu!

  8. Avatar de Eugenie Kanahele

    Thanks, I’m always trying to find details about VPS providers.

Ir para