Passos Rápidos - Compilação do Kernel

Esta seção foi escrita por Al Dev

A ultima versão dessa seçao está em: http://www.milkywaygalaxy.freeservers.com após entrar no site clique em "Quick Steps to recompile linux kernel". Mirrors disponiveis: angelfire, geocities, virtualave, Fortunecity, Freewebsites, Tripod, 101xs, 50megs,

Estes sites contém muitas coisas boas de linux e dicas.

(A ultima versão desde documento esta em http://www.milkywaygalaxy.freeservers.com. Você pode checar lá para ver se há novas mudanças).

Recompilar o Kernel é requerido afim de que o kernel fique menor e que irá resultar em um sitema operacional mais rápido. Também é necessário para colocar suporte a novos dispositivos.

Precauções preventivas

Antes de você compilar o kernel, é uma boa idéia fazer um backup do sistema. Se você não tiver feito um backup recentemente faça ele agora. Veja BRS Backup-Recovery-Software

Ou se você pode correr o risco de perder seus dados, então pule esta seçao e vá adiante.

Compilando o Kernel

Nota: Quando você ver '#bash' quer dizer prompt do bash, você deve digitar os comandos que aparecem depois do prompt '#bash'. Os comandos abaixo foram testados no RedHat Linux, mas devem funcionar para as outras distribuições com pequenas alterações.

  1. Nota: Você pode ter muitas imagens do kernel no seu sistema. Seguindo os passos abaixo você não precisa sobreescrever ou causar danos ao seu kernel existente. Estes passos são muito seguros e seu kernel atual estará intacto e nao será tocado.

    bash$ su - root
    bash# cd /mnt/cdrom/RedHat/RPMS 
    bash# rpm -i kernel-headers*.rpm 
    bash# rpm -i kernel-source*.rpm 
    bash# rpm -i dev86*.rpm   
    bash# rpm -i bin86*.rpm   
    (bin86*.rpm e 'as86' são necessários apenas para Linux mais antigos, como redhat 5.x. Pegue o Intel assembler 'as86' do pacote dev86*.rpm no cdrom ou de: bin86-mandrake, bin86-kondara).

    • Inicie o X-Window com o comando 'startx'. Se não foi possível inicia-lo, então veja o passo abaixo.

      	bash# man startx
      	bash# startx
      	bash# cd /usr/src/linux 
      	bash# make xconfig 

    • Se você nao poder rodar o X-Window então tente o seguinte:

      	bash# export TERM=xterm
      	bash# make menuconfig
      
      Se aparecer uma tela embaralhada, use um tipo de terminal diferente (ex: vt100,
      vt102, vt220 ou ansi). Caso você esteja remotamente na máquina isso também
      poderá acontecer, nestes casos você deve usar terminais como: vt100 ou vt220.
      
      Por exemplo:
              bash# export TERM=vt220
      	bash# export TERM=ansi
      Ou então:
              bash# export TERM=vt100
      	bash# make menuconfig
       
       Se o menuconfig falhar, então tente:
      
      	bash# make config

    "make xconfig" e "make menuconfig" trazem uma interface amigavel. Enquanto "make config" traz uma interface em linha-de-comando. O arquivo de configuração pode ser encontrado e carregado do seguinte lugar: /usr/src/linux/.config

  2. Dentro de 'make xconfig' você tem a obrigação de evitar os seguintes problemas:

    • Selecione o tipo de CPU correto - Pentium 3, AMD K6, Cyrix, Pentium 4, Intel 386, DEC Alpha, PowerPC caso contrário seu kernel nao irá dar boot!!

    • Selecione suporte SMP - multiplas CPUs (Nota: Não é recomendado colocar suporte a smp em sistema de CPU único!)

    • Arquivos de Sistema - Selecione Windows95 Vfat, MSDOS, NTFS como parte do kernel e nao como módulos. (Esta é minha preferencia mas você pode escolher o que quiser).

    • Ative o suporte para carregar módulos do kernel! Com esta opçao você pode carregar/descarregar os drivers dinamicamente com o linux rodando normalmente. Veja estas man pages:

      bash# rpm -i /mnt/cdrom/Redhat/RPMS/modutils*.rpm
      bash# man lsmod
      bash# man insmod
      bash# man rmmod
      bash# man depmod
      bash# man modprobe

  3. Salve e Saia do "make xconfig". Todas opções que você selecionou foram salvas no arquivo de configuração: /usr/src/linux/.config. E agora, faça:

    bash# make dep
    bash# make clean

  4. Leia o seguinte arquivo (para ganhar algum conhecimento sobre a compilação do kernel. Dica: use o editor gvim para uma leitura melhor) gvim

    bash# gvim -R   /usr/src/linux/arch/i386/config.in 
    bash# man less 
    bash# less   /usr/src/linux/arch/i386/config.in 
    Type 'h' for help and to navigate press i, j, k, l, h or arrow, page up/down keys. 

  5. Agora, execute os comandos:

    	bash# cd /usr/src/linux
    	bash# man nohup
    	bash# nohup make bzImage &  
    	bash# man tail
            bash# tail -f nohup.out     (.... para monitorar o processo)
     Isto irá colocar seu kernel em /usr/src/linux/arch/i386/boot/bzImage

  6. Depois de criar o bzImage, preferencialmente copie ele para o diretório /boot. Veja as manpages do lilo (veja também caso ocorra algum problema). É aconselhável que você insira no nome do arquivo a data que foi compilado.

    
bash# cp /usr/src/linux/arch/i386/boot/bzImage /boot/bzImage.09apr2002 
    bash# man lilo 
    bash# man lilo.conf
    
    
    
    Edite o arquivo /etc/lilo.conf e coloque estas linhas:
    
            image=/boot/bzImage.09apr2002
    	label=meukernel
    	root=/dev/hda1
    	read-only
    
    Aviso: substitua o root de acordo com o seu sistema, para verificar seu
    dispositivo / , use o comando:
    
            bash# df / 

  7. Finalmente:

    bash# lilo 
    bash# lilo -q 
    Você deve rodar o lilo toda vez que uma nova bzImage for adicionada.

  8. Reinicie a máquina e quando entrar no prompt do lilo, digite 'meukernel'. Se ele der boot, você fez tudo certo! Seu antigo kernel esta INTACTO e SEGURO.

  9. Se seu novo kernel der boot e funcionar tudo que você esperava, é recomendavel que seja criado um disco de boot. Coloque um disco no driver de disquete e:

    bash# cd /usr/src/linux
    bash# make bzdisk
    
    bash# rpm -i mkbootdisk*.rpm
    bash# man mkbootdisk

  10. Módulos Carregaveis: Este passo é necessário SOMENTE se você abilitou o suporte para carregar módulos no passo 3 mostrado acima.

    bash# cd /usr/src/linux
    bash# make modules
    bash# make modules_install
    Isto irá copiar os módulos para o diretório /lib/modules. Por exemplo, para carregar o módulo /lib/modules/2.4.2-2/kernel/drivers/block/loop.o, você faria:
    bash# man insmod
    bash# modprobe loop
    bash# insmod loop
    bash# lsmod 
    Você pode setar os lugares (PATH) onde o insmod irá procurar no arquivo /etc/modules.conf

Suporte para os erros comuns

O sistema para no LILO

O que ocorre: Depois de compilar e reiniciar, o sistema para antes do LILO.

Razão: Provavelmente você está usando um LILO antigo que não suporta mais que 1024 cilindros na partição de boot.

Solução: Use um disco de boot para entrar em modo rescue na partição que contém seu linux. Instale um lilo novo e coloque a opção lba32 no lilo.conf. Rode o comando lilo e agora seu sistema deve dar boot.

Init não encontrado

O seguinte erro é cometido frequentemente por novos usuários.

Se você re-configurou seu lilo para usar seu novo kernel e quando esta carregando o kernel aparece a seguinte mensagem:

Warning: unable to open an initial console
Kernel panic: no init found. Try passing init= option to kernel
O problema é que você não colocou a opção "root=" corretamente no /etc/lilo.conf. Por exemplo, se seu linux estiver no /dev/hda1, você deve colocar "root=/dev/hda1" no arquivo /etc/lilo.conf.

O kernel procura pelo comando init que está localizado em /sbin/init. E o diretório /sbin geralmente fica na partição root. Para detalhes, veja:

bash# man init

depmod retorna "Unresolved symbol error messages"

Quando você roda o depmod e ele retorna "Unresolved sysmbols". Por exemplo:

bash$ su - root
bash# man depmod
bash# depmod
depmod: *** Unresolved symbols in /lib/modules/version/kernel/drivers/md/linear.o
depmod: *** Unresolved symbols in /lib/modules/version/kernel/drivers/md/multipath.o
depmod: *** Unresolved symbols in /lib/modules/version/kernel/drivers/md/raid0.o
depmod: *** Unresolved symbols in /lib/modules/version/kernel/drivers/md/raid1.o
depmod: *** Unresolved symbols in /lib/modules/version/kernel/drivers/md/raid5.o

Razão: Você nao fez: make modules e make modules_install depois de compilar seu novo kernel com "make bzImage".

Solução: Depois de compilar seu novo kernel, você deve fazer isso:

bash$ su - root
bash# cd /usr/src/linux
bash# make modules
bash# make modules_install

Kernel não carrega módulos - Mensagens de erro "Unresolved symbols"

Quando você da boot no kernel e o sistema tenta carregar algum módulo e retorna "Unresolved symbol: algum nome de função" isto significa que você não compilou os módulos e o kernel corretamente. Normalmente você deve fazer isso:

	bash# cd /usr/src/linux
	bash# make dep
	bash# make clean
	bash# nohup make bzImage &  
        bash# tail -f nohup.out     (.... para monitorar o progresso)
	bash# make modules
	bash# make modules_install

Kernel falha ao carregar um módulo

Se o kernel falhar ao carregar um módulo, pode ser que você esteja tentando carregar um driver que não exista em seu computador. Algumas vezes os módulos carregavéis podem não funcionar e o driver precisa ser compilado dentro do kernel. Por exemplo: algumas placas de rede não tem a habilidade para ser um módulo carregavel. Portanto, no 'make xconfig' você deve colocar esse módulo para compilar "dentro do kernel".

Módulos Carregavéis

Você pode instalar os módulos carregavéis com:

O passo mostrado abaixo pode não ser requerido mas é necessário SOMENTE PARA EMERGÊNCIAS onde seus arquivos do /lib/modules estão estragados. Se você ja tem o diretório /lib/modules e em seu caso você quer sobreescrevê-lo, então use --force para sobreescrever o pacote.

Para novas versões do linux redhat 6.0 e superiores, os módulos do kernel são incluídos no kernel-2.2*.rpm. Instale os módulos carregavéis com:

        Isto irá listar os pacotes já instalados.
bash# rpm -qa | grep -i kernel
	
bash# rpm -U --force  /mnt/cdrom/Redhat/RPMS/kernel-2.2.14-5.0.i686.rpm
(ou)
bash# rpm -U --force  /mnt/cdrom/Redhat/RPMS/kernel-2.2.14-5.0.i586.rpm
(ou)
bash# rpm -U --force  /mnt/cdrom/Redhat/RPMS/kernel-2.2.14-5.0.i386.rpm

Isso é somente para versões antigas do redhat (5.2 e anteriores). Inicie o novo kernel e instale os módulos carregavéis do cdrom "contrib" do RedHat Linux.

bash# rpm -i /mnt/cdrom/contrib/kernel-modules*.rpm 
....(Para linux antigos que o sistema não tem insmod pré-instalado)

Após Compilar o Kernel

Depois de compilar e iniciar seu kernel, você provavelmente irá querer que seus dispositivos funcionem no linux corretamente. (Os passos abaixos foram testados no Redhat Linux mas devem funcionar com outras distribuições também).

Configuração de placa de vídeo/Monitor:

Você pode configurar a placa de vídeo e monitor usando estes comandos:
bash$ su - root
bash# man Xconfigurator
bash# /usr/bin/X11/Xconfigurator --help
bash# /usr/bin/X11/Xconfigurator 
bash# /usr/bin/X11/Xconfigurator --expert

Veja também:
bash# man xf86config
bash# /usr/bin/X11/xf86config
Se sua placa não foi detectada automaticamente, então você pode usar a opção --expert e selecionar "Unlisted card". Se seu monitor não estiver na lista, então selecione o monitor genérico SVGA 1024x768 (Ajuste de acordo com seu sistema).

Configuração da placa de som:

bash$ su - root
bash# man sndconfig
bash# /usr/sbin/sndconfig
Então inicie o X-window 'KDE desktop' com o comando 'startx'. Clique em 'K Start, ControlCenter, SoundServer, General, Test Sound'. Isso deve tocar um som de teste. Depois clique em 'K Start, MultiMedia, SoundMixer, SoundVolumeSlider' para ajustar o volume.

Configuração da placa de rede:

Configurar Firewall e Mascaramento de IP: Para kernels com versão 2.4 e acima, o firewall e mascaramento de ip está implementado no pacote netfilter. Portanto no kernel você deve habilitar o Netfilter e rodar o script de Firewall/IPMasq. Faça download dos scripts de Firewall-IPMasq scripts, página principal do netfilter está em netfilter.samba.org. Material relatados estão em firewalling-matures e Netfilter-FAQ.

Para versoes do kernel abaixo de 2.4 você deve instalar os rpms da rpmfind.net ou firewall.src.rpm.

Configuração para outros dispositivos: Veja HOWTOs relatados sobre dispositivos em www.linuxdoc.org

Exemplo de lilo.conf

Abaixo está um exemplo do arquivo /etc/lilo.conf. Como você não pode usar nomes extensos, como linux kernel 2.4.18, seria bom você colocar algo como: linux-2.4.18. É possível ter várias bzImages do kernel, então você pode compilar vários kernels. Exemplo de lilo.conf:

boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
default=firewall

image=/boot/vmlinuz-2.2.14-5.0
	label=ker2214
	read-only
	root=/dev/hda9

image=/boot/vmlinuz-2.2.17-14
	label=ker2217
	read-only
	root=/dev/hda9

#image=/usr/src/linux/arch/i386/boot/bzImage 
#	label=meukernel 
#	root=/dev/hda7
#	read-only 

image=/boot/bzImage.myker.11feb2001
	label=myker11feb 
	root=/dev/hda9
	read-only 

image=/boot/bzImage.myker.01jan2001
	label=myker01jan 
	root=/dev/hda9
	read-only 

image=/boot/bzImage.myker-firewall.16mar2001
	label=firewall 
	root=/dev/hda9
	read-only