quinta-feira, 7 de março de 2013

Compilando um kernel Linux série 2.6



Por que recompilar o kernel?
  • A primeira intenção é otimizar o kernel para o seu hardware afim de melhorar sua performance e suportar todos os dispositivos.
  • Você também pode querer atualizar o sistema, obtendo suporte a novos recursos e dispositivos de hardware.
  • Ou você pode querer se livrar de BUG's.

O que é o kernel?
O kernel Linux é centro do sistema operacional. A parte do sistema responsável pelo gerenciamento de baixo nível do hardware e software.

Quais são os requerimentos mínimos de hardware?
Isso varia muito de acordo com a arquitetura e a versão do kernel. Mas tenha em mente o seguinte para ter um sistema mínimo funcional:
  • 16MB de RAM (memória física)
  • 100MHz de clock de processamento
  • 100MB de espaço em disco (memória virtual)

Mas o que eu tenho de hardware?
Execute o comando:

$ lspci
ou
$ lspci -vvv
ou
$ cat /proc/pci

Mas que processador eu tenho, qual é o clock, qual é a arquitetura?
Execute o comando:

$ cat /proc/cpuinfo

Qual é a quantidade de memória que eu tenho?
Execute o comando:

$ cat /proc/meminfo

Quais são os softwares mínimos que devem estar instalados para executar o kernel?
Veja a parte VII.

O kernel Linux é Software Livre?
Sim! É Software Livre porque cumpre com os quatro direitos da GPL (General Public License). Veja só:
  • O direito de cópia: sim, você pode fazer cópias ou downloads do kernel livremente.
  • O direito de estudo: sim, você pode baixar o código-fonte do kernel em http://www.kernel.org e estudá-lo.
  • O direito de modificação: sim, você pode modificar o código-fonte do kernel e enviar suas modificações as pessoas responsáveis.
  • O direito de redistribuição: sim, você pode redistribuir livremente o kernel.

Mãos à obra!

Passo I


Baixe o pacote que contém o código-fonte mais atualizado do kernel Linux da série 2.6 em http://www.kernel.org.

Abrindo a página no navegador web, clique no link "F" para fazer o download do pacote que contém os fontes.

Você também poderá fazer o download com o comando wget como no exemplo abaixo:

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

Passo II


Como superusuário (faça o login no sistema com o usuário root), descompacte e desempacote o arquivo assim:

# tar xjvf linux-2.6.7.tar.bz2 -C /usr/src

Passo III


Crie o link simbólico /usr/src/linux apontando para /usr/src/linux-2.6.7 assim:

# ln -sf /usr/src/linux-2.6.7 /usr/src/linux

Passo IV


Acesse /usr/src/linux assim:

# cd /usr/src/linux

Passo V


Edite o arquivo Makefile para personalizar a versão de sua compilação. Altere a variável EXTRAVERSION na quarta linha para um valor que deseje, como por exemplo -i386-c1. Salve este arquivo.
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 7
EXTRAVERSION = -i386-1

Passo VI


Caso você já tenha compilado o kernel anteriormente, execute o comando 'make mrproper' para retornar ao padrão os arquivos de configuração do kernel:

# make mrproper

Passo VII


O arquivo /usr/src/linux/Documentation/Changes contém uma lista do software mínimo que deve estar corretamente instalado na máquina antes de iniciar a compilação.

Não inicie a compilação do kernel sem antes obtiver a certeza de que o mínimo de software está instalado.

Existe um script que pode auxiliar nisto. O script /usr/src/linux/scripts/ver_linux imprime na tela uma lista do software mínimo e suas respectivas versões que estão instalados na máquina. Compare esta lista com a lista oferecida pelo documento /usr/src/linux/Documentation/Changes. Para executar este script, faça assim:

# sh scripts/ver_linux

Eis a lista de software mínimo requerido para um kernel da série 2.6 poder funcionar:
o  Gnu C                  2.95.3        # gcc --version
o  Gnu make               3.79.1        # make --version
o  binutils               2.12          # ld -v
o  util-linux             2.10o         # fdformat --version
o  module-init-tools      0.9.10        # depmod -V
o  e2fsprogs              1.29          # tune2fs
o  jfsutils               1.1.3         # fsck.jfs -V
o  reiserfsprogs          3.6.3         # reiserfsck -V 
o  xfsprogs               2.6.0         # xfs_db -V
o  pcmcia-cs              3.1.21        # cardmgr -V
o  quota-tools            3.09          # quota -V
o  PPP                    2.4.0         # pppd --version
o  isdn4k-utils           3.1pre1       # isdnctrl 
o  nfs-utils              1.0.5         # showmount --version
o  procps                 3.2.0         # ps --version
o  oprofile               0.5.3         # oprofiled --version
Nem tudo na lista acima é obrigatório. Será obrigatório ter os ítens instalados da lista acima apenas aqueles que o kernel que você está configurando suportar.

Por exemplo, se você não configurou o suporte a ISDN, não é necessário ter instalado na sua máquina o software isdn4k-utils para poder compilar e executar o kernel.

Passo VIII


O arquivo /usr/src/linux/.config armazena a configuração do kernel. Basicamente, este arquivo descreve o que deverá ser incorporado ao kernel (y) e o que deverá ser criado como módulo (m). Incorpore ao kernel apenas o necessário. O restante necessário, configure como módulo. O que não for necessário, retire. Por exemplo, se você não tem dispositivos pcmcia em sua máquina, retire da configuração o suporte a pcmcia. Isto possibilita uma maior performance por parte do sistema.

O kernel Linux pode ser modular, ou seja, o suporte básico fica incorporado ao kernel constantemente e o suporte a outros dispositivos, como por exemplo, uma placa de som, pode ser configurado como módulo. Assim sendo, este módulo da placa de som é carregado na memória e plugado ao kernel apenas quando for necessário, ou seja, apenas quando o usuário estiver utilizando som no sistema. Isto otimiza o sistema, utilizando seus recursos sabiamente.

Existe uma configuração padrão para cada tipo de arquitetura de hardware no diretório /usr/src/linux/arch. O nome do arquivo é defconfig. Supondo que sua arquitetura de hardware seja i386, a mais comum, faça uma cópia do arquivo defconfig para o diretório raiz de compilação com o nome .config assim:

# cp -f /usr/src/linux/arch/i386/defconfig /usr/src/linux/.config

Para saber qual é a sua arquitetura, execute o comando abaixo:

$ cat /proc/cpuinfo

Sendo assim, ao iniciar a ferramenta de configuração, você já terá alguns itens marcados. Não será necessário iniciar do zero uma configuração.

Passo IX


Execute a ferramenta de configuração assim:

# make menuconfig
ou
# make xconfig (modo gráfico)

Perceba a existência de uma configuração já pré-definida. Isto se deve ao fato de você ter copiado o arquivo defconfig para o diretório raiz de compilação com o nome de .config.

Algumas dicas:
  1. Marque com * itens que serão incorporados ao arquivo do kernel como por exemplo, sistemas de arquivos que você utiliza ou vai utilizar em suas partições.
  2. Marque com m itens que serão criados como módulo, ou seja, serão plugados ao kernel apenas quando houver necessidade de uso.

Passo X


Após a configuração do kernel, vamos compilá-lo realmente. Para isto, execute o comando:

# make bzImage

Passo XI


Após a compilação do kernel, vamos instalar os módulos com o seguinte comando:

# make modules_install

Passo XII


Agora vamos copiar o kernel (bzImage) para o diretório /boot. O arquivo está no diretório de acordo com a arquitetura que você estiver utilizando. Se você compilou o kernel em um PC, o que é mais comum, então o comando para copiar é o seguinte:

# cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-2.6.7-i386-c1
(nomeie o arquivo de acordo com a sua versão)

Agora vamos copiar o arquivo System.map para /boot:

# cp /usr/src/linux/System.map /boot/System.map-2.6.7-i386-c1
(nomeie o arquivo de acordo com a sua versão)

Criando um link simbólico para System.map:

# ln -sf /boot/System.map-2.6.7-i386-c1 /boot/System.map

Agora vamos copiar o .config para /boot:

# cp /usr/src/linux/.config /boot/config-2.6.7-i386-c1
(nomeie o arquivo de acordo com a sua versão)

Passo XIII


Vamos criar um arquivo initrd assim:

# mkinitrd -o /boot/initrd-2.6.7-i386-c1.img 2.6.7-i386-c1

Passo XIV


Vamos configurar o gerenciador de boot, GRUB ou LILO, qual você utiliza?

-> Configuração GRUB (isto é só um exemplo):

Note que você não precisa regravar o GRUB no MBR ou partição específica após feitas as alterações.
boot=/dev/hda
default=0
timeout=10
title Debian GNU/Linux (2.4.25-i386-c4)
   root (hd0,1)
   kernel /boot/vmlinuz-2.4.25-i386-c4 ro root=LABEL=/
   initrd /boot/initrd-2.4.25-i386-c4.img
title Debian GNU/Linux (2.6.7-i386-c1)
   root (hd0,1)
   kernel /boot/vmlinuz-2.6.7-i386-c1 ro root=LABEL=/
   initrd /boot/initrd-2.6.7-i386-c1.img

-> Configuração do LILO (isto é apenas um exemplo):

Note que você precisa regravar o LILO no MBR ou partição específica após feitas as alterações.
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
default=2.6.7
lba32
prompt
timeout=50
message=/boot/message
menu-scheme=wb:bw:wb:bw
image=/boot/vmlinuz
   label=2.4.25
   root=/dev/hda3
   append="hdc=ide-scsi"
   read-only
image=/boot/bzImage-2.6.0
   label=2.6.7
   root=/dev/hda3
   read-only

Execute lilo para regravar o LILO no MBR.

# /sbin/lilo

Não remova a configuração do kernel anterior que estava funcionando. Ele será útil para inicializar a máquina em caso de alguma falha na inicialização do novo kernel.

Reinicie sua máquina e boa sorte!

Aliás, esta é a única vez atualmente que é necessário reiniciar sua máquina quando seu sistema é Linux. Eu disse atualmente, pois isto já está em discussão e desenvolvimento com o pessoal do kernel.

Num futuro bem próximo, não será necessário reiniciar sua máquina para executar um novo kernel.

E falando de hardware, você não mais precisará reiniciar sua máquina para trocar uma placa PCI ou até mesmo um processador em um sistema de multi-processadores. 

Fonte:http://www.vivaolinux.com.br/

Nenhum comentário:

Postar um comentário