Compilando um kernel Linux

Chegou atrasado, mas aí está a primeira versão de um artigo para compilar um kernel Linux da série 2.6. O texto foi escrito com o intuito de ajudar as pessoas que nunca compilaram um kernel.

[ Hits: 42.934 ]

Por: Jonas Goes em 20/07/2004


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.

Qualquer correção neste artigo é só me avisar! Eu agradeço pela leitura.

--
[]'s
Jonas Goes
http://www.goes.eti.br

   

Páginas do artigo
   1. Compilando um kernel Linux série 2.6
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Ksplice - atualizando o kernel sem necessidade de reboot

Compilar o kernel no Debian

Compilando o kernel no Slackware com pacotes pré-compilados

O kernel do Linux: A definição, importância e funcionalidades

OpeniBoot - Seu iPhone com Linux!

  
Comentários
[1] Comentário enviado por malako em 20/07/2004 - 09:22h

Nunca compilei um, mas acredito que o tutorial ai esta de parabens material como esse é dificil de se encontrar pelo menos em portugues geralmente muito simplificado e nao ajudando em nada , parabens mais uma vez pelo artigo cara vlw mesmo . com certeza vai ajudar muitos iniciantes a pelo menos mexer e ver no que dá .

[2] Comentário enviado por removido em 20/07/2004 - 09:39h

kra eu nunca compilei o kernel tb....

agora me deu ate coragem pra fazer isso :)
com certeza hj eu vou estar compilando o kernel!

valeu Jonas Goes....t+

[3] Comentário enviado por wronieri em 20/07/2004 - 12:30h

Muito bom o artigo parabens ;-)

[4] Comentário enviado por removido em 20/07/2004 - 12:51h

Uma duvida! Alguém tinha dito que as novas versoes apartir do 2.6.xx os comando eram automaticos, nao sendo necessario mais fazer make bzImage, make modules , make modules_install?!?!

[5] Comentário enviado por jllucca em 20/07/2004 - 15:51h

Opa, cara!!

O artigo tá muito bom queria apenas dizer umas coisas. O Kernel não é o "centro" do Sistema Operacional. Ele é o Sistema Operacional Linux, todo o resto é parte da "distribuição Linux". Mas, não chega a ser um erro pensar que ele é o "centro" até eu mesmo já chamei ele assim. Agora, uma dúvida minha nunca compilei essa nova versão do kernel, mas nos kernels que compilo sempre faço: make mrproper menuconfig dep clean bzImage modules modules_install. Assim, não falto alguma coisa ali entre o Passo IX e Passo X???

[]'s

[6] Comentário enviado por warlinux em 20/07/2004 - 16:49h

Também gostei muito do artigo e ficou muito bom com o Kernel 2.6, bem rápido para iniciar os programas etc.

Porém está dando um erro de montar as partições que estão no /etc/fstab dizendo que não tem suporte para o sistema.

Porém quando monto a partição manualmente mount /dev/hda /mnt/win_c/
a partição é montada sem problemas.

Alguém tem alguma idéia.

Sem mais,

obrigado e parabéns.

[7] Comentário enviado por jllucca em 20/07/2004 - 17:37h

Warlinux,

essa discução acho que não faz parte desse artigo. Se quiser, mande a linha que tu utiliza no /etc/fstab referente ao /mnt/win_c que lhe ajudo. :)

[]'s

[8] Comentário enviado por removido em 20/07/2004 - 17:41h

eh eu precisei digitar make modules e depois make modules_install

falo t+

[9] Comentário enviado por cherokee em 21/07/2004 - 00:28h

Esse artigo demorou, mas não esquenta com isso naum, nunca é tarde para ser feliz nesta comunidade...

[]s

[10] Comentário enviado por koy182 em 26/07/2004 - 19:44h

Oi galera, eu to tentando atualizar meu kernel agora, mais tem um problema, eu dou bot pelo disquet, e desejo continuar fazendo isso, alguem pode me ajudar como eu faço um bot de disquet pra ir direto pro novo kernel?
E mais uma duvida, depois qui eu testar o nome kernel, e ele tiver rodando beleza, como retiro da minha maquina vestigios do antigo kernel?
Espero por respostas aki, mais se caso nao der, e quiser me enviar um email, ta ai, koy182@ig.com.br

Muito obrigado, e por favor me ajudem nas duas questões. T+

[11] Comentário enviado por andreguerra em 10/09/2004 - 09:36h

Muito bom o artigo, realmente nunca vi em português um material tão explicado. Parabéns, vai servir pra encorajar os marinheiros de primeira viagem, além de trazer detalhes ainda desconhecidos para os marujos mais experientes..:-)

Muito bom mesmo, parabéns.

Abraço,

André

[12] Comentário enviado por edmafer em 12/11/2004 - 13:43h

Graças ao seu artigo, e também o do amigo:
http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=731,

e claro também algumas informações extras adquiridas durante as tentativas (foram 19)

Hoje, eu consegui executar o meu primeiro Kernel.

Deêm uma olhada neste outro artigo, e também no make help que vai ajudar bastante vocês.

[]'s

A todos

[13] Comentário enviado por edmafer em 12/11/2004 - 13:45h

Koy182 faça o make help, que ele tem uma opção sobre como criar um disco de boot.
Acredito que é isto que você procura.

[14] Comentário enviado por luiscarlos em 11/12/2004 - 11:24h

Cara, apos compilar o kernel-2.6.5 o rpm para de funcionar no redHat 9, eu mantive o kernel antigo e lah funciona porem alguns modulos param de funcionar como o modulo que me permiteler particoes ntfs, ou seja, meu kernel novo não vai 100% e o antigo "ganha" alguns problemas como esse do modulo.

[15] Comentário enviado por removido em 11/03/2006 - 14:19h

Ola, estou tentando compilar o kernel para tentar fazer funcionar minha web cam Go Tec 300 e estou tendo o seguinte erro apos dar o comando make.

[root@localhost 2.6.11-1.1369_FC4-i686]# make
CHK include/linux/version.h
CHK include/asm-i386/asm_offsets.h
make[1]: *** Sem regra para processar o alvo `init/main.o', necessário por `init/built-in.o'. Pare.
make: ** [init] Erro 2

o que posso fazer para resolver isso.. fiz a atualização do kernel para o 2.6.15 mas o erro persiste. Grato
Rskinner

[16] Comentário enviado por alexffox em 08/05/2006 - 17:53h

Passo XIII

Vamos criar um arquivo initrd assim:

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

o certo é mkdirinitrd ?
mkinitrd -o /boot/initrd-2.6.14i386-1.img 2.6.14i386-1
bash: mkinitrd: command not found

[17] Comentário enviado por removido em 12/05/2006 - 14:50h

alexffox vc tem q instalar o pacote de mkinitrd, si for slack installpkg mkinitrd-xxxxx.tgz si for debian usa o apt-get, e rskinner pra vc tb ta faltando pacotes, vc precisa ter varios glib gcc etc

[18] Comentário enviado por korn 21 em 29/11/2006 - 13:29h

Ola, quando eu faço tudo isso, mais quando renicio a maquina, ele entra no lilo carrega a imagem, mais depois disso nao aparece mais nada, qual é o erro?, a tela fica cinza e trava, nao aparece nada nem se quer um kernel panic, vcs sabem o que pode ser? valeu

[19] Comentário enviado por removido em 18/12/2006 - 14:11h

Amigo, deve haver um erro no seu artigo...

o comando mkinitrd não existe!!!

pesquisando o apt-cache tb não encontra nada relacionado a mkinitrd...
qual o pacote que deve ser instalado para que isso funcione ???

[20] Comentário enviado por blackwolf em 29/05/2007 - 16:15h

muito bom artigo, não tinha tentado recompilar meu kernel antes mais como agora vou usar apenas o linux vou tentar.
no meu slack 11 existe sim o comando mkinitrd, como disse o icarooo deve faltar algum pacote.

[21] Comentário enviado por fabri em 15/06/2007 - 08:50h

Cara foi facil, fiz segui seu tuto, e apos o reboot meu kde 356 ficou lentissimo, no reboot quase 40s aquele icone saltante no inicio fica parecendo bailarina em slowmouch, abaixo segue meu lspci, onde gosstaria de um sugestao de onde deveria fazer as modificacoes nessessarias para obter um kde pos recompilacao mais rapido, ficaria muito grato, meu kernel e o 2.6.22, kernel 3.5.6 slack 11....................
/home/fabri# lspci
00:00.0 Host bridge: Silicon Integrated Systems [SiS] 645xx (rev 03)
00:01.0 PCI bridge: Silicon Integrated Systems [SiS] Virtual PCI-to-PCI bridge (AGP)
00:02.0 ISA bridge: Silicon Integrated Systems [SiS] SiS963 [MuTIOL Media IO] (rev 25)
00:02.1 SMBus: Silicon Integrated Systems [SiS] SiS961/2 SMBus Controller
00:02.5 IDE interface: Silicon Integrated Systems [SiS] 5513 [IDE]
00:02.7 Multimedia audio controller: Silicon Integrated Systems [SiS] AC'97 Sound Controller (rev a0)
00:03.0 USB Controller: Silicon Integrated Systems [SiS] USB 1.0 Controller (rev 0f)
00:03.1 USB Controller: Silicon Integrated Systems [SiS] USB 1.0 Controller (rev 0f)
00:03.2 USB Controller: Silicon Integrated Systems [SiS] USB 2.0 Controller
00:04.0 Ethernet controller: Silicon Integrated Systems [SiS] SiS900 PCI Fast Ethernet (rev 91)
00:09.0 Multimedia audio controller: Cirrus Logic Crystal CS4281 PCI Audio (rev 01)
00:0a.0 Multimedia video controller: Brooktree Corporation Bt878 Video Capture (rev 11)
00:0a.1 Multimedia controller: Brooktree Corporation Bt878 Audio Capture (rev 11)
00:0c.0 Ethernet controller: Marvell Technology Group Ltd. 88w8335 [Libertas] 802.11b/g Wireless (rev 03)
01:00.0 VGA compatible controller: ATI Technologies Inc RV280 [Radeon 9200] (rev 01)
01:00.1 Display controller: ATI Technologies Inc Unknown device 5942 (rev 01)

[22] Comentário enviado por amzero em 13/03/2016 - 19:14h

Por que não é feito um executável para fazer isso tudo?
*Editado: Vi que o post é de 2004 depois de enviar. Não consigo deletar o comment.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts