O kernel do Linux |
Configurar um kernel para o Linux deixou de ser um "bicho de 7 cabeças"
como era antigamente. Mesmo sendo uma operação demorada, e
exigir certo número de informações sobre o hardware da
máquina, é a melhor maneira de se otimizar o sistema para a sua
finalidade alvo. Apesar de existirem diferentes imagens do kernel para grande
parte das necessidades dos usuários nas distribuições
correntes, o administrador de sistemas deverá ter experiência na
compilação de um kernel mais "sintonizado" com a
aplicação que terá o sistema. Voce deve, entretanto,
evitar o uso de kernels com o segundo número ímpar, pois
são as versões de desenvolvedores. Se você não
pretende ajudar a melhorar o fonte do Linux depurando e reportando (ou
até consertando) os defeitos encontrados, fique fora das versões
de desenvolvimento. Procure os fontes da versão estável mais
recente. Por outro lado, não seja "maníaco" em manter sempre a
sua versão do kernel o mais atualizada possível. Existem sites
na internet rodando versões do Linux de vários anos
atrás. Elas são estáveis, apesar de não suportarem
cada ítem de hardware (discos, cdrom, etc) da atualidade, porque estes
ítens não existiam na época que ela foi criada.
Não se apavore se voce não sabe absolutamente nada de C. O
kernel é bastante fácil de compilar se voce seguir à
risca todos os passos do roteiro dado a seguir. Não há
possibilidade de voce destruir nada no seu sistema. Entretanto, como
precaução, voce poderá se sentir mais seguro tendo um
disquete com o boot atual em mãos, ou eixar no /etc/lilo.conf uma
opção de boot com o seu kernel antigo (renomei-o logo com
mv zImage zImage-old
, no diretório /boot
ou
na raiz).
Roteiro para a compilação de um kernel:
linux-xx.yy.zz,
onde
xx.yy.zz
é a versão do kernel. (verifique que
yy
é um número ímpar).
ln -sf linux-xx.yy.zz linux
) estabelecendo
linux como o diretório com os novos fontes. A opção
-f
para o comando link força a criação, caso
haja um link antigo.
cd /usr/src/linux
make config
(resposta linear, meio cansativo), ou melhor make menuconfig
(um pouco melhor, usando ncurses). Se voce prefere usar X11,
execute make xconfig
e uma aplicação tcl/tk
será compilada dinamicamente e voce terá então um
configurador mais flexível. Essencialmente a versão com ncurses
e tcl/tk são semelhantes, somente a apresentação é
diferente. (veja a figura abaixo)
make dep;make clean;make zImage
para criar as
dependências entre os arquivos-fonte, depois remover os objetos de
compilações anteriores, finalmente para criar a nova imagem do
kernel. Prepare-se para esperar (saia para fazer um lanche!), pois o kernel
é muito grande, a menos que voce tenha uma máquina especialmente
veloz. (No meu Penitum 150 MHz, leva cerca de meia hora).
make modules ; make modules_install
para
isso.
/usr/src/linux/arch/i386/boot/zImage
para a sua
localização final (pode ser na raiz "/" ou no diretório
/boot
). Apesar de ser determinado pela
distribuição, realmente fica ao seu gosto, pois o lilo é
quem o carregará.
/etc/lilo.conf
para apontar para a nova imagem, e
finalmente, execute lilo
. Entretanto, antes de executar esta
última fase, certifique-se que voce têm um disco de
emergência, ou mesmo uma outra imagem (quem sabe a atual, antes desta
compilação), para carregar, caso alguma coisa dê errado.
De qualquer forma, é boa prática ter um disquete com boot de
emergência, mesmo que voce não esteja compilando um kernel!
A figura abaixo mostra algumas janelas de make xconfig
, com a
janela principal, a janela que escolhe os filesystems (um pouco mais
longa que o que aparece na tela, rolável com o scrollbar
à direita), e uma das janelas de ajuda (help). Cada
botão na janela principal abre uma janela de configuração
diferente. Voce também pode navegar pelos botões next e
prev na janela com os radiobuttons de
configuração. Cada opção possível tem
à sua direita um botão help (ajuda) customizado. As
configurações são "lembradas" entre uma
execução e outra, portanto, voce não precisa decidir tudo
logo, ou pode tentar novamente, caso a sua primeira tentativa falhou. Anote
todas as suas opções para não se perder nas
inúmeras combinações...
O kernel do Linux é monolítico [31], ou seja, todas as funcões do kernel estão em um único "programa" que é carregado pelo loader (o nosso amigo LILO, por exemplo).
Iniciaremos pelos comandos que listam propriedades do kernel: lsmod lista os módulos existentes, o tamanho ocupado (em páginas de 4 Kbytes e os (outros) módulos que precisam do módulo presente. Eis um exemplo (do meu próprio sistema):
Module: #pages: Used by: sr_mod 4 0 sd_mod 3 0 sg 1 0 aha152x 6 0 scsi_mod 7 [sr_mod sd_mod sg aha152x] 4 sound 29 1 ppp 5 0 slhc 2 [ppp] 0 lp 2 0 |
Neste caso, scsi_mod é usado por 4 outros módulos, e slhc é usado pelo módulo ppp. A consequência disto é que voce não poderá retirar um módulo da memória sem antes retirar todos os que o referenciam. Por exemplo, para retirar ppp, eu precisaria primeiro retirar o slhc.
Cada módulo instala vários símbolos, que podem igualmente
serem listados, com o programa ksyms
. Ele mostra a
posição absoluta na memória da função, seu
nome e o móulo a que se refere. Veja um fragmento da
execução desse comando na minha máquina:
281ECE8 dma_ioctl [sound] 2828378 sound_timer_syncinterval [sound] 2813000 --- (20k) --- [ppp] 2816678 ppp_register_compressor [ppp] 28166D8 ppp_unregister_compressor [ppp] 2816884 ppp_crc16_table [ppp] 2810000 --- (8k) --- [slhc] 2810004 slhc_init [slhc] 28101E4 slhc_free [slhc] |
Os scripts em /etc/rc.d já se encarregam de instalar os módulos
existentes na maioria das distribuições Linux, mas provavelmente
voce irá quere um funcionamento diferente. Um kernel muito grande
consome muita memória, e de nada adianta voce ter instalado os drivers
para controle da placa de som, por exemplo, se em um dado momento voce
não irá usar nenhuma aplicação com som. Instalar
e remover módulos é bastante simples, dependendo alguns
comandos: insmod, depmod, modprobe e rmmod
. Essencialmente, voce
usará modprobe <módulo>
para instalar um
módulo, e rmmod <módulo>
para
removê-lo.
Um script em /etc/rc.d
deverá ter o comando depmod
-a
para criar uma lista de dependências entre os módulos,
que é armazenada em /lib/modules/<versão do
kernel>/modules.dep
(no meu caso
/lib/modules/2.0.30/modules.dep
). Se voce possui mais de uma
versão do kernel instalada, este comando no script permitirá
voce usar mais de um kernel ao mesmo tempo, carregando os módulos
apropriados para o kernel usado no momento.
O kernel estável atual não possui suporte para placas plug-n-play [32], mas existe um programa, isapnptools, que configura e permite usar esse tipo de placas com o linux, desde que o driver correspondente seja compilado como um módulo. Essa restrição se deve ao fato de que a plac precisa ser configurada antes do kernel tentar acessar os seus registradores.
O pacote isapnptools contém um programa (pnpdump
) que
detecta as palcas existentes e emite um arquivo texto que será usado na
configuração do dispositivo. Usado na forma pnpdump
-autoconfig
, a maioria das placas pode ser configurada automaticamente,
sem intervenção do operador. O arquivo produzido, isapnp.conf
será colocado no diretório /etc e está pronto. Agora,
voce deverá editar os seus scripts para inserir (em
rc.local
, por exemplo) a linha de comando:
isapnp /etc/isapnp.conf
e reboot a máquina. Finalmente tente carregar o(s) módulo(s) com
modprobe
normalmente. Se voce conhece razoavelmente a placa que
está sendo instalada, poderá tentar configurar manualmente para
os endereços, interrupção e canais de dma (acesso direto
à memória) desejados, mas leia antes a
documentação que acompanha o pacote isapnptools.
Fragmento do arquivo isapnp.conf
(retirados os
comentários, que são muitos!):
(READPORT 0x0273) (ISOLATE) (IDENTIFY *) (CONFIGURE OPT0931/-1 (LD 0 # ANSI string -->AUX0<-- #(ACT Y) )) (CONFIGURE OPT0931/-1 (LD 1 # ANSI string -->OPTi Audio 16<-- (IO 0 (BASE 0x0530)) (IO 1 (BASE 0x0388)) (IO 2 (BASE 0x0220)) (IO 3 (BASE 0x0e0e)) (INT 0 (IRQ 10 (MODE +E))) (DMA 0 (CHANNEL 1)) (DMA 1 (CHANNEL 0)) (ACT Y) )) |