Particularmente o processo de compilação é relativamente simples. O que pega mesmo é o que voce vai compilar (ou melhor, o que será compilado juntamente com a base e o que será compilado como módulo). O comentário é que, se voce usa algum recurso mais de uma vez em uma mesma semana, então compile o suporte a este recurso diretamente no kernel. Caso contrário, compile-o como módulo.
O sistema utilizado nestes passos foi um Debian 3.1 r5, com kernel padrão 2.4.27. O kernel compilado foi o 2.6.13, mas os passos para compilar qualquer outro kernel da série 2.6 é o mesmo.
Para iniciar, vá até o site http://www.kernel.org/pub/linux/kernel/v2.6/ e pegue o arquivo linux-2.6.13.5.tar.bz2.
Salve este arquivo em qualquer lugar no seu sistema. Realize a descompactação e untar do mesmo com o comando tar xvjf linux-2.6.13.5.tar.bz2 -C /usr/src
Vá até o diretório /usr/src e crie um link para linux com o comando ln -s linux-2.6.13.5 linux
Instale alguns aplicativos necessários para começarmos a configurar o seu kernel e depois compilá-lo. Vale lembrar que o compilador C deve estar instalado no seu sistema. Caso não esteja, basta adicionar a parte entre colchetes na linha abaixo.
# aptitude install libncurses5 libncurses5-dev initrd-tools [gcc g++]
Após o término da instalação destes aplicativos, vá para o diretório linux e edite o arquivo Makefile. Na variavel Extraversion, coloque alguma string que identifique que este kernel foi compilado por voce. Salve e saia.
Execute o comando make menuconfig, e escolha as opções para que sua máquina funcione corretamente. Uma dica é utilizar os comandos lsusb e lspci para listar o hardware que sua máquina tem atualmente. Caso voce não encontre estes comandos, basta instalar os pacotes pciutils e usbutils
Este passo de configuração deve serfeito com bastante calma, pois dependendo da sua configuração algumas configurações especiais precisarão existir, e isto depende exclusivamente do hardware que voce possui. Lembre-se de salvar o arquivo de configuração com o nome .config.
Depois de salvar a sua configuração, efetue uma cópia de segurança de seu arquivo de configuração, apenas para manter registro. Caso a sua compilação não funcione, ou a máquina não consiga bootar com o novo kernel, voce deve voltar à prancheta novamente e verificar a sua configuração.
Bom, pensando que a sua configuração está OK, vamos executar a compilação propiamente dita. Para isso, basta digitar make.
Após uns 20 a 30 minutos de trabalho de seu micro, o seu novo kernel já está compilado. Como na série 2.6 a compilação dos módulos já acontece juntamente com a compilação do kernel, basta copiarmos estes módulos compilados para seu local padrão, que deve ser /lib/modules/2.6.13.5_sua-string. Isto é feito com o comando make módules_install
Copie o arquivo bzImage para o diretório /boot. Minha sugestão é que voce renomeie este arquivo para algo mais esclarecedor, como por exemplo kernel-2.6.13.5_sua-string. Use o comando cp /usr/src/linux/arch/i386/boot/bzImage /boot/kernel-2.6.13.5_sua-string
Vamos criar o arquivo de inicialização. Para fazer isso, use o comando mkinitrd -o /boot/initrd.img-2.6.13.5_sua-string /lib/modules/2.6.13.5_sua-string.
Agora o último passo é configurar o boot loader, ou o GRUB como é mais conhecido. Edite o arquivo /boot/grub/menu.lst e vá até o final do arquivo. Lá voce deve encontrar linhas semelhantes a estas abaixo.
title Debian GNU/Linux, kernel 2.4.27
root (hd0,0)
kernel /vmlinuz-2.4.27 root=/dev/sda3 ro
initrd /initrd.img-2.4.27
savedefault
Faça uma cópia destas linhas e coloque no final do arquivo. De acordo com as informações acima, suas linhas devem se parecer com estas
title Debian GNU/Linux, kernel 2.6.13.5_sua-string
root (hd0,0)
kernel /vmlinuz-2.6.13.5_sua-string root=/dev/sda3 ro
initrd /initrd.img-2.6.13.5_sua-string
savedefault
Prontinho. Agora basta ajoelhar e torcer para que sua máquina suba com o novo kernel compilado por voce.
Módulos
Eu mencionei a compilação automática dos módulos quando o kernel foi compilado. Mas como é a utilização e/ou gerenciamento destes módulos compilados ?
A princípio, quando o kernel necessita de uma funcionalidade que é suprida pelo módulo, o próprio kernel se encarrega de carregá-lo, mas voce pode carregá-lo usando o comando modprobe.
Pense no iptables. Mesmo quando voce compila todo o iptables no kernel, algumas características são fornecidas somente através de módulos, como o Connection Track ou o Stablished/Related. Quando voce chama o iptables com estas características, dois módulos são carregados para que estas características estejam disponíveis: ipt_state e ip_conntrack.
Então, depois que estes módulos foram carregados, execute um lsmod para ver se eles estão realmente lá. É possível também ver quais módulos estão carregados como comando cat proc/modules
Para verificar quais módulos estão disponíveis (compilados) para serem usados, basta executar um modprobe -l. Todos os arquivos que terminam em .ko são os módulos compilados e estão à sua disposição.
O comando modinfo mostra diversas informações sobre o módulo, inclusive se ele depende de algum outro módulo. Existe um arquivo chamado modules.dep que relaciona todos os módulos e suas dependencias. Caso haja algum problema com a carga de algum módulo por causa de suas dependencias, isto pode ser por algum erro neste arquivo. A melhor coisa a fazer é remover este arquivo e refaze-lo. O arquivo encontra-se em /lib/modules/$(uname -r)/modules.dep e para reconstruí-lo, use o comando depmod.
Para remover um módulo da memória, utilize o comando rmmod ou modprobe -r