Compilando Kernel!

Publicado: 09/12/2010 em informática, Uncategorized

Execute os passos/comandos por sua conta e risco!

🙂

Uma das grande vantagens do Linux é a possibilidade de se configurar o sistema operacional a imagem e semelhança de seu hardware/necessidade. Bem, algumas pessoas não acham tão vantagem assim, pois não é todo mundo que vai querer ou ter a necessidade de realizar esta tarefa! Mas ter a possibilidade de compilar o Kernel já é com certeza uma vantagem, pois alguns sistemas operacionais não dão essa possibilidade!

Não vou fazer um passo a passo aqui! Só dar uma breve noção do que é este processo e do que é necessário. Os tutoriais passo a passo geralmente não dão muito certo pois, temos muitas variáveis para configurar (hardware/software), então para você ficar bom em compilar kernel, você vai ter de fazer isto várias vezes até entender o processo como um todo. Uma notícia ruim é que normalmente não conseguimos compilar o Kernel (funcional) na primeira vez, mas depois de algum tempo e dores de cabeça tudo se resolve.

Precisamos de ferramentas de compilação disponíveis no sistema para iniciar esta tarefa, o Slackware já vem com tudo isto (as outras distro provavelmente também vem).

O primeiro passo é baixar o fonte do Kernel Linux (este é genérico para qualquer distribuição na verdade este é o Linux) isto pode ser feito em http://www.kernel.org, baixe o último Kernel estável. Ou se você quiser baixe o último kernel em teste (mas este é por sua conta e risco). Neste exemplo vou baixar o: http://www.kernel.org/pub/linux/kernel/v2.6/testing/linux-2.6.37-rc5.tar.bz2. Vou supor que você baixou o Kernel no seu diretório home (no meu caso /home/luiz) na pasta Downloads (padrão da maioria dos navegadores hoje).

Feito isto abra um Console e os passos a seguir serão todos via terminal, como root:

1. Vamos descompactar o fonte do Kernel:

# tar vxjpf /home/home/Downloads/linux-2.6.37-rc5.tar.bz2 -C /usr/src/

2. Entramos do diretório /usr/src e criamos um link:

# cd /usr/src/

# rm linux

# ln -s linux-2.6.37-rc5 linux

# cd linux

3. Antes de iniciar a compilação vamos verificar o que temos de CPU/hardware/sistema de arquivos em nosso computador:

# cat /proc/cpuinfo

processor       : 0vendor_id       : GenuineIntelcpu family      : 6model           : 23model name      : Intel(R) Core(TM)2 Duo CPU     P7450  @ 2.13GHzstepping        : 6cpu MHz         : 2133.000

# lspci

00:00.0 Host bridge: Intel Corporation Mobile 4 Series Chipset Memory Controller Hub (rev 07)

00:01.0 PCI bridge: Intel Corporation Mobile 4 Series Chipset PCI Express Graphics Port (rev 07)

00:1a.2 USB Controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #6 (rev 03)

00:1a.7 USB Controller: Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #2 (rev 03)

00:1b.0 Audio device: Intel Corporation 82801I (ICH9 Family) HD Audio Controller (rev 03)

00:1c.0 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 1 (rev 03)

00:1d.2 USB Controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #3 (rev 03)

00:1d.7 USB Controller: Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #1 (rev 03)

00:1e.0 PCI bridge: Intel Corporation 82801 Mobile PCI Bridge (rev 93

00:1f.2 SATA controller: Intel Corporation ICH9M/M-E SATA AHCI Controller (rev 03)

01:00.0 VGA compatible controller: ATI Technologies Inc Mobility Radeon HD 3650

01:00.1 Audio device: ATI Technologies Inc RV635 Audio device [Radeon HD 3600 Series]

0e:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8101E/RTL8102E PCI Express Fast Ethernet controller (rev 02)

14:00.0 Network controller: Intel Corporation Wireless WiFi Link 5100

20:00.0 FireWire (IEEE 1394): JMicron Technology Corp. IEEE 1394 Host Controller

20:00.1 System peripheral: JMicron Technology Corp. SD/MMC Host Controller

# lsusb

Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Bus 001 Device 002: ID 04f2:b008 Chicony Electronics Co., Ltd USB 2.0 Camera

# mount

/dev/root on / type reiserfs (rw,relatime)

proc on /proc type proc (rw

/dev/sdb2 on /opt type reiserfs (rw)

/dev/sdb3 on /usr type reiserfs (rw)

/dev/sdb5 on /home type reiserfs (rw

/dev/sda5 on /tmp type reiserfs (rw)

/dev/sda6 on /var type reiserfs (rw)

(algumas saídas foram omitidas)

O primeiro comando (cat /proc/cpuinfo) vai mostrar a CPU que temos, o lspci vai mostrar os dispositivos PCI conectados, o lsusb vai mostrar dispositivos USB conectados (no caso de notebooks, que é o meu caso estes dispositivos são ligados internamente, por isto é importante dar uma olhada). No último comando (mount) de uma olhada no tipo (type) de sistema de arquivo que você utiliza (no meu caso reiserfs, mas podem ser vários! Não compilar o kernel com suporte ao Sistema de Arquivo/HD não vai deixar o kernel funcionar! Este é um erro básico).

4. Agora vamos iniciar a configuração do kernel, neste é importante ter um terminal com pelo menos 80 linhas/colunas caso contrário vai dar um erro informando (Your display is too small to run Menuconfig!It must be at least 19 lines by 80 columns.make[1]: *** [menuconfig] Error 1make: ** [menuconfig] Erro 2) que o comando não vai conseguir abrir o menu de configuração (muita gente para por aqui devido a este erro bobo), então deixe um terminal que pegue a tela inteira:

# make menuconfig

Ao digitar este comando abrirá um menu que permitirá a configuração do kernel conforme figura a seguir:

Luiz Arthur - kernel

Este primeiro menu traz todas as opções de configuração! No final do menu temos as opções de salvar as configurações com outro nome (o padrão é .config – lembrando que arquivos que iniciam com um ponto (.) são ocultos) também temos a opção de carregar configurações de um arquivo já existente.

É altamente aconselhável navegar por estes menus até que você conheça um grande número de opções/configurações e fique familiarizado com este ambiente.

Dentro de cada opção desta tem outras opções e suas sub-opções (todas agrupadas por funcionalidades/hardware).

Como já foi dito não vamos entrar em todas, mas sim apenas dar uma olhada nas principais para uma compilação básica (você é quem vai ter de fazer o dever de casa e entrar em cada menu e ver se este é ou não útil para você!).

Vamos entrar em Processor type and features  —>

Existem várias opções neste menu, vamos nos concentrar no tipo de CPU (lembrando que obtermos a certeza de nossa CPU anteriormente) no meu caso eu selecionei a familia Intel P4 e Xeon. Para selecionar basta posicionar em cima da opção e pressionar a barra de espaço! Neste caso ainda tem um sub-menu!

Em caso de duvida sobre qual processador escolher podemos recorrer ao help do menu e ele apresentará uma descrição sobre a opção em questão. Veja o exemplo da explicação sobre a opção do Intel P4.

Repare que o próprio help indica onde encontrar informações sobre o seu processador (/proc/cpuinfo).

 

Outra opção que iremos visitar aqui é o de gerenciamento de emergia, está é muito importante principalmente para os computadores novos e notebooks. Por exemplo, se não compilarmos direito o “ventilador” interno (fan) não vai funcionar e o computador pode superaquecer (a grande maioria das placas mães vai desligar o micro automaticamente para que este não queime, mas o seu micro vai ficar ligado apenas alguns minutos e vai parar). Como você pode ver alterar o Kernel exige cautela.

No menu principal uma das opções mais importantes é a de Device Drivers  —> é aqui que estão a grande maioria dos famosos drivers para fazer funcionar a placa de vídeo, placa de rede, placa de som, etc. É neste menu que será necessário o estudo do comando lspci.

Ainda dentro de Device Drivers  —> Vamos dar uma olhada na opção da placa de vídeo no ambiente gráfico, no meu caso vou passar pelas duas figuras a seguir para configurar a minha placa ATI Radeon HD3650 (vista através do lspci).

Depois de selecionar Graphics support —> selecionamos Direct Rendering Manager (XFree86 4.1.0 and higher DRI support)  —>

Note que neste caso a  ATI Radeon foi escolhida como módulo <M> e não como parte fixa do Kernel <*>, o uso de módulo significa que só colocaremos na memória as funcionalidades da placa de vídeo quando for necessário (isto ajuda a salvar memória, a placa de vídeo não é necessária no boot do sistema, por exemplo, mas sim só quando for iniciado o ambiente gráfico).

Outro menu muito importante que as pessoas geralmente cometem erros é o de sistemas de arquivos (a partir do menu principal) File systems  —>. É muito importante que o sistema tenha acesso ao HD (isto desde a hora do boot). É bem comum, por exemplo, a pessoa colocar as funções de sistema de arquivo do kernel como módulo! Porém o módulo é um arquivo que vai ser chamado de dentro do HD depois que o kernel estiver ativo, mas como chamar o módulo do HD se não temos acesso ao sistema de arquivos? Isto pode ser resolvido de algumas maneiras, mas em nosso caso vamos compilar o nosso suporte ao sistema de arquivo nativo no Kernel (no meu caso eu uso o sistema de arquivo reiserfs).

É obvio que não exploramos todo o menu, mais uma vez isto vai depender de inúmeros fatores e fica como tarefa de cada um fazer estes passos!

Feito as alterações de acordo com a suas necessidades é só apertar a tecla ESC até aparecer a seguinte tela:

 

Escolha a opção yes, para salvar as configurações no arquivo padrão (.config) e pronto, agora é só compilar o Kernel. Se tudo correr bem e está configuração ficar a contento, na próxima atualização do Kernel, podemos apenas copiar este arquivo para o novo diretório do fonte do Kernel e compilar (pulando essa parte chata de ficar escolhendo drivers e funções).  É claro que sempre que sair um Kernel novo olhe o changelog para ver se compensa escolher alguma opção nova que valha a pena (assim sempre teremos um sistema em sintonia fina).

5. Agora que configuramos o kernel vamos compilar. Faremos  tudo de uma só vez:

#make bzImage && make modules && make modules_install

O próximo passo eu recomendo só para o Slackware

# make install

Para o restante copie o novo Kernel para o diretório /boot tal como:

# cp arch/x86_64/boot/bzImage /boot/meukernelnovo

O x86_64 pode ser apenas x86 depende da sua arquitetura escolhida. Escolha um nome mais apropriado do que meukernelnovo.

Em ordem, primeiro compilamos o Kernel, depois compilamos os módulos (tal como drivers que vão ser chamados por demanda), depois de compilar os módulos os copiamos para os diretórios apropriados e por fim copiamos o kernel no /boot e atualizamos o gerenciador de boot.

ATENÇÃO não use o make install em caso de dúvida isto pode inutilizar o seu sistema caso o Kernel não funcione! TODOS OS PASSOS SÃO POR SUA CONTA E RISCO…

Eu tenho o costume de antes de executar o comando make install de deixar um Kernel padrão (default) caso algo de errado (isto é altamente recomendável) para isto eu faço o seguinte copio o meu arquivo do kernel padrão (original) e edito o LILO para que este sempre tenha o kernel novo e o kernel antigo). Não vou mostrar o processo de cópia e sim somente uma parte do meu aquivo /etc/lilo.conf.

# Linux bootable partition config begins

image = /boot/vmlinuz

root = /dev/sdb1

label = Linux  read-only

# Linux Kernel Padrao

image = /boot/vmlinuz.def

root = /dev/sdb1

label = Linux-def

read-only

Após alterar o LILO é obrigatório executar o comando:

# lilo

O primeiro /boot/vmlinuz é sempre o Kernel que eu acabei de compilar e que o make install vai atualizar e o segundo /boot/vmlinuz.def é o meu Kernel padrão.

Quando utilizo o grub eu faço o mesmo (/boot/grub/grub.cfg):

menuentry “Slackware64 13.1” {

set root=(hd1,1)

linux   /boot/vmlinuz root=/dev/sdb1 ro

}
menuentry “Slackware64 13.1 – DEFAULT” {

set root=(hd1,1)

linux   /boot/vmlinuz-huge-2.6.33.4

root=/dev/sdb1 ro

}

Mais uma vez muito cuidado com este passo!!!

Reinicie o computador com o Kernel novo (escolha-o no gerenciador de boot) e se tudo correr bem você vai ter o seu próprio Kernel Linux funcionando corretamente!!!  :-D

Pode parecer que nunca vamos precisar compilar o kernel, mas eu já tive que compilar em casos como: em um dispositivo embarcado que precisava de novas funcionalidades, boot mais rápido e um logo de boot personalizado. Então, é sempre bom pelo menos saber como fazer este tipo de tarefa! Principalmente quem é dá área de Sistemas Operacionais.

Uma boa recomendação é fazer isto em máquinas virtuais antes de tentar em um computador em produção!

Boa sorte!

comentários
  1. guilxxx disse:

    Show de bola… é o que muita gente precisa saber pra recompilar o kernel e não sabe por onde começar (y)

  2. yermandu disse:

    Professor o artigo está ótimo, sou um kernel compiler e com essas orientações não tem como se perder, mas o esquema é ir fuçando. Um bom motivo para compilar o kernel são os drivers, por exemplo quando comprei meu notebook a placa wifi não funcionava direito, mas o kernel mais recente suportava tranquilamente, então tive que compilar o kernel para que tivesse um bom suporte.

    Gostaria de acrescentar mais umas informações bem uteis para quem está começando a compilar seu kernel.

    É muito util sempre deixe a partição boot separada da raiz, de preferência uma partição primária pequena, 1GB é mais do que suficiente. E ter o ultimo kernel que funcione junto a listagem de boot seja ele lilo ou grub. Pois nem sempre o kernel irá funcionar de primeira.

    Quanto aos módulos a página de Kenshi Muto http://kmuto.jp/debian/hcl/
    Pode ajudar a identificar quais módulos serão obrigatórios incluir no kernel.

    Reutilize uma configuração. A opção:
    General Setup
    Kernel .config support
    [*] Enable access to .config through /proc/config.gz

    É muito útil para recompilar e reaproveitar o kernel, você pode por exemplo fazer um:
    cd /usr/src/linux
    zcat /proc/config.gz > .config
    e terá algumas, algumas configurações do kernel atual. isso já poupa algum trabalho.

    Não esqueçam de que os discos atuais usam ATA/SATA como barramente e por isso não deixe de acrescentar os principais módulos em “built-in”, sim pois díficilmente ele funciona como [M]odule, além do mais acrescentes os de seu hardware que pode ser obitido através do lspci, ou por dedução, por exemplo sua placa mãe é uma intel, então por via das duvidas acrescente todos esses modulos ata/sata que tenham intel no nome.
    Device Drivers
    Serial ATA and Parallel ATA drivers
    [*] ATA ACPI Support
    [*] SATA Port Multiplier support
    AHCI SATA support
    [*] ATA BMDMA support
    Generic ATA support

    Um dos maiores problemas para quem esta começando a compilar o kernel é o fato de retornar um Kernel Panic, e isso pode ter várias causas, sendo a mais comum não ter os modulos ATA/SATA Definidos.

    Lembrando que adicionar modulos e configurações a mais o kernel fica mais pesado, leva mais tempo para compilar.

    Bom acho que essas informações serão úteis para quem gosta de ter o um kernel personalizado.
    Visitem também a página brasileira http://br.kernelnewbies.org eles tem uma lista de email com uma atividade baixa, mas tem sempre alguém para responder.

    Boa Sorte, muitos make all; cp /arch/XXxXX/boot/bzImage para todos.

    • profluizarthur disse:

      Obrigado pelo comentário/post… rsrsrs
      Eu sempre gosto quando as pessoas comentam os posts ainda mais quando fazem isto complementando o mesmo…

      Valeu yermandu!!!

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s