Capítulo 12. O Kernel

Índice
Kernel e Arquivos Auxiliares
Atualizando o Kernel do Sistema
Módulos do Kernel

O kernel é o "coração" do sistema operacional, e é uma das partes do sistema que mais recebe atenção por parte dos desenvolvedores, evoluindo constantemente. A cada nova versão do kernel mais recursos são incorporados, defeitos corrigidos, e constantemente recursos existentes são aprimorados tornando-se mais eficientes. Logo o administrador do sistema, além de conhecer o kernel, deve procurar se manter informado sobre o seu desenvolvimento, e se necessário atualizar o kernel do sistema sob sua responsabilidade.

Este capítulo mostrará como atualizar o kernel de seu sistema, e apresentará um importante recurso do kernel: o uso de módulos.

Kernel e Arquivos Auxiliares

O kernel do sistema se localiza no diretório /boot, juntamente com outros arquivos necessários para a inicialização do sistema. Dentro deste diretório se destacam os seguintes arquivos.

vmlinuz

Este é o arquivo que contém a imagem do kernel propriamente dito, compactada, que será expandida diretamente na memória e executada. É possível encontrar esse arquivo na forma não compactada também, quando recebe o nome de vmlinux. Usualmente ao nome do arquivo se acrescenta um número indicado a versão do kernel, como por exemplo vmlinuz-2.4.20-26373cl, e utiliza-se o arquivo vmlinuz como um link simbólico para este.

System.map

Este arquivo contém uma lista de símbolos do kernel para serem utilizadas pelos módulos. De maneira análoga ao arquivo vmlinuz, ele é um link simbólico para o arquivo System.map-xxx, onde o xxx é a versão do kernel.

modules-info

O arquivo modules-info contém uma lista com os módulos que podem ser utilizados pelo kernel, bem como alguns detalhes destes. Novamente este arquivo segue a mesma convenção dos outros dois arquivos listados, ou seja, usualmente ele é um link simbólico para o arquivo contendo a versão correta do kernel.

initrd-x.x.x.img

Este arquivo contém uma imagem a ser expandida na memória juntamente com o kernel contendo os módulos necessários para que o kernel possa montar o dispositivo e o sistema de arquivos da partição "root", e a partir daí prosseguir a carga do sistema. Este arquivo é específico para cada versão do kernel e deve ser gerado pelo administrador com o comando mkinitrd.

Diretório grub

Dentro deste diretório estão os arquivos do gerenciador de inicialização Grub. Veja mais sobre o Grub no Capítulo 10.

memtest86

Este arquivo contém um pequeno aplicativo que funciona independente do resto do sistema e pode ser utilizado para se testar os pentes de memória do sistema.

Se o sistema utiliza o gerenciador de inicialização LILO, os seus arquivos também se localizarão no diretório /boot. Veja mais sobre o LILO no Capítulo 10.

Nota: É possível manter várias versões do kernel no sistema e selecionar qual será utilizado durante o processo de carga do sistema. É uma boa prática manter a versão mais antiga ao se atualizar o kernel, pois se algo não funcionar como deveria é possível voltar facilmente à versão anterior.

Atualizando o Kernel do Sistema

O administrador pode atualizar o kernel de duas formas: baixando e compilando a fonte do kernel ou através da instalação de pacotes RPM da distribuição. A primeira forma de atualização é recomendada apenas para administradores experientes e é consideravelmente mais complexa, portanto não será explicada aqui[1]. A atualização através de pacotes RPM usualmente envolve três passos: obter os pacotes, instalá-los e configurar o gerenciador de inicialização para carregar o novo kernel durante a inicialização.

A obtenção do pacote RPM e sua instalação pode ser efetuada facilmente utilizando o Synaptic ou ainda alguma das outras formas descritas no Capítulo 9 . Será necessário escolher qual kernel melhor se adapta às suas necessidades. Os pacotes com nome kernel-smp-x.x.x se destinam à máquinas multiprocessadas, pacotes com o o nome kernel-enterprise-x.x.x se destinam à máquinas servidoras com necessidades especiais (suporte à sistemas de arquivos muito grandes, quantidade de memória RAM até 4GB) e os pacotes com nome kernel-x.x.x onde x.x.x é a versão, contém um kernel para uso geral[2]. Observe também a arquitetura para o qual o kernel foi compilado. Pacotes contendo "i386" podem ser utilizados em qualquer computador PC, os pacotes contendo "i586" se destinam a computadores pentium ou com processadores AMD K6-2 e pacotes contendo "i686" devem ser utilizados em computadores com processadores Pentium II e superiores.

Após a instalação do pacote RPM será necessário gerar um arquivo initrd para o kernel instalado. Durante o processo de boot o kernel pode não ter todos os módulos necessários para se acessar os dispositivos contendo o sistema de arquivos raiz do sistema, assim juntamente com o kernel o gerenciador de inicialização carrega na memória do computador o arquivo initrd contendo todos os módulos que o kernel precisa para continuar a carga do sistema. Como o arquivo initrd contém os módulos para uma versão apenas de kernel, é necessário que se tenha um arquivo para cada kernel instalado no sistema. Gerar um arquivo initrd é bastante simples. Abra um terminal, vá para o diretório /boot e utilize o comando mkinitrd para gerar o arquivo, como no exemplo abaixo:

# mkinitrd  initrd-x.x.x.img  x.x.x

Onde o x.x.x é a versão do kernel. Após a geração deste arquivo basta apenas configurar o gerenciador de inicialização de sua escolha para carregar o novo kernel durante a inicialização do sistema. Diferente de outros sistemas operacionais, a atualização do kernel é a única operação de atualização do sistema onde é necessário reiniciar o computador. Consulte o Capítulo 10 para obter mais informações sobre a configuração do gerenciador de inicialização.

Módulos do Kernel

O uso de módulos pelo kernel é um recurso poderoso e prático, que permite que novas funcionalidades sejam acrescentadas ao kernel, sem que seja necessário recompilá-lo.

Entendendo os Módulos do Kernel

Como visto anteriormente no Capítulo 12, é o kernel que interage diretamente com o hardware e com o sistema de arquivos, e para que ele suporte este ou aquele dispositivo é necessário que, ou o kernel tenha sido compilado com o código que suporte este dispositivo, ou se use um módulo, que é um componente do kernel que pode ser vinculado ou desvinculado dinamicamente ao kernel após o boot sem que haja a necessidade de recompilar o kernel.

O uso de módulos permite que se mantenha um kernel pequeno, mas que se tenha a funcionalidade necessária quando for preciso. Por exemplo, suponha que eventualmente seja necessário acessar arquivos em uma partição do tipo FAT32. Ao invés de compilar um kernel com suporte a este sistema de arquivos, basta carregar o módulo apropriado no kernel.

De certa forma, os módulos são o equivalente do Linux aos drivers de outros sistemas operacionais, com a vantagem de que não é necessário reiniciar o sistema cada vez que um módulo é adicionando ou retirado do kernel.

Localizando os módulos no Linux

O kernel do Linux já vem com diversos módulos para os mais diversos periféricos, sistemas de arquivos e protocolos de rede. Os módulos são arquivos com extensão ".o" e se localizam no diretório /lib/modules/2.xx.xx/, onde "xx.xx" é a versão do kernel em uso. O diretório onde se encontram os módulos está divido em subdiretórios de acordo com os tipos de módulos, como por exemplo, net para módulos de rede, fs para os módulos de sistemas de arquivos, e assim por diante.

Os módulos referentes às placas de vídeo não se encontram no diretório acima. Como visto na seção sobre o XFree, o ambiente gráfico não é responsabilidade do kernel, logo, o suporte às placas gráficas é feito pelo XFree. O kernel apenas provê suporte ao barramentos AGP e PCI.

Instalando Módulos

A instalação de um módulo pode ser efetuada de várias maneiras, dependendo do tipo do módulo a ser instalado. Usualmente os passos necessários são:

  1. copiar o arquivo do módulo para o diretório apropriado.

  2. executar o comando depmod -a, para que o sistema verifique se este módulo depende de algum outro.

  3. carregar o módulo no kernel.

  4. incluir a carga do módulo nos arquivos de inicialização do sistema.

Caso o kernel utilizado não possua o módulo necessário à função que se deseja adicionar será necessário copiar o arquivo ".o" requisitado (fornecido pelo fabricante de um dispositivo, por exemplo) para o subdiretório apropriado dentro do diretório /lib/modules/2.xx.xx/.

Ao se adicionar um novo módulo ao diretório de módulos, é necessário executar o comando depmod para que o sistema atualize a sua lista de módulos, e a dependências desses módulos.

Para carregar o módulo no kernel será necessário utilizar o comando insmod que será visto em mais detalhes na seção Utilizando e Configurando Módulos.

Caso o módulo não seja carregado automaticamente ao se iniciar o sistema será necessário incluir o comando de carga do módulo em um arquivo de inicialização. Módulos de placa de rede, por exemplo, são automaticamente carregados pelo Linux quando configurado pelo Linuxconf. O comando para carga automática do módulo pode ser colocado no arquivo /etc/rc.d/rc.local.

Utilizando e Configurando Módulos

Os comandos utilizados para listar, carregar ou remover os módulos carregados no kernel são lsmod, insmod e rmmod respectivamente.

O comando lsmod lista os módulos atualmente carregados no kernel, mostrando também informações como o tamanho do módulo e utilização.

Para carregar um módulo na memória basta usar o comando insmod como no exemplo abaixo:

# insmod ipx.o

# lsmod
Module                  Size  Used by
ipx                    12736   0  (unused)

Alguns módulos exigem parâmetros adicionais, que devem ser passados na linha de comando de inserção do módulo. Uma placa de rede, por exemplo, pode precisar da IRQ na qual está instalada, caso o Linux não consiga detectá-la automaticamente. Cada módulo pode exigir parâmetros diferentes, mas de forma geral o formato para a passagem de parâmetros é:

insmod módulo parâmetro=valor

Em alguns casos, um módulo pode precisar que algum outro módulo esteja carregado. Nesse caso pode ser bastante útil o uso do comando modprobe, que funciona de maneira semelhante ao comando insmod, mas é capaz de resolver problemas de dependências de outros módulos automaticamente.

Caso não se deseje mais utilizar um determinado módulo, pode-se descarregá-lo liberando assim a memória que ele está ocupando. Para descarregar um módulo basta usar o comando rmmod, como no exemplo abaixo:

# rmmod ipx

Lista de módulos do Conectiva Linux

O Conectiva Linux traz uma grande quantidade de módulos, logo não é possível aqui descrever cada um deles. No entanto é possível ter uma breve descrição de cada módulo usando-se o comando modinfo -d. É possível também obter a lista de parâmetros aceitos pelo módulo usando-se o parâmetro -p. Exemplo:

# modinfo -d sis900.o  
SiS 900 PCI Fast Ethernet driver

# modinfo -p sis900.o 
multicast_filter_limit int
max_interrupt_work int
debug int

No exemplo acima, ao lado de cada parâmetro aceito pelo módulo, está o tipo de valor esperado.

O diretório que contém os módulos está dividido em subdiretórios, de acordo com o tipo de módulo:

kernel/drivers/block

Módulos para dispositivos de bloco como RAID e drives de fita.

kernel/fs

Módulos para acesso à sistemas de arquivos, como o fat, ext2 e ext3.

misc

"Miscelânea" de módulos, que não se encaixaram em nenhuma das categorias predefinidas. Por exemplo, drivers alternativos de som.

kernel/drivers/pcmcia

Módulos para dispositivos PCMCIA, usados principalmente em notebooks.

kernel/drivers/usb

Módulos para dispositivos do tipo USB, como teclados, mouses e joysticks.

kernel/drivers/cdrom

Módulos para dispositivos de CD-ROM não compatíveis com o padrão IDE.

kernel/net/ipv4

Módulos de funções de pacotes IP versão 4, como mascaramento de IP.

kernel/drivers/net

Módulos de dispositivos de rede, como placas de redes, suporte a PPP e SLIP.

kernel/drivers/scsi

Módulos para dispositivos SCSI, como placas controladoras.

kernel/drivers/video

Módulos especiais requeridos por algumas placas de captura de vídeo.

Notas

[1]

Para saber mais sobre essa forma de atualização do kernel, consulte o documento Como Fazer e o site do Kernel (http://www.kernel.org).

[2]

Os pacotes com nome kernel-pcmcia não contém o kernel, mas sim utilitários de suporte a PCMCIA e podem ser úteis para sistemas instalados em notebooks