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

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

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  —>

  • Selecione Local version – append to kernel release

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.

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

  • Selecione o novo kernel configurado no Grub

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

Be Sociable, Share!
 banner ad
%d bloggers like this: