Compilar Kernel da serie 2.4


Este tutorial foi feito por Carlos Morimoto do site Guiadohardware.net e mentor do Projeto Kurumim...
Muito bem explicado, se você tem dúvidas vai tirá-las com esse tutorial...

O Kernel é o coração do sistema, o Linux em sí. Todos os demais programas, incluindo até mesmo o bash, o programa que controla o prompt de comando são softwares que rodam sobre o Kernel. É ele quem cria a ponte entre os programas e o hardware. Além disso, o Kernel inclui todos os drivers de dispositivos suportados pelo sistema e até mesmo alguns programas, como o Iptables, o firewall nativo do Linux a partir do Kernel 2.4. Outros programas, como por exemplo o Tuxserver, desenvolvido pela Red Hat é compilado como um módulo do Kernel para rodar mais rápido.

Para manter a compatibilidade com o maior número possível de dispositivos, as distribuições devem incluir também todos os quase todos os drivers de dispositivos disponíveis para o Linux. Para evitar que isto torne o Kernel muito grande, criam um kernel básico, com os drivers mais importantes e incluem os demais drivers como módulos. Durante a instalação, ou a rodar algum utilitário de detecção e configuração de hardware, os módulos necessários são carregados no kernel.

Os módulos oferecem mais um vantagem: podem ser carregados e descarregados conforme necessário, sem ficarem o tempo todo consumindo memória RAM e recursos do sistema. Mas, em compensação, incluir um driver ou programa como módulo ao invés de compilá-lo como parte do Kernel também causa uma certa perda de desempenho. Só por aí já dá pra perceber que manter uma distribuição Linux não é tão fácil não é mesmo? :-)

Mas, voltando ao tema principal, recompilar o Kernel do Linux lhe dá a chance de criar um kernel adaptado às suas necessidades, ao contrário do tamanho único incluído nas distribuições. Além disso, você vai precisar recompilar o Kernel caso precise adicionar o suporte a algum dispositivo, cujo driver só está disponível na versão mais recente. USB 2.0? Wireless? Bluetooth? Estas tecnologias já eram suportadas peloLinux bem antes dos primeiros produtos chegarem ao mercado, mas quem possui uma versão antiga do Kernel precisa atualizá-lo para adicionar o suporte.

Felizmente, atualizar ou personalizar o Kernel é uma tarefa bastante simples, que pode se tornar até corriqueira, já que numa máquina atual, um Athlon de 1.2 GHz por exemplo, a compilação do Kernel não demora mais de 3 ou 5 minutos.

:. Conseguindo os fontes

O primeiro passo é naturalmente obter o código fonte do Kernel, que iremos compilar. Se você quer apenas criar um kernel personalizado, pode usar como base o próprio kernel incluído na sua distribuição. Se você não marcou a opção de instalar os fontes durante a instalação, use o comando:

#urpmi kernel-source

... para instalá-los. Ou então, você pode baixar a versão mais recente no http://www.kernel.org, onde você poderá encontrar tanto a versão de desenvolvimento (terminada com um número ímpar, como 2.5.x) quanto a versão estável (terminada em um número par, como 2.4.x). Salve o arquivo no diretório /usr/src onde por padrão ficam armazenados os fontes do Kernel. Não se assuste, o arquivo com o fonte do Kernel é mesmo grande, já está perto de 30 MB nas versões recentes. Mas, depois de compilado, ele ficará bem menor.

Depois de baixar o pacote, você ainda precisará descompactá-lo, usando o comando:

#tar -zxfv linux-2.x.x.tar.gz

Alterando o nome do arquivo para o que foi baixado.

Se o arquivo tiver a extensão tar.bz2, então o comando para descompactá-lo será:

#tar -xjfv linux-2.x.x.tar.gz

Se por acaso você estiver usando algum distribuição antiga e o comando acima não funcionar, experimente o: # bz2cat linux-2.x.x.tar.bz2 | tar xvf -

Aproveite que está aqui para já alterar o softlink "linux" incluído no diretório, que deverá apontar para a localização do novo kernel:

#rm linux # ln -s linux-2.x.x linux

Alterar este softlink não é exatamente obrigatório, apenas uma precaução.

:. Configurando

Acesse agora o diretório /usr/src/, onde os fontes ficam armazenados:

#cd /usr/src/

Acesse agora a pasta onde está a versão do Kernel que será recompilada:

#ls # cd linux-2.x.x

Dando um ls, você vai ver as várias pastas e arquivos que formam o código do Kernel. Se você quiser aprender REALMENTE a programar, vai aprender bastante examinando o código :-). Comece pela pasta Documentation.

Com o código em mãos, o próximo passo é definir os componentes que serão incluídos no novo Kernel. Para isto, abra o xconfig:

#make xconfig

Temos aqui um utilitário gráfico, que permite fazer tudo com calma e tranquilidade. Os componentes disponíveis estão organizados em categorias. A maior parte se relaciona justamente ao suporte a dispositivos:

Para cada módulo, existem três opções, Yes (Y), No N) ou Module (M) que permite carregar o componente na forma de um módulo, que será carregado apenas quando necessário, sem inchar o Kernel. Esta é a opção ideal para todos os componentes que quiser manter, mas não tem certeza se serão usados freqüentemente.

Para ativar o suporte a Bluetooth por exemplo, acesse a categoria "Bluetooth Support" e ative o "Blutooth subsystem support"

A opção mais importante com relação ao desempenho é indicar qual processador está sendo utilizado. Isto fará com que o Kernel seja compilado com otimizações para a arquitetura, o que pode resultar em um ganho de desempenho de até 30% em alguns casos. Para isto, acesse a seção "Processador Type and Features" na tela principal do xconfig e clique na opção "Processador family":

A opção 386 gera um código que funciona em qualquer PC, desde um 386 até um Pentium 999² ou Athlon XYZCu. A opção 486 gera algumas otimizações para a arquitetura pipelinizada do 486, mas mantendo a compatibilidade com todos os processadores daí em diante.

A opção 586/K5/5x68/6x86/6x86MX é a mais usada, pois gera um Kernel compatível com todos os processadores a partir do Pentium, com um nível de otimização razoável. Acima desta temos otimizações específicas para cada família de processadores, que garantirão um nível máximo de desempenho, em troca da compatibilidade. Compilar o Kernel com otimizações para o Pentium 4 irá torná-lo incompatível com máquinas Athlon ou Pentium III por exemplo. Mas, claro, isto não é um problema se você só utilizará este novo Kernel na sua própria máquina.

Depois de terminar, clique na opção "Save and Exit" no menu principal para salvar todas as alterações.

Além do xconfig, você pode utilizar também o menuconfig, que oferece as mesmas opções, mas numa interface de texto. Para chama-lo, use o comando:

#make menuconfig

Uma terceira opção é utilizar o configurador incluído no KDE (a partir da versão 2.2) que oferece uma interface mais amigável que o xconfig, além de conter um help detalhado sobre cada opção. Aliás, se você quer estudar sobre a função decada módulo do Kernel ele é um bom ponto de partida. Para acessar o configurador, abra um terminal e logue-se como root, usando o "su" e use o comando "kcontrol" para abrir o Centro de controle do KDE. Acesse a categoria sistema > configurador do Kernel do Linux:

Você deverá indicar o diretório onde está o Kernel que será compilado, escolher a arquitetura de processador para que ele será otimizado e finalmente selecionar os componentes que serão ou não incluídos durante a compilação, como no caso do xconfig.

Tanto faz utilizar o xconfig, o menuconfig ou o configurador do KDE, pois os três gravam as alterações no mesmo arquivo, o .config, dentro do diretório do Kernel. Existe ainda uma quarta opção, mais espartana o "make config" que chama um programa de modo texto que simplesmente vai perguntando um a um quais componentes devem ser incluídos (exige uma boa dose de paciência...)

:. Compilando

Depois de configurar o novo Kernel, basta compila-lo usando os 4 comandos abaixo. Lembre-se que para compilar qualquer programa no Linux é necessário ter o compilador gcc instalado.

#make dep # make clean

Estes dois comandos são rápidos. O primeiro verifica a cadeia de interdependências do Kernel, assegurando que todos os componentes necessários farão parte da compilação. O make clean limpa a casa, só para ter certeza que todos os componentes desnecessários foram removidos.

Existe mais um comando que pode ser usado nesta etapa, que é o "make mrproper". Ele faz uma limpeza mais profunda, incluindo uma série de perguntas. Este comando é recomendável caso você esteja recompilando o mesmo Kernel várias vezes, pois consegue remover arquivos e configurações que o make clean deixa passar. Se a compilação do Kernel falhar durante o make bzImage ou no make modules, experimente repetir os passos, dando o "make mrproper" antes do make dep e do make clean. Usando ou não o mrproper, o próximo passo é dar o:

#make bzImage

Este é o comando que realmente compila o Kernel. O tempo varia de acordo com a velocidade do processador. Um Athlon XP 1800+ fará tudo em dois ou três minutos, enquanto um Celeron 366 demorará quase meia hora. Um 486 chega a demorar um dia inteiro, mas neste caso existiria a opção de compilar o Kernel numa máquina mais rápida e depois apenas transportar o arquivo final (geralmente cabe em um único disquete) para o 486. Em versões antigas do Kernel era usado o comando "make zImage" mas ele tem uma limitação quanto ao tamanho máximo do Kernel a ser gerado, por isso só funciona em Kernels muito antigos, da série 2.0 ou então caso você selecione um número muito pequeno de componentes. O "bzImage" permite gerar Kernels sem limite de tamanho.

#make modules

Este último comando conclui o trabalho, gerando os componentes que serão adicionados como módulos. A demora depende do número de componentes incluídos como módulos, mas geralmente é mais rápido que o bzImage. Mas, de qualquer forma, o Linux é um sistema multitarefa, então você pode ir fazendo outra coisa se a compilação demorar.

:. Instalando

O novo Kernel será gravado no arquivo /usr/src/linux-2.x.x/arch/i386/boot/bzImage. O próximo passo é copiá-lo para o diretório /boot e em seguida configurar o Lilo para inicializar o novo Kernel ao invés do antigo. Para copiar use o comando:

# cp /usr/src/linux-2.x.x/arch/i386/boot/bzImage /boot/novo_kernel

Substituindo sempre o "linux-2.x.x" pelo nome correto da pasta onde está o Kernel. Isso também renomeará o arquivo para "novo_kernel", que pode ser alterado para outro nome qualquer.

Além do arquivo principal é necessário instalar também os componentes compilados como módulos, que ficam armazenados num diretório separado. Para isto, basta usar o comando:

#make modules_install

O próximo passo é configurar o Lilo. Para isso, abra o arquivo /etc/lilo.conf:

#kedit /etc/lilo.conf

Aqui estão as opções de inicialização que são dadas durante o boot. O que precisamos é adicionar uma nova opção, que inicializará o novo Kernel. Basta incluir as linhas no final do arquivo e salvá-lo:

image = /boot/novo_kernel label = novo_kernel read-only

Ao reiniciar o sistema você verá uma nova opção no menu do lilo, justamente o "novo_kernel" que acabamos de adicionar, junto com a entrada para inicializar o Kernel antigo.

Teste o novo Kernel e quando tiver certeza que ele está funcionando adequadamente, edite novamente o /etc/lilo.conf colocando a entrada do novo Kernel no topo da lista. Isto fará com que ela seja inicializada por default.

O seu lilo.conf ficará parecido com este:

nowarn timeout=50 message=/boot/message menu-scheme=wb:bw:wb:bw

image = /boot/novo_kernel label = novo_kernel read-only

image=/boot/vmlinuz label=linux root=/dev/hda1 initrd=/boot/initrd.img append="quiet devfs=mount hdc=ide-scsi" vga=788 read-only

Você pode ter quantos Kernels diferentes quiser, basta salvar cada arquivo com um nome diferente e adicionar uma entrada no arquivo.

Uma última dica, esta dada pelo Wooky é que os Kernels padrão do Mandrake e do conectiva podem apresentar problemas caso recompilados usando o gcc. Se você enfrentar problemas com o novo Kernel, pode experimentar utilizar o compilador kgcc ao invés do gcc padrão. Você pode baixar o kgcc no http://www.rpmfind.net, basta fazer uma pesquisa pelo nome do pacote.

Com ele instalado, basta editar o arquivo Makefile, dentro do diretório do Kernel a ser compilado:

#kedit Makefile

Procure pela linha "HOSTCC = gcc" (provavelmente a 19º do arquivo) e altere-a para:

HOSTCC = kgcc

Você pode também adicionar um parâmetro qualquer na linha na linha "EXTRAVERSION =" (a quarta linha do arquivo). Isto fará com que, ao recompilar o Kernel padrão da distribuição, o antigo não seja reescrito. Você pode usar por exemplo "-jeff" (sugerido pelo Wooky já que é o nome dele... :-) ou qualquer outra coisa como "-novo", etc.

Agora é só salvar o arquivo e compilar o Kernel normalmente.