quinta-feira, 21 de julho de 2011

Compilar kernel no CentOS 6

     A compilação do kenel no CentOS 6 não é tão automatizada como no Debian, mas já está bem mais facilitada de que era antigamente. A criação de um pacote .rpm com o kernel facilita bastante.

     Primeiramente vou reproduzir aqui os passos da compilação do kernel e criação/instalação do pacote e dependências:


* Sempre que eu usar o asterisco estarei me referindo a versão do kernel que muda conforme as atualizações então não  vou escrever nenhuma agora.

     1- Instale os pacotes compiladores e geradores de pacotes .rpm
               yum install gcc make bison ncurses-devel rpm-build

     2- Baixe a nova versão do kernel em www.kernel.org para a pasta /usr/src. A não ser que você seja "aventureiro" use sempre a última versão stable para máquinas imprescindíveis, mas se  você quiser ajudar no desenvolvimento do kernel, use a versão testing e informe os problemas.

              # wget -c http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.*.tar.bz2



     3- Descompacte-a, crie um link pra ela e acesse a pasta.


               # tar   -xjvf   linux-2.6.*.bz2
               # ln   -s   linux-2.6.*   linux
               # cd   linux


     4- Copie o arquivo de configurações padrão para que fique mais fácil de se guiar dentro do menu de configuração.


               # cp   /boot/config-*   .config


     5- Configure as opções do kernel conforme sua necessidade, não vou entrar em detalhes aqui para não prolongar muito o post já que minha idéia é so resolver um problema que não é citado em outros posts na internet.

               # make menuconfig


     6- Crie o pacote .rpm.


               # make rpm

               *Isso vai demorar bastante.
 

     7- Agora vou exigir um pouquinho de trabalho seu, localize o arquivo que foi criado. (se vira)


     8- Instale o pacote:


               # rpm -ivh kernel-2.6.*.rpm


     9- Liste o conteúdo da pasta /boot e voc verá que os arquivos do novo kernel se encotram lá, mas se você comparar com os arquivos que já estavam lá você vai ver que faltam alguns para o seu novo kernel.


     10- Atualize a lista dos módulos que serão carregados com o novo kernel:


               # depmod kernel-2.6.*

     Kernel pronto.. ou quase   -  Não reinicie ainda e NÃO crie o initrd como todos os tutoriais de compilação lhe orientam.

     Nem tudo são flores...
     Achei as informações sobre a compilação depois de muuuito garimpar na net e acabei tendo um belo "kernel panic", como já sou íntimo dessa mensagem não me desesperei e resolvi ler tudo o que o sistema estava me dizendo, a mensagem era:

KAMDISK: imcomplete write (15071 != 32768)
Write erro
Kernel panic – not syncing: VFS: unable to mount root fs on unknown-block(0,0)
Pid: 1, comm.: swapper Not tainted 2.6.39.3LevierTecnologia #3
Call Trace:
[] panic+x91/0x19c
[]? Printlk+0x41/0x46
[] mont_block_root+0x56/0x5a

     Observe a terceira linha que ela me diz que não conseguiu sincronização ou acesso ao VFS (Virtual File System), o kernel usa no boot um sistema virtual de arquivos que se encontra na imabem /boot/initrd*.img, então a mensagem sugere que o problema está aí.

SOLUÇÃO:

     Ao invés de criar o initrd você irá criar o initramfs e pra isso você irá usar o programa "dracut" da seguinte forma:

               # cd /boot 
               # dracut initramfs-2.6.*.img     2.6.*

Agora vamos a configuração do Grub.

     1- Edite o arquivo /boot/grub/grub.conf e adicione os dados referentes ao novo kernel, você pode copiar e colar os dados do kernel antigo e ajustar as informações:

               # vim /boot/grub/grub.conf

Em alguns casos, não consegui entender o porquê, o arquivo "/boot/vmlinux*" gerado possui algum erro então  você terá que copiar o arquivo /root/rpmbuild/BUILD/kernel-3.0.02xXeon_cleber/arch/x86/boot/bzImage para o /boot, trocar o nome do arquivo para o mesmo do "vmlinux*" substituindo o mesmo.
No meu caso o erro que me forçou a fazer isso foi o "Error 13: Invalid ou unsupported executable format" no momento do boot com o novo kernel.

* no lugar onde se encontra o initrd.*.img coloque o caminho do arquivo initramfs criado anteriormente.

--- Não vou detalhar muito agora mas posteriormente eu melhoro o post.