sexta-feira, abril 11, 2008

E se eu precisar compilar o kernel? como fazê-lo à maneira do CentOS 5?

Em muitos casos, com hardware muito novo ou muito antigo, é preciso instalar drivers. frequentemente é necessario também compilar o kernel. um dos problemas que encontramos é que os how-tos disponiveis geralmente imaginam que realizamos a instalação completa do sistema, não se lembram que nem sempre temos todos os pacotes ou mesmo que possamos esquecer ou nao saber o nome de um.
Outro problema comum é quem nao existe uma unica maneira de compilar/instalar o kernel. As opcoes podem ser desde fazer tudo dos fontes, instalar patches, baixar os pacotes da propria distro, SRC, e recompilar e por ai vai....
Pense na dor de cabeça....

Neste artigo, pretendo de maneira sucinta e objetiva descrever o procedimento de compilação de instalação do kernel com um driver de rede, "a maneira do CentOS 5", a partir de uma maquina com instalação mínima, mas pode ser facilmente adaptado para outras distros RedHat Based como Fedora e outras versões do CentOS

Mãos a obra!

O procedimento é dividido em 7 partes
  • Preparação
  • Obtenção
  • Personalização
  • Compilação e criação do pacote rpm
  • Instalação
  • Criar imagem de inicialização.
  • Configuração da inicialização

Preparação

Instale os pacotes de desenvolvimento:
obviamente sem eles você não compila, mas se esquecer algum pacote pode ser que ele "pareça" estar compilando tudo, mas podem surgir problemas muitas dores de cabeca serão evitadas com isso (certificar que todos os pacotes necessários a compilação estão instalados)... os erros mais absurdos podem surgir e você nem vai disconfiar de onde eles vem.
vamos lá:

[root@localhost ~]# yum install autoconf automake rpm-build gcc g++ make flex bison gettext ncurses ncurses-devel binutils rpmdevtools rpmdev-setuptree

Outros pacotes serao necessários devido a dependências, em média da um total de 13MB para download.

Obtenção
baixe a versão mais nova do kernel, você irá encontrar ela no http://www.kernel.org

Você pode usar o "links" um navegador em modo texto muito simples de usar, ou então o wget, para usar o wget simplesmente passe a URL do arquivo

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

Para usar o links passe a url da página. (muito util quando vc só tem a interface de texto e não quer copiar uma URL enorme.)

links http://www.kernel.org

baixe o link da versao full (F) mais nova do kernel

Para nosso exemplo, estou baixando a versao 2.6.24.4, um pacote que se chama linux-2.6.24.4.tar.bz2. Vamos descomprirmir o pacote para começar a brincadeira:

tar -xjvf linux-2.6.24.4.tar.bz2
isso vai criar a pasta linux-2.6.24.4


Personalização
entre na pasta criada:
cd linux-2.6.24.4

vamos personalizar o nome do nosso kernel:
edite o arquivo Makefile
acrescente, logo no começo do arquivo na variável EXTRAVERSION, um nome que lhe agrade (ou que identifique uma funcionalidade que voce acrescentará),
por exemplo, "by_charles" (sem aspas e sem espacos), ou "_driver_rede_dlink", ou "i686", ou "support_4GB_RAM", enfim, voce escolhe.
feito isso salve o arquivo e saia.
digite o comando:
make menuconfig
isso irá criar um menu para que voce possa personalizar o seu kernel. navegue nas opções e escolha o que voce precisa integrar, seja driver de rede
opcoes de criptografia... tem muita coisa la. vamos comecar por algo básico, vamos habilitar um driver de rede, geralmente algumas placas da dlink usam o driver sundance
vamos procurar e instalar.
navegue no menu:

Device Driver
Network device support
Ethernet 10 or 100 Mbit
Sundance Alta Support

aqui voce vai verificar 2 opcoes:
uma, definida como * - significa que voce vai incluir o driver no kernel. ou seja, voce simplesmente precisa inserir a placa no slot pci e ela sera detectada normalmente
sem nenhuma outra operacao especial para ativar.

a outra definida como M - significa que o driver vai ser compilado e adicionado como modulo de kernel. assim voce precisa, apos instalar fisicamente a placa (obviametne com o micro desligado),
carregar os drivers com o comando modprobe, pro exemplo (apos ter compilado e instalado seu kernel):
modprobe sundance
ai voce sera capaz de ver sua placa nas opcoes do "ifconfig" ou "ifconfig -a"
caso opte por instalar como modulo, voce precisara acrescentar o driver na lista de modulos carregados automaticamente. (TODO)
optaremos por instalar o driver integrado com o kernel, portanto escolha o "*"
va escolhendo exit ate fechar o assitente. ele deve solicitar opcao para salvar. diga que sim.

Compilacao e criação do pacote rpm
ao sair do make menuconfig digite:

make rpm
--- espere ---
----- espere bem muito -----
-------- pode esperar que vai demorar uns 20 min ateh 1h dependendo da sua maquina ---------
se tudo correr bem ao final ele ira salvar 2 arquivos, o kernel em formato rpm e os fontes do kernel, como src.rpm
o assistnete lhe informara aonde ira armazenar os arquivos

Instalação

agora precisamos instalar os 2.
digite
cd /usr/src/redhat/RPMS/i386/ (isto pode mudar a depender as opcoes do menu, por exemplo, pode ser i686... veja a saida do comando de compilacao)
instale o pacote
rpm -ivh kernel-2.6.24.4_by_charles-1.rpm (alguma coisa interessante com o nome do pacote??? :P, o "-1" final fica por conta do script )
agora instale o source (fontes) é sempre bom pois as vezes é necessario para compilar outros programas. se voce esta compilando o kernel uma vez (e for desenvolvedor)
vai precisar compilar outra coisa, cedo ou tarde :P
cd /usr/src/redhat/SRPMS/
rpm -ivh kernel-2.6.24.4_by_charles-1.src.rpm

quase tudo pronto precisamos apenas criar a imagem de inicializacao

Criar imagem de inicialização.

Volte ao diretorio aonde voce descomprimiu o kernel e executou o comando make ( no meu caso o home do root)
cd
cd linux-2.6.24.4
digite
mkinitrd /boot/initrd-2.6.24.4_by_charles.img 2.6.24.4_by_charles
observer que o primeiro paramentro eh o destino da imagem (deve ser no diretorio /boot e com um nome que lembre o kernel pra vc nao esquecer)
e o segundo a versao do kernel que voce acabou de compilar

Configuração da inicialização
pronto, seu kernel está: personalizado, compilado, criado o pacote, instalado, criada imagem de inicializacao. o que falta agora?
usar!
para usar voce deve acrescentar o kernel nas opcoes do boot loader, no meu caso o grub.
vamos la, eh a parte final e eh bem simples

edite o arquivo
/boot/grub/menu.lst
por seguranca vamos acrescentar o kernel novo na parte final do arquivo assim ele nao sera carregado automaticamente,
se der algum problema voce ainda pode voltar a usar o kernel antigo sem muita dor de cabeça.
no fim do arquivo acrescente as linhas (voce vai notar que a sintaxe do arquivo eh muito facil de entender)
title CentOS (2.6.24.4_by_charles)
root (hd0,0) #verifique nas opcoes acima se o ponto de montagem e esse mesmo
kernel /vmlinuz-2.6.24.4_by_charles ro root=/dev/VolGroup00/LogVol100 #verifique nas opcoes acima se o root eh esse msmo
initrd /initrd-2.6.24.4_by_charles.img

pronto, agora eh so dar um reboot e escolher o kernel novo no grub.
se der algum problema simplesmente reinicia a maquina escolha um kernel funcional e reveja os passos

Uma observação fazendo desta forma eu verifiquei que os modulos de nat do iptables nao foram incluídos, se voce nao for usar o linux num roteador entao nao precisa se preocupar. do contrario volte ao make menuconfig e escolha para ele habilitar o nat, se necessario recompile o kernel e reinstale.