Como compilar o kernel 2.6

Neste artigo vou ensinar a compilar o kernel do linux da versão 2.6.x e mostrar as diferenças desta versão para a anterior, 2.4.x.

Compilar o kernel do linux é uma tarefa que se aprende com o tempo, depois de várias tentativas. Mas os problemas geralmente se resumem à configuração e nao à compilação. Vou tentar dar umas dicas referentes ? configuração, mas lembre-se que cada maquina usa uma configuração diferente por isso tenha em mãos toda a configuração do seu computador e não desista na primeira tentativa.

Para compilar você vai precisar do gcc (A documentação do kernel recomenda a versão 2.95 do gcc, mas eu tenho compilado com sucesso o kernel com as versões 3.2 e 3.3 e muitas distros fazem isso também, a dica é tentar compilar com a versão mais atual do gcc, se der algum problema compile com a 2.95), do Ncurses (geralmente um pacote chamado libncurses-dev ou Ncurses-devel), do make e do module-init-tools.

Qualquer dúvida sobre os pacotes necessários para compilar o kernel, leia o arquivo /usr/src/linux/Documentation/Changes.

Vou usar como referência o kernel da versão 2.6.4 baixado do kernel.org.

Baixe o source do kernel (clique no ‘F’ ao lado da versão do kernel que você deseja baixar. O ‘F’ significa ‘Full source’). Copie o arquivo baixado para /usr/src:

[root@host] # cp linux-2.6.4.tar.bz2 /usr/src

e decompacte-o:

[root@host] # cd /usr/src

[root@host] # tar jxvf linux-2.6.4.tar.bz2

Para facilitar, crie um link simbólico para o diretório que foi criado chamado ‘linux’. Se já existir, remova e crie novamente:

[root@host] # rm /usr/src/linux

[root@host] # ln -s /usr/src/linux-2.6.4 /usr/src/linux

Como a maioria de nós vai compilar o kernel em desktop, vou usar o patch do Con Kolivas, que otimiza o kernel para operações comuns de desktop. Não é obrigatório, mas eu recomendo que use este patch, pois ele melhora bastante o desempenho.

Baixe o arquivo patch-2.6.4-ck1.bz2 e copie-o também para /usr/src

[root@host] # cp patch-2.6.4-ck1 /usr/src

descompacte-o

[root@host] # bunzip2 patch-2.6.4-ck1.bz2

e aplique o patch no source do seu kernel

[root@host] # cd /usr/src/linux

[root@host] # patch -p1 < ../patch-2.6.4-ck1

Agora vamos ? configuração. Estando em /usr/src/linux, digite

[root@host] # make mrproper

para limpar as configurações e depois

[root@host] # make menuconfig

Existem outras maneiras de configurar o kernel, inclusive em modo gráfico, mas aqui vou me referir apenas ao menuconfig.

Como disse anteriormente, esta parte depende muito da máquina em questão. É necessário que você selecione todas as opções referentes ao seu hardware e os sistemas de arquivo que você usa. No menuconfig um ‘*’ significa que a opção será compilada dentro da imagem do kernel, um ‘M’ significa que será compilado como um módulo externo.

O sistema de arquivos que a sua partição linux usa deve ser marcado como ‘*’, bem como suporte a IDE (ou SCSI se for o caso). O restante das opções podem ser escolhidas como módulo, você escolhe.

Lembre-se que se você selecionar alguma opção como módulo, deve marcar a opção

Loadable Module Support -> Enable loadable module support,

Loadable Module Support -> Module unloading

e

Loadable Module Support -> Automatic kernel module unloading.

Depois publicarei um artigo mostrando com mais detalhes a configuração.

Salve a configuração. Agora vamos compilar.

A compilação dos kernels da versão 2.6 é um pouco diferente da 2.4. Não existe mais o comando make dep e tem alguns outros alvos (make help exibe as opções disponíveis).

Vamos por partes:

A primeira coisa a fazer é criar a imagem ‘bootável’ do kernel:

[root@host] # make bzImage

Este comando pode demorar bastante tempo dependendo da máquina usada. Se a sua máquina for antiga arrume algo pra fazer pois é tedioso ficar assistindo ? compilação.

Após terminado esse comando a imagem do kernel gerada é gravada em /usr/src/linux/arch/i386/boot/bzImage

O próximo passo é compilar os módulos (aquelas opções selecionadas como ‘M’ na configuração). Se você nao selecionou nada como ‘M’ (o que não é comum), pode pular essa parte.

[root@host] # make modules

E agora instale os módulos criados:

[root@host] # make modules_install

Se você não tiver instalado o pacote module-init-tools, vai receber uma mensagem de erro ao final do make modules_install. Se isso acontecer, instale o module-init-tools pois sem ele o kernel 2.6 nao vai funcionar.

Tudo certo até aqui? Parabéns, o seu kernel está compilado. Vamos agora configurar o nosso sistema para poder ‘bootar’ este novo kernel.

Copie os arquivos de imagem, configuração e o System.map para /boot

[root@host] # cp /usr/src/linux/arch/i386/boot/bzImage
/boot/vmlinuz-2.6.4

[root@host] # cp /usr/src/linux/.config /boot/config-2.6.4

[root@host] # cp /usr/src/linux/System.map /boot/System.map-2.6.4

Vamos configurar agora o gerenciador de boot para usar esse novo kernel. É importante que você mantenha a versão antiga do kernel intocada para poder inicializar o linux em caso de erros no kernel novo.

Se você usa o LILO, edite o arquivo /etc/lilo.conf com o seu editor de textos preferido.

Saiba qual a partição onde seu linux está instalado. É algo como /dev/hdax, onde x é um número. Olhe no lilo.conf na parte referente ao outro kernel e use a mesma partição na nova configuração. Vou usar /dev/hda2 como referência:

A configuração ficará assim:

image /boot/vmlinuz-2.6.4
    root=/dev/hda2
    label=Linux-2.6.4
    read-only

Salve o arquivo e execute o comando /sbin/lilo para gravar a nova configuração

[root@host] # /sbin/lilo

Se o seu gerenciador de boot é o GRUB, edite o arquivo /boot/grub/grub.conf ou /boot/grub/menu.lst. Veja qual a partição onde seu linux está instalado. O GRUB usa uma configuração um pouco diferente, do tipo (hdx,y), onde x é a interface IDE e o y é o numero da partição. Neste caso /dev/hda2 = (hd0,1). Vou usar /dev/hda2 como exemplo mas lembre-se de trocar para a partição que você usa.

A entrada no arquivo ficará assim:

title Linux-2.6.4

root (hd0,1)

kernel /boot/vmlinuz-2.6.4 root=/dev/hda2 ro

Salve o arquivo e pronto. O GRUB nao necessita que seja rodado nenhum comando apos a alteração.

Para quem deseja usar o gcc-2.95 para compilar o kernel:

Se vc usa normalmente o gcc versão 3.2 ou 3.3 mas deseja compilar o kernel com o 2.95 seguindo as recomendações da documentação, faça o seguinte:

Instale o gcc-2.95. Vamos assumir que ele seja instalado em /usr/bin/gcc-2.95, substitua pelo local correto da sua instalação.

Para usá-lo para compilar o kernel, basta passar o parametro ‘CC’ para o make, assim:

[root@host] # make CC=/usr/bin/gcc-2.95 bzImage

[root@host] # make CC=/usr/bin/gcc-2.95 modules

[root@host] # make CC=/usr/bin/gcc-2.95 modules_install

Espero ter sido claro na minha explicação.

35 Comentários sobre “Como compilar o kernel 2.6”

Faça um comentário

#1 | Lucas Martinez

Salve !

Não achei o campo para dar um parabens para meu amigo Bruno.

Quero falar que o projeto esta otimo, portal r0x e obrigado por ajudar a comunidade.

Quem não sabe o Bruno ja colaborou com artigos dentro do site LinuxDicas e ajuda tambem no forum.

Então como Fundador e Moderador do LinuxDicas não poderia de deixar meu COMENTARIO aqui a onde for para esse meu camarada.

Abraços

Lucas ( hyperblade )


#2 | Rodrigo

OLá Bruno,

gostaria de também dar-lhe os parabéns pelo seu artigo, e aproveitar para perguntar se você poderia me dar uma luz sobre a utilização do modconf com arquivos .ko

Grato,

Rodrigo


#3 | Bruno Torres

Primeiro obrigado pelos elogios..Valeu Lucas!!

Quanto ao modconf, ele é usado para os kernels da versão 2.4. Como citei no artigo, você deve instalar o module-init-tools, que substitui o modconf, mantendo compatibilidade com o 2.4 e os mesmos comandos (modprobe, lsmod, modinfo, etc…)


#4 | Fúlvio Cezar Canducci Dias

Gostei muito deste artigo, e acho isso um grande iniciativa no crescimento do linux …


#5 | Vinícius

Salve, salve galera.

Eu gostei da dica mas só eu estou meio na dúvida. É o seguinte. Digamos que eu configurei tudo dentro do kernel sem nenhum módulo, entaum eu digito:

#make menuconfig

#make

#make bzImage

#cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-2.6.4

#cp /usr/src/linux/.config /boot/config-2.6.4

#cp /usr/src/linux/System.map /boot/System.map-2.6.4

Mas se eu der um ‘make’ automáticamente é criado um vmlinuz, não é? E outra coisa. Pra que o config-2.6.4 e o System.map-2.6.4? O que mais precisa pra se configurar um kernel no RedHat 9.0?

Agradeço desde já.

Vinícius.


#6 | Bruno Torres

Se você de apenas make ele vai fazer a compilação de diversos alvos, vmlinux (não confunda com vmlinuz), bzImage e modules.

Eu prefiro fazer por partes, você decide. Um make help vai te explicar sobre os alvos do make e o que cada um significa.

O System.map é um arquivo de mapa do kernel, sobre módulos e versões e o config é apenas pra efeito de backup da configuração, vc escolhe se copia ou nao, mas é recomendavel que copie.

Tudo que você precisa pra compilar o kernel em qualquer distro está descrito neste artigo, nada mais precisa ser feito.


#7 | Xterminator

Bruno meu camarada , do jeito que você faz, a gente

acha até simples compilar o kernel , gostei do Artigo do 2.4 e agora este do 2.6 se não for o mais simples prático e didático , não sei o que é então….

PS::

Eu como disse no canal Adorei o layout da tua página.

Valeu….

PS uma pequena mas importante observação , não confundir “modconf” ferramenta para carregamento de módulos do Debian com o modutils , pois o mesmo é apenas um front-end ,

e pro nosso amigo que perguntou sobre o .ko “kernel object” ,não é possível carregar ko com o modutils antigo …

Abraços


#8 | Roger M. Lima

Parabéns Bruno, é pessoas como você que faz a nossa comunidade crescer mais e mais !


#9 | Mateus

Parabens pelo site.

Sou iniciante, estou recompilando o kernel 2.6.4 seguindo esse tutorial,tive problema com module-init-tools, segui o tutorial desse site que fala sobre como instala-lo, mas nao adiantou continua aparecendo: Warning: you may need to install module-init-tools

See http://www.codemonkey.org.uk/docs/post-halloween-2.6.txt

INSTALL drivers/net/tokenring/3c359.ko

cp: cannot stat `drivers/net/tokenring/3c359.ko’: Arquivo ou diretório não encontrado

make[1]: ** [drivers/net/tokenring/3c359.ko] Erro 1

make: ** [_modinst_] Erro 2

Uso Red Hat 9

Me ajudem…

GRATO


#10 | dedealencar

já pensou em estudar física… você seria o novo Albert Einstein! :)

parabéns, seu artigo é ótimo.


#11 | Jairo Haake

Muito massa!!

Excelente artigo, dava dando uns pau antes de eu ler…

mas agora tah massa…

Valeu..


#12 | Humberto

Excelente artigo: claro, curto e objetivo. Muito obrigado, Bruno!


#13 | Jonas

Estou testando algumas distribuições (FreeBSD e Debian) vou tentar atualizao o kernel com as excelentes dicas que foram dadas na sua página, parabéns cara. São de pessoas como vc que nós, simples mortais, precisamos para alavancar a utilização do software livre.


#14 | ipinto

Oi Bruno!

Falo de Portugal. Tenho tido o seu site como uma referência e portanto os meus parabens.

Vi o seu tutorial sobre como compilar o kernel 2.6. Como estou tento uns problemas com o relógio no mandrake 10 (os segundos andam muito rápido – 1s=2s), pensei que com um novo kernel o problema ficaria resolvido. No entanto, fizendo tudo como está no seu tutorial tudo bateu certo até ? hora em fiz #make bzImage. No fim deu o seguinte erro que não faço ideia do que seja:

fs/nls/nls_base.c: In function `char2uni’:

fs/nls/nls_base.c:465: internal compiler error: Segmentation fault

Please submit a full bug report,

with preprocessed source if appropriate.

See <URL:https://qa.mandrakesoft.com/&gt; for instructions.

make[2]: ** [fs/nls/nls_base.o] Erro 1

make[1]: ** [fs/nls] Erro 2

make: ** [fs] Erro 2

Está a faltar alguma coisa? Será que você me pode ajudar?

Abraço.


#15 | tim

meus parabens pelo seu artigo…

simples, objectivo, acessivel (para novatos como eu)…

simplesmente impecavel…

cumprimentos

TIM


Bruno e isso cara o seu site salvou a minha vida , estava trabalhando na data do dia 26/12/04 , e precisava compilar o Kernel do linux e nao sabia como fazer isso , gracas a suas dicas resolvi o problema , pois estava precisando apenas disso para colocar um REAL APLICATION CLUSTER DA ORACLE NO AR . Um forte ABRACO , Fábio Santana


#17 | Jeferson Kadowaki

Excelente didática, seu artigo é fácil e rápido. Ao contrário de vários documentos para atualização de kernel, que estão na Internet.

Obrigado,

Jeferson


#18 | valtemir

fiz todos os passos mas quando eu digito: make mrporper

ele escreve varias mensagem assim:

bin/us: invalid character 46 in export for AFLAGS_vmlinx.ids.o

uso: conetiva o q esta acontecendo, o que deve fazer


ae bruno, muito bom tuto,
ja q eu acabei de instalar o slackware 10.2, eu vou fazer isso ai, compilar o kernel 2.6.x pro meu slack
tomara que eu acerte tudo, pq eu sou newbye e não sei quase nada a respeito de programação ou instalação do linux
mas concerteza, o linux eh o melhor
-.-’
flwww


Estou a semana toda tentando compilar o kernel do slackware 10.2 e em vão, depois de uma verdadeira busca insólita por um texto de explicação que realmente funcionasse me deparei com estes posts de agradecimento o que fez com que a luz no fundo do tunel voltasse a brilhar.

Oh lá rapaziada, vou tentar aqui, se conseguir, volto aqui para postar mil agradecimentos.

T+
8IT4V3R4


#21 | Márcio Lins

olá, td blz! muito bom este tuto, agora aconteceu uma pequena falha… heheeh ninguém escapa!

image /boot/vmlinuz-2.6.4

ops! era para ser!

image = /boot/vmlinuz-2.6.4

sem o sinal, vai causar um erro!


Galera o texto é bom, funciona mesmo.

8IT4V3R4


#23 | Carlos

parabens pela explicação, porem tenho uma dúvida. È que eu uso o grub e não o lilo….como faço então?


#24 | flep

Aqui no meu Fedora deu “quase” tudo certo.
A unica coisa é na hora de iniciar pelo novo kernel, ele pede o parametro “initrd” (uso o GRUB), o qual vc nao explica aqui neste artigo.
No meu grub, a linha que escreve o kernel default esta com este parametro assim: initrd /initrd-2.6.11-1.1369_FC4.img

O que eu teria que colocar pro meu segundo kernel??
Abraços


#25 | Manuel Carvalheira

Muito bom este artigo, deu-me uma ajuda preciosa.
Muito obrigado.


#26 | fabio

uso o ubuntu e não consigo encontrar /usr/src/linux, /src está vazia… (desculpem a ignorância…rs)


#27 | Jean

E necessario q eu esteja com todos os meus hardwares configurados certinho????
por ex, esta tudo funcionando mas eu n configurei nada manualmente que nao seja o mouse…preciso configurar o resto tp monitor teclado vga placa de rede….ou eu ja posso compilar do jeito q esta


#28 | João Paulo

Bruno,
Tentei implementar o seu passo-a-passo, diga-se EXCELENTE passo-a-passo, mas encontrei os seguintes erros:
1 – Ao executar o path:
|diff -Naurp linux-2.6.4-base/arch/alpha/kernel/init_task.c linux-2.6.4-ck1/arch/alpha/kernel/init_task.c
|— linux-2.6.4-base/arch/alpha/kernel/init_task.c 2004-03-11 21:28:53.000000000 +1100
|+++ linux-2.6.4-ck1/arch/alpha/kernel/init_task.c 2004-03-11 22:45:15.103539128 +1100
————————–
File to patch:
Skip this patch? [y]

The next patch would create the file drivers/video/bootsplash/render.c,
which already exists! Assume -R? [n]

2 – Erro ao fazer o make:
[root@casa 2.6.17-1.2157_FC5-i686]# make
CHK include/linux/version.h
HOSTLD scripts/kconfig/conf
scripts/kconfig/conf -s arch/i386/Kconfig
file drivers/video/bootsplash/Kconfig already scanned?
make[2]: ** [silentoldconfig] Erro 1
make[1]: ** [silentoldconfig] Erro 2
make: ** [include/linux/autoconf.h] Erro 2

Será que você pode dar uma força?

Valeu,
JP


#29 | Rafael Puga

Olá, segui o passo-a-passo com o Kernel 2.6.17 e ocorreu tudo normalmente, exceto por um Kernel Panic pq o suporte a ReiserFS estava como módulo e o fato de eu ter aplicado o patch criou uma pasta /lib/modules/2.6.17-ck1 ao invés de /lib/modules/2.6.17 sendo assim, criei um initrd.gz e deu tudo certo, porém, meu Kernel passou a ser 2.6.17-ck1 e pra instalar o módulo de vídeo da NVidia, é necessário que se tenha o source do kernel usado, no caso eu tinha o source 2.6.17 e nao o 2.6.17-ck1. Por fim, compilei sem o patch, mas queria saber se tem como a aplicação do patch nao faça essa alteração colocando o -ck1 no final pra eu nao ter que criar initrd e poder ter o mesmo source do kernel usado. Um pouco da minha saga: http://forum.slacklife.com.br/viewtopic.php?t=4802

Grato =)


#30 | JJC

Fala meu bom,,,,sou do RJ e no meu fedora apresentou o mesmo prob do amigo ( #24 | flep ),o qual ainda naum hove resposta…

Aqui no meu Fedora deu “quase” tudo certo.
A unica coisa é na hora de iniciar pelo novo kernel, ele pede o parametro “initrd” (uso o GRUB), o qual vc nao explica aqui neste artigo.
No meu grub, a linha que escreve o kernel default esta com este parametro assim: initrd /initrd-2.6.11-1.1369_FC4.img

Ficarei mt grato se alguem puder ajudar,,,,,absssss
abssssss


#31 | Adama

bicho realmente foi muito claro as explica;’oes gostei muito e me ajudou muito.Parabens e obrigado


#32 | Leandro

Os passos estão ótimos e bem claros.
Mas esse patch tá zuado.

root@gambix:/usr/src/linux# make bzImage
scripts/kconfig/conf -s arch/i386/Kconfig
CHK include/linux/version.h
CHK include/linux/utsrelease.h
CC arch/i386/kernel/asm-offsets.s
In file included from include/linux/preempt.h:9,
from include/linux/spinlock.h:49,
from include/linux/seqlock.h:29,
from include/linux/time.h:8,
from include/linux/stat.h:60,
from include/linux/module.h:10,
from include/linux/crypto.h:21,
from arch/i386/kernel/asm-offsets.c:7:
include/linux/thread_info.h: In function `thread_info_init’:
include/linux/thread_info.h:59: error: structure has no member named `generic’
include/linux/thread_info.h:60: error: structure has no member named `generic’
In file included from arch/i386/kernel/asm-offsets.c:8:
include/linux/sched.h: At top level:
include/linux/sched.h:1150: error: duplicate member ‘ioprio’
make[1]: *** [arch/i386/kernel/asm-offsets.s] Error 1
make: *** [prepare0] Error 2
root@gambix:/usr/src/linux#

Sem o patch a coisa flui bem melhor!
Abraços


#33 | jorge

por gentileza compilei kernel 2.6.28.4 e depois ele d 260mb fico com 2.5 gb porq?
helpppppp



#35 | Helio

Parabéns pelo tutorial.
Tenho uma pergunta.

Eu utilizo uma ferramenta de clone pela rede chamada de UDPCAST com kernel linux, mas ele não inclui os drivers todos drivers que preciso.

A dúvida é, ao dar o comando make menuconfig na seção de drivers existe o driver que preciso habilitar, mas não consigo inclui-lo na imagem do kernel, somente como modulo. Acontece q o UDPCAST só tem 5 arquivos (BOOT.CATALOG[2KB], INITRD[4.5MB], ISOLINUX.BIN[15KB], ISOLINUX.CFG[1KB] E LINUX[660KB]) não entendo muito, mas aparentemente ele não carrega os módulos, somente o kernel e arquivos de inicialização.

Você sabe me dizer se realmente não vai funcionar carregando os drivers como módulos?

Obrigado.
Helio


«

»

Deixe seu comentário