Compilação de Kernel REAL TIME, e empacotamento Debian.
Bom. Faz tempo que venho testando o kernel, e por sugestão do amigo Douglas Almeida, vou abrir o tópico com o assunto.
O que é o kernel?
O Kernel Linux é o centro do Sistema Operacional, e sem ele seria impossível fazer um gerenciamento entre software e hardware.
Por que é tão importante compilar/recompilar o Kernel?
De modo geral para deixar o processamento das informações adequadas ao seu uso do processamento. Ou seja, se você necessita de melhor desempenho nada melhor que otimizar ao processamento do Kernel, ou inserir novos suportes de dispositivos de hardware. Além de poder eliminar "processos" do Kernel que apenas degradam o desempenho.
Inicialmente será abordado 2 assuntos diferentes.
:arrow: A compilação de Kernel para distros Debian-based;
:arrow: Kernel REAL TIME.
Prometo depois dar uma pesquisada em como compilar e empacotar em .RPM o Kernel, para que usuãrios Fedora/openSUSE/Mandriva também possam seguir o tutorial
Primeiro, o que é um Kernel REAL TIME?
É um Kernel totalmente preemptivo. Dentro do Linux, qualquer processo trabalha com prioridades, porém, processos com prioridades podem ficar mais tempo do que deveriam dentro do processador. Isso é algo útil para servidores, mas em desktops por exemplo. O Kernel Real time, faz mais trocas de contexto que um kernel normal(Troca de qual processo fica no processador), dando uma fatia menor de tempo, para que esta troca seja rápida, e todos os processos consigam utilizar o processador.
O patch Real Time do Kernel, possui uma latência mais baixa que o kernel Low-Latency(já incluso no Kernel), pois ele dimiui a latência(tornando "mais preemptivo") de códigos básicos do Linux como gerenciador de interrupções, sequencias de códigos com interrupção desabilitada.
Bom, vamos ao que interessa.
Aplicando o patch;
1) Baixe o Kernel do Linux(Farei com exemplo, o Kernel 2.6.26.5)
2) Baixe o PATCH, do kernel "Real Time". Dentro da URL http://www.kernel.org/pub/linux/kernel/projects/rt/ ,temos todos os patches para os Kernels, então, baixarei aquele que é do Kernel 2.6.26.5
3) Mova estes 2 arquivos para /usr/src, que é o local onde normalmente compilamos kernel(e logue como ROOT)...
Código:
# mv linux-2.6.26.5.tar.bz2 /usr/src
# mv patch-2.6.26.5-rt9.bz2 /usr/src
# cd /usr/src
(trabalharemos neste diretório a partir de agora)
4) Descompacte o Kernel
Código:
# tar -xjvf linux-2.6.26.5.tar.bz2
5) Faça um Link simbólico para /usr/src/linux
Código:
# ln -s linux-2.6.26.5/ linux
(Motivo: Muitas coisas que vc precisa compilar, os programas buscarão os "headers" do kernel, apontando para este diretório, como por exemplo, o Script de instalação do módulo proprietário da Nvidia)
6) Aplique o patch
Código:
# cd /usr/src/linux
# bzcat ../patch-2.6.26.5-rt9.bz2 | patch -p1
Pronto. A partir de agora, o patch ja está aplicado. Não entrarei em detalhes sobre "o que" enxugar no seu Kernel, pois cada computador tem hardware diferente, então, abordarei apenas como ativar o kernel RT, e compilá-lo empacotando em .deb. Fiz algumas otimizações como remover suporte a hardware que tenho CERTEZA que nunca entrará no meu notebook, e colocar o Processador como Core 2, ao invés de Pentium "Genérico. Ai, cabe a vcs fuçar e desabilidar(COM CUIDADO) o que vcs julgam desnecesário aos seus computadores
Compilação do kernel
O comando que iremos usar para compilar o kernel ao invés dos clássicos "make bzImage, make modules, make modules_install", será o utilitário de empacotamento "make-kpkg".
1) Primeiro, vamos instalar tal pacote(o make-kpkg, está dentro do pacote kernel-package)
Código:
# apt-get update
# apt-get install build-essential kernel-package libncurses5-dev tar gzip bzip2
2) Agora, retorne para o diretório do Kernel com o patch aplicado
Código:
# cd /usr/src/linux
3) Copie o seu arquivo de configuração do Kernel antigo. Ele se encontra em /boot, caso os comandos abaixo não funcionem. Geralmente ele possui a seguinte sintaxe: config-<nome_do_kernel>.
Código:
# cp /boot/config-$(uname -r) ./.config
O Arquivo de configuração se chama .config, pois é um arquivo ocluto.
4) Agora, que já possuimos o arquivo antigo de compilação, vamos apenas fazer uns "ajustes" para o RealTime.
Código:
# make menuconfig
Estamos no menuconfig da compilação do Kernel. temos a opção do make xconfig, mas eu prefiro esta interface
Entre no menu:
Código:
Processor type and features --->
Procure agora o menu:
Código:
Preemption Mode (<TIPO_DE_PREEMPÇÃO>) --->
Aparecerá o seguinte menu:
Código:
( ) No Forced Preemption (Server)
(X) Voluntary Kernel Preemption (Desktop)
( ) Preemptible Kernel (Low-Latency Desktop)
( ) Complete Preemption (Real-Time)
Marque
Código:
(X ) Complete Preemption (Real-Time) com a tecla ENTER
Caso vc possua um micro DUAL CORE, ou um PENTIUM 4, mude também a seguinte opção
Código:
Processor family (<MODELO_DO_PROCESSADOR>) --->
No caso do meu micro do trabalho ficou assim, por ser um Pentium D(Familia do Processador P4)
Código:
Processor family (Pentium-4/Celeron(P4-based)/Pentium-4 M/older Xeon) --->
e no meu notebook
Código:
Processor family (Core 2/newer Xeon) --->
Se vc não sabe o que fazer, apenas deixe Pentium GENERIC. Se vc tem certeza de seu processador mude, pois isso dã um bom ganho de performance
Depois, com a seta para o Lado de um EXIT, para sair para o menu principal, depois, seta para o lado de novo, EXIT. Ele vai perguntar se vc deseja salvar as configurações, diga YES!.
Pronto, vc aplicou o patch, e fez a troca do tipo de preempção do seu processador para FULL. Basta compilar com o make-kpkg
Código:
# make-kpkg --append-to-version "-tunado-rt" --initrd --us --uc kernel_image
O make-kpkg fará todo o trabalho de criar os módulos, o initial ramdisk, a imagem do kernel, e empacotar em um .deb, mas, e as outras opções para que servem?
--append-to-version "-tunado-rt" : Colocarã ao final do pacote, um nome que vc especificar dentro das aspas duplas. Pode botar seu nome aqui..hehehehhehehehe
--initrd : Diz que vc quer um initial ramdisk, junto da compilação do Kernel
--us --uc : Não cria changelog nem assinatura, para este pacote
Ao vc dar este comando pode aparecer a seguinte mensagem
Código:
Warning: You are using the initrd option, that may not
work unless you have applied the initrd cramfs patch to
the kernel, or modified mkinitrd not to use cramfs by
default. The cramfs initrd patch, is included in the
Debian supplied kernel sources, but is not present in
pristine kernel sources.
By default, I assume you know what you are doing, and I
apologize for being so annoying. Should I abort[Ny]?
Digite N para NÃO ABORTAR!!!!!!!!!!
Comece a compilar o Kernel...hehehehe...PODE TOMAR UM CAFÉ. Possuo uma mãquina relativamente boa(Core 2 Duo, 2MB Cache, 2Gb RAM), e demorou um tantinho....hhehehehehe
Pronto. Depois de muitos minutos, kernel compilado e empacotado. Veja dentro do /usr/src/, terá um pacote do tipo
kernel-image-<VERSAO_DO_KERNEL>-<APPEND_TO_VERSION>.Custom_i386.deb
Desempacote-o(no meu caso, o nome do pacote ficou assim)
Código:
# dkpg -i kernel-image-2.6.26.5-tunado-rt_9.00.Custom_i386.deb
Reinicie a máquina, e boote no Kernel novo: Pronto. You Have full power now!
Depois de reiniciar, bootar no Kernel novo se certificando de que tudo funciona(vai que vc desabilitou algo que não devia na compilação), digite no console:
Aparecerá algo do tipo SMP PREEMPT RT
resultado no meu notebook:
Código:
Linux unborn 2.6.26.3-rt3-real-tuned #1 SMP PREEMPT RT Thu Aug 28 12:23:52 BRT 2008 i686 GNU/Linux
Vc poderá pelo comando "ps faux", diferenciar os processos de Interrupção do kernel REAL TIME, pois os mesmos estão dentro de colchetes
Código:
# ps ax
PID TTY STAT TIME COMMAND
1 ? S 0:00 init [2]
2 ? S 0:00 [softirq-high/0]
3 ? S 0:00 [softirq-timer/0]
4 ? S 0:00 [softirq-net-tx/]
5 ? S 0:00 [softirq-net-rx/]
6 ? S 0:00 [softirq-block/0]
7 ? S 0:00 [softirq-tasklet]
8 ? S 0:00 [softirq-hrtreal]
9 ? S 0:00 [softirq-hrtmono]
10 ? S< 0:00 [desched/0]
11 ? S< 0:00 [events/0]
12 ? S< 0:00 [khelper]
13 ? S< 0:00 [kthread]
15 ? S< 0:00 [kblockd/0]
58 ? S 0:00 [pdflush]
59 ? S 0:00 [pdflush]
61 ? S< 0:00 [aio/0]
60 ? S 0:00 [kswapd0]
647 ? S< 0:00 [IRQ 7]
648 ? S< 0:00 [kseriod]
651 ? S< 0:00 [IRQ 12]
654 ? S< 0:00 [IRQ 6]
675 ? S< 0:09 [IRQ 14]
/ 687 ? S< 0:00 [kpsmoused]
689 ? S 0:00 [kjournald]
691 ? S< 0:00 [IRQ 1]
769 ? S<s 0:00 udevd --daemon
871 ? S< 0:00 [khubd]
882 ? S< 0:00 [IRQ 10]
2433 ? S< 0:00 [IRQ 11]
Agora, basta usar, e sentir a diferença de performance
Não esqueça de guardar o .deb com o Kernel que vc compilou em algum lugar seguro(como seu /home, que presumo eu, vc é um usuário prevenido, e tem o seu HOME em uma partição separada), para que vc não precise refazer todo o processo.
Pesquisarei como gerar .RPM para o kernel também, e postarei mais tarde aqui.
Referências:
http://www.dicas-l.com.br/dicas-l/20071023.php
http://www.dicas-l.com.br/dicas-l/20031121.php
http://rt.wiki.kernel.org/index.php/RT_PREEMPT_HOWTO
__________________________________________________ __________________________________________________ ______________________
Como dito anteriormente pelo nosso camarada Ironmaniaco. Após uma breve conversa sobre compilação de Kernel e busca de novos resultados, decidimos que seria uma boa se a área tivesse um tópico que tratasse deste assunto tão apreciado no mundo Open Source. Então decidimos dar manutenção especial a este tópico, contribuindo com dicas e informações importantes sobre o assunto. Lógico que todos estão convidados a nos ajudar, afinal estamos todos aqui para aprender.
@br4¢0§ :!:
by Douglas Almeida