Kernel Compiling Howto

From Pruonckk.org

Autor: Pruonckk le Punk


Conteúdo

Prefacio

Porque compilar o kernel ?

A resposta para esta pergunta é simples, um kernel padrão que vem numa distro, é um kernel genérico, pronto a aceitar qualquer hardware, quando você pensa no porque compilar um kernel, você pensa em manter um kernel especifico para o seu computador, isso pode lhe trazer um melhor desempenho de hardware, além da facilidade para compilar algum driver necessário sem haver nenhum tipo de problema (a menos que exista incompatibilidade entre o kernel e o driver).


Escolhendo um kernel

Para escolher um kernel você tem que ir até o site www.kernel.org e escolher o kernel que deseja, hoje a versão estable (estável) do kernel é a 2.6.17. Em alguns casos você optará por alguma outra versão que não seja a mais nova, devido a algum patch ou driver que voce pretende ter, que só funciona em versões especificas, então a escolha do kernel depende de você, eu usarei como exemplo a versão 2.6.16.

Reconhecendo as necessidades

Eu vou pedir a você que abra um editor de texto e anote as saídas dos comandos abaixo, pois elas são necessárias para que você compile o kernel e consiga bootar.

Sistema de arquivo

Caso você não saiba especificamente qual sistema de arquivos esta usando, você pode olhar por dois comandos

cat /etc/fstab

que terá uma saida similar a seguinte

proc            /proc           proc    defaults        0       0
/dev/hda5       /               ext3    defaults,errors=remount-ro 0       1
/dev/hda1       /boot           ext3    defaults        0       2
/dev/hda6       /home           ext3    defaults        0       2
/dev/hda7       /usr/src        reiserfs defaults        0       2
/dev/hda2       none            swap    sw              0       0
/dev/hdc        /media/cdrom0   iso9660 ro,user,noauto  0       0
/dev/sda1       /media/camera0  auto    rw,user,noauto  0       0
/dev/hda10      /home/ftp/pub reiserfs defaults 0       0

No meu caso você pode ver que o meu /boot usa o sistema ext3 e o meu / e /home também, então o sistema de arquivos crucial para o meu sistema funciona é o ext3

O outro comando que mensionei seria o comando mount

mount

que terá uma saida similar a seguinte

/dev/hda5 on / type ext3 (rw,errors=remount-ro)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
usbfs on /proc/bus/usb type usbfs (rw)
/dev/hda1 on /boot type ext3 (rw)
/dev/hda6 on /home type ext3 (rw)
/dev/hda7 on /usr/src type reiserfs (rw)
/dev/hda10 on /home/ftp/pub type reiserfs (rw)

Aqui novamente vemos que o meu / usa ext3 e meu /boot e /home também, entre outros sistemas de arquivos

Apartir daqui sabemos que o sistema de arquivos que não podemos esquecer é o ext3

Reconhecendo o Hardware

Para reconhecer o hardware que temos é simples, vamos usar o comando lspci

lspci

que terá uma saida similar a seguinte

0000:00:00.0 Host bridge: ATI Technologies Inc: Unknown device 5831 (rev 02)
0000:00:01.0 PCI bridge: ATI Technologies Inc: Unknown device 5838
0000:00:13.0 USB Controller: ATI Technologies Inc: Unknown device 4347 (rev 01)
0000:00:13.1 USB Controller: ATI Technologies Inc: Unknown device 4348 (rev 01)
0000:00:13.2 USB Controller: ATI Technologies Inc: Unknown device 4345 (rev 01)
0000:00:14.0 SMBus: ATI Technologies Inc ATI SMBus (rev 18)
0000:00:14.1 IDE interface: ATI Technologies Inc: Unknown device 4349
0000:00:14.3 ISA bridge: ATI Technologies Inc: Unknown device 434c
0000:00:14.4 PCI bridge: ATI Technologies Inc: Unknown device 4342
0000:00:14.5 Multimedia audio controller: ATI Technologies Inc IXP150 AC'97 Audio Controller
0000:00:14.6 Modem: ATI Technologies Inc: Unknown device 434d (rev 01)
0000:01:05.0 VGA compatible controller: ATI Technologies Inc: Unknown device 5835
0000:02:02.0 Ethernet controller: Atheros Communications, Inc. AR5212 802.11abg NIC (rev 01)
0000:02:03.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ (rev 10)
0000:02:04.0 CardBus bridge: ENE Technology Inc CB1410 Cardbus Controller (rev 01)

No meu caso podemos ver que todo meu hardware é ati, exceto pels placas de redes, apartir disso, anotamos o seguinte

Chipset: ATI
IDE: ATI
USB: ATI
Som: ATI
REDE: Realtek RTL-8139
WIFI: Atheros ar5212
Video: ATI

As principais informações a respeito de hardware que precisamos são estas ai.

Reconhecendo o processador

Para reconhecermos o tipo de processador que temos, usaremos o comando cat /proc/cpuinfo

cat /proc/cpuinfo

a saida será similar a seguinte

processor       : 0
vendor_id       : GenuineIntel
cpu family      : 15
model           : 4
model name      : Mobile Intel(R) Pentium(R) 4 CPU 3.06GHz
stepping        : 1
cpu MHz         : 3066.948
cache size      : 1024 KB
physical id     : 0
siblings        : 2
core id         : 0
cpu cores       : 1
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 5
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov                                                                                         pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe constant_tsc pni monit                                                                                        or ds_cpl est tm2 cid xtpr
bogomips        : 6140.04

De acordo com esta saida, podemos ver que tenho um Pentium 4, pelas flgs, pdoemos ver que tenho suporte a varias coisas como acpi, e ht enre outras

Então anotamos isso


Copiando o kernel para a estrutura correta

Existe um padrão quando pensamos em compilar kernel, que é manter a extrutura no diretório /usr/src, entao copia o arquivo que voce baixou para o diretorio /usr/src, feito isso vamos descompactalos

tar -xzvf linux-{versao}.tar.gz

ou

tar -xjvf linux-{versao}.tar.bz2

Instalando algumas dependencias

Vou colocar aqui as dependencias necessárias para se compilar o kernel usando um sistema debian

apt-get install libncurses5-dev gcc make kernel-package

Iniciando a seleção no kernel

Para que possamos compilar o kernel temos que selecionar todas as opções que termos nele, esse é o ponto mais importante de todo o processo, o comando usado para abrir a tela de configuração é o

make menuconfig

este comando tem que ser executado dentro da extrutura do kernel (/usr/src/linux-{versao}/)

mas antes de realizarmos isso, vamos explicar uma coisa, se você fizer isso agora, o kernel irá carregar com varias opções selecionadas, eu prefiro que ele não carregue nenhuma opção, ja que a minha idéia é limpar o kernel.

Para que isso não ocorra, execute o seguinte comando

> /usr/src/linux-{versao}/.config
isso ai é cima é realmente um sinal de maior ( > ), voce precisa colocalo antes do caminho

e entao

make menuconfig

Pronto, agora estamos na tela de configuração do kernel

Você terá informações similares as seguintes

  lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq Linux Kernel Configuration qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk
  x  Arrow keys navigate the menu.  <Enter> selects submenus --->.  Highlighted letters are hotkeys.  Pressing <Y> includes, <N> excludes, <M> modularizes          x  
  x  features.  Press <Esc><Esc> to exit, <?> for Help, </> for Search.  Legend: [*] built-in  [ ] excluded  <M> module  < > module capable                         x  
  x                                                                                                                                                                 x  
  x                                                                                                                                                                 x  
  x lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk x  
  x x     Code maturity level options  --->                                                                                                                       x x  
  x x     General setup  --->                                                                                                                                     x x  
  x x     Loadable module support  --->                                                                                                                           x x  
  x x     Block layer  --->                                                                                                                                       x x  
  x x     Processor type and features  --->                                                                                                                       x x  
  x x     Power management options (ACPI, APM)  --->                                                                                                              x x  
  x x     Bus options (PCI, PCMCIA, EISA, MCA, ISA)  --->                                                                                                         x x  
  x x     Executable file formats  --->                                                                                                                           x x  
  x x     Networking  --->                                                                                                                                        x x  
  x x     Device Drivers  --->                                                                                                                                    x x  
  x x     File systems  --->                                                                                                                                      x x  
  x x     Kernel hacking  --->                                                                                                                                    x x  
  x x     Security options  --->                                                                                                                                  x x  
  x x     Cryptographic options  --->                                                                                                                             x x  
  x x     Library routines  --->                                                                                                                                  x x  
  x x ---                                                                                                                                                         x x  
  x x     Load an Alternate Configuration File                                                                                                                    x x  
  x x     Save Configuration to an Alternate File   


Então vamos começar pelo inicio.

Code maturity level options

[*] Prompt for development and/or incomplete code/drivers

General Setup

() Local version -- append to kernel release

Não é ncessário colocar nada ai se você estiver usando debian, caso seja outra distro, você pode usar algo como -meunome

[*] Automatically append versioning information to the version string
[*] Support for pagging of anonymous memory (swap)
[*] System V IPC
[*] BSD Process Acounting
[*]      BSD Process Accounting Version 3 file format
[*] kernel .config support

Loadeble module Support

[*] Enable loadable module support
[*]     Module unloading
[*]     Module versioning support
[*]     Automatic kernel module loading

Block Layer

[*] Support for large Block Devices

Process Types and Features

Subarchiteture Type (PC-Compatible)
Processor family (Pentium-4/Celeron(P4-Based)/Pentium-4 M/Xeon)

Selecione acima a opção mais adequada para seu processador

[*] Generic X86 support
[*] HPET Timer Support
[*] Symetric multi-processor support

A opção acima só é valida para processadores com a flag ht ou máquinas com mais de um processador

(2) Maximum number of CPU's (2-255)

Coloque acima a quantidade de processadores que voce tem, caso você não tenha um processador HT, e não selecionar a opção Symetric multi-processor support esta parte não aparecerá no menu

[*] SMT (Hyperthreading) scheduler support
       Preemption Model (No Force Preemption (Low-Latency Desktop))
[*] Preempt The Big Kernel Lock
[*] Machine Check Exception
<*> Check for non-fatal errors on AMD Athlong/Duron / Intel Pentium
[*] Check for P4 thermal throttling  interrupt
High Memmory Support (4GB) --->

Caso você tenha 1GB de memoria ou mais, tem que selecionar esta opção

[*] Enable Kernel IRQ balancing
   Timer frequency (1000 HZ)

Power Management options (ACPI, APM)

[*] Legacy Power Management API

ACPI (Advanced Configuration and Power Interface) Support

[*] ACPI Support
<*> AC Adapter

Selecione a Opção acima apenas em caso de notebook

<*> Battery

Seleciona a Opção acima apenas em caso de notebook

<*> Button
<*> Video
<*> Fan
<*> Processor
<*>    Thermal Zone

Bus Options (PCI, PCMCIA, EISA, MCA, ISA)

PCI Access mode (Any)
[*] PCI Express Support

Marque a opção acima apenas se você tiver um slot PCI Express

PCCARD (PCMCIA/CarBus) support

Estas opções são apenas para quem tem slot PCMCIA

<M> PCCARD (PCMCIA/CardBus) Support
[*] 32-bit CardBus support
<M> CardBus yenta-compatible bridge support

Executable file formats

[*] Kernel support for ELF binaries
<*> Kernel support for a.out ECOFF binaries
<M> Kernel support for MISC binaries

Networking

[*] Networking Support 

Networking options

<*> Packet Socket
[*]   Packet Socket: mapped IO
<*> Unix domain sockets
[*] TCP/IP networking
[*] INET: Socket monitoring interface

Não vamos adicionar outros suportes neste ponto, a menos que você saiba o que está fazendo ou precisa de iptables e etc...

Device Drivers

Parellel port support

<*> Parallel port support
<*> PC-Style hardware

Block Devices

<M> Normall Floppy disk support
<*> LoopBack devices support
<M>   Cryptoloop Support
<*> Ram disk support
(16) Default number of RAM disks
(4096) Default RAM disk size (kbytes)
<*> Initial RAM disk (initrd) support
<*> Packet writing on CD/DVD media
(8) Free buffer for data gathering

ATA/ATAPI/MFM/RLL support

<*> ATA/ATAPI/MFM/RLL support
<*> Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support
<*> Include IDE/ATA-2 DISK support
[*] Use multi-mode by default
<M> Include IDE/ATAPI CDROM support
<M> INCLUDE IDE/ATAPI FLOPPY support
<*> generic/default IDE chipset support
<*> PCI IDE chipset support
<*> Sharing PCI IDE interrupts support
<*> Generic PCI IDE Chipset Support
<*> Generic PCI bus-master DMA support
<*>   Use PCI DMA by default when available 
<*> ATI IXP chipset IDE support

A opção acima corresponde ao meu chipset, se encontrar o seu selecione o seu

Network device support

[*] Network device support

Ethernet (10 or 100Mbit)
[*] Ethernet (10 or 100Mbit)
[*] EISA, VLB, PCI and board controllers
<*> Realtek RTL-8129/8130/8139 PCI Fast Ethernet Adapter support
[*] Use PIO instead of MMIO 

Caso voce tenha outra placa selecine o driver correspondente

Caso você use um modem bridge daqueles que tem que discar, voce precìsa ativar também os drivers abaixo

<*> PPP (point-to-point protocol) support
[*] PPP Filtering
[M] PPP support for async serial ports
[M] PPP support for sync tty ports
[M] PPP Deflate compression
<M> PPP BSD-Compress compression

Input Device support

[*] Provide legacy /dev/psaux device
(1024) Horizontal screen resolution
(768) Vertical screen resolution

Keyboards
[*] AT Keyboards 
[*] XT Keyboards

Volte ao menu anterior

[*] Mouse --->
Mouse
<*> PS/2 mouse
<M> Serial mouse

Character support

[*] Legacy (BSD) PTY support
(256) Maximum number of legacy PTY in use
[M] Parallel printer support
[*]    Support for console on line printer
<*> Intel/AMD/VIA HW Random Number Generator support
<*> /dev/nvram support
<*> Generick /dev/rtc emulation
<*> /dev/agppart (AGP Support)
<*> ATI Chipset support

Selecione acima o modelo correspondente a tua placa

<*> Direct Rendering Manager (XFree86 4.1.0 and higher DRI Support)
<*> ATI Radeon

Selecione as duas opçoes acima apenas se você tiver alguma placa listada nas opções

Graphics support

<*> Support for frambe buffer device 
<*> VGA 16-color graphics support
<*> VESA VGA graphics support
Console display driver support
[*] Video mode selection
<*> Frame Buffer console support 

Sound

<M> Sound Card Support
Advanced LInux Sound Architecture
<M> Advanced Linux Sound Architecture
<M>    Sequencer support 
<M>    Sequencer dummy client
<M> OSS Mixer API
<M> OSS PCM (digial audio) API
<*> OSS Sequencer API
[*] Support for old ALSA API
PCI Devices
<M> ATI IXP AC97 Controller
<M> ATI IXP Modem
<M> C-Media 8738,8338 

Nestas opções selecione apenas os drivers para a sua placa de som


File Systems

<M> Second extended fs support
<M>   Ext2 extended attributes 

Lembrando agora que meu sistema de arquivo padrão é o ext3, vou selecionar os módulos dele como Built-in ( [*] ) caso voce uso outro sistema de arquivos, basta selecionar o correspondente

<*> Ext3 Journalling file system support 
[*]   Ext3 extended attributes 
[*]   Ext3 POSIX Access Control Lists
[*]   Ext3 Seccurity Labels
[M] ReiserFS support
[M] XFS support
[M] ROM File System support
<*> Kernel automounter support 
<*> Kernel automounter version 4 support (also support v3)

CD-ROM/DVD Filesystem

<*> ISO 9660 CDROM file system support
[*]  Microsoft Juliet CDROM extensions
[*]  Transparent decompression extension 
<M> UDF File system support

Pseudo Filesystems

[*] /proc file system support                                       
[*]   /proc/kcore support                                           
[*] sysfs file system support                                       
[*] Virtual memory file system support (former shm fs)              
[*] HugeTLB file system support                                     
<*> Relayfs file system support                                     
< > Userspace-driven configuration filesystem (EXPERIMENTAL) 

Miscelaneous File System

<*> Compressed ROM file system support (cramfs)

Partition Types

[*]   PC BIOS (MSDOS partition tables) support   

Esta parte é importante para que sua particao seja reconhecida no boot


Selecionado tudo isso, podemos dar exit, e salvar a configuração

IMPORTANTE

Este kernel é um exemplo de uma compilação basica, não tem suporte a SCSI, não tem suporte a USB, e uma série de outras coisas, é um kernel simples, apenas para que você pegue o jeito para compilar e em outras tentativas vá adicionando os drivers que você necessita

Iniciando a Compilação

Maneira DEBIAN

A maneira debian de se compilar um kernel é a seguinte, no diretório do kernel execute o seguinte comando

make-kpkg --revision=1 --append-to-version=-{seunome} kernel_image

onde eu coloque {seunome} nao coloque as chaves {}

Ao terminar o processo de comiplação sem erros, você terá no diretório /usr/src um arquivo similar ao abaixo

kernel-image-2.6.16-{seunome}_1_i386.deb

para instalar, use o comando abaixo

dpkg -i kernel-image-2.6.16-{seunome}_1_i386.deb

ele irá instalar o kernel nos locais apropriados, e adicionar ao grub ou lilo dependendo de qual você esta usando

Maneira Comum

A maneira comum de se compilar um kernel corresponde na execução de uma sequência de comandos

 make clean
make

irá compilar o kernel

make modules_install 

irá instalar os modulos no diretório /lib/modules/{seu_kernel}/

Após compilado precisamos pegar a imagem gerada, e copia-la para o /boot

cp /usr/src/linux-2.6.16/arch/i386/boot/bzimage /boot/vmlinuz-2.6.16-{seunome}

Feito isso, ou você adiciona manualmente no grub ou lilo, ou no caso do grub, use o comando

update-grub

Este comando irá ler a estrutura do /boot e adicionar os vmlinuz-* em sua configuração

Rebootando a maquina

Tudo compilado e instalado em seus devidos lugares, hora de rebootar a maquina e ver se tudo irá caregar perfeitamente

reboot

IMPORTANTE:2

Lembre-se que o kernel foi compilado apenas com suporte a IDE, se voce usa SATA ou SCSI é preciso compilar com os suportes necessários

Observações

Eventualmente pode ser necessário criar o RAM driver initrd. No caso do Debian, inclua a diretiva --initrd. Estas diretivas --us e --uc referem-se a assinatura e changelog.

# make-kpkg --append-to-version "-seunome" --initrd --us --uc kernel_image

exemplo:

make-kpkg --revision=1 --append-to-version "-jm" --initrd --us --uc kernel_image

Deve aparecer algo como:

exec debian/rules DEBIAN_REVISION=1 APPEND_TO_VERSION=-jm INITRD=YES UNSIGN_CHANGELOG=YES UNSIGN_SOURCE=YES kernel_image

Para o Debian pode ser necessario instalar a ferramenta para criar o ramdisk

# apt-get update
# apt-get install initramfs-tools

No caso da compilação classica seria algo do tipo:

$ mkinitrd /boot/initrd-VERSAO.img VERSAO
$ mkinitrd -k vmlinux-VERSAO -i initrd-VERSAO

Veja o man mkinitrd para maiores detalhes.


A instalação sera feita da forma indicada anteriormente. Como ja existe um kernel instalado, o Grub sera atualizado criando uma entrada para o novo kernel. Se houver um link simbólico para o System.map, este link deverá ser removido. exemplo:

cd /usr/src
dpkg -i linux-image-2.6.16-jm_1_i386.deb

ATENÇÂO: Para remover o kernel, use --purge para que o Grub tambem seja atualizado. Isto evita problemas tanto no Synaptic aptitude ou apt-get.

dpkg --purge Nome_Do_Pacote_Kernel_A_ser_Removido_Como_Aparece_No_BarraUsrBarraSrc

exemplo:

dpkg --purge linux-image-2.6.16-jm

No mais eu recomendo,

Read the Source, Luke !  160MB dos quais 120MB são drivers.

e finalmente,

USE THE SOURCE, LUKE !

Observações de julio menezes em 11/set/2006. ( que dia )


Voltar

Ferramentas pessoais
Inutilidades