Capítulo 7. Compilando o kernel

Índice
7.1. Instalando o código-fonte do sistema
7.2. Modificando a disposição do teclado
7.3. Recompilando o kernel
7.4. Modificar o arquivo de configuração do kernel
7.5. Configurando o kernel
7.6. Gerar as dependências e recompilar
7.7. Se alguma coisa deu errado

A maior parte dos usuários do NetBSD termina, cedo ou tarde, por compilar um kernel personalizado. Desse modo, obtêm-se vários resultados apreciáveis.

7.1. Instalando o código-fonte do sistema

O programa de instalação (sysinst) não instala as fontes do kernel que devem, portanto, ser extraídas a mão. O arquivo que as contém é syssrc.tgz, que se encontra no diretório source/sets. O arquivo se descompacta com

# gzip -dc syssrc.tgz | (cd / ; tar xvf -)    

É preciso ter um pouco de paciência porque os arquivos a extrair são muitos e a operação dura alguns minutos. As fontes são extraídas no diretório /usr/src/sys. Para acessá-lo pode-se inclusive usar o link simbólico /sys. Portanto os comandos

# cd /usr/src/sys
# cd /sys
    

são equivalentes.

Terminada a instalação é possível remover as fontes relativas às arquiteturas que não nos interessam e poupar um pouco de espaço em disco (se isso for problema). Para fazer isso é necessário entrar no diretório /sys/arch e eliminar os subdiretórios desnecessários. Por exemplo, para a arquitetura i386 é suficiente conservar o diretório i386. Para outras versões de hardware do NetBSD é necessário conservar mais de um diretório de fontes, já que podem conter dependências.

Tudo está pronto para a criação de um kernel personalizado. Compilar um novo kernel não tem nada de difícil. As operações a executar (quatro ou cinco ao todo) são descritas no site do NetBSD.

7.2. Modificando a disposição do teclado

Uma vez instaladas as fontes do kernel, antes de recompilar convém efetuar uma pequena modificação no layout do teclado italiano contido no arquivo /sys/dev/pckbc/wskbdmap_mfii.c. Na disposição por default faltam alguns caracteres úteis para os programadores, em particular parênteses, haspas e til. Eu utilizo estes recursos.

static const keysym_t pckbd_keydesc_it[] = {
...
KC(8),   KS_7,          KS_slash,       KS_braceleft,
KC(9),   KS_8,          KS_parenleft,   KS_bracketleft,
KC(10),  KS_9,          KS_parenright,  KS_bracketright,
KC(11),  KS_0,          KS_equal,       KS_braceright,
KC(12),  KS_apostrophe, KS_question,    KS_grave,
KC(13),  KS_igrave,     KS_asciicircum, KS_asciitilde,
KC(26),  KS_egrave,     KS_eacute,      KS_bracketleft, KS_braceleft,
KC(27),  KS_plus,       KS_asterisk,    KS_bracketright,KS_braceright,
...    

Com o código precedente obtêm-se estas correspondências

7.3. Recompilando o kernel

A recompilação do kernel é descrita de modo simples e preciso no site do NetBSD. Assim, sugiro que se faça referência àquelas instruções. Todavia, a seguir reporto-me a algumas indicações apenas para dar uma idéia do procedimento.

Para poder recompilar o kernel é necessário ter instalado o set do compilador (comp.tgz). A recompilação do kernel consiste dos seguintes passos:

7.4. Modificar o arquivo de configuração do kernel

O arquivo de configuração do kernel define o tipo, o número e as características dos dispositivos que devem ser suportados pelo kernel. O arquivo encontra-se no diretório /sys/arch/i386/conf. Para criar um arquivo personalizado convém utilizar como base uma das configurações existentes. Para a maior parte das plataformas a configuração GENERIC é um bom ponto de partida: remeta-se aos exemplos presentes no diretório /sys/arch/<arch>/conf. Muitas opções estão descritas nos comentários dos arquivos de configuração. Muitas outras estão descritas na página de manual options(4).

# cd /sys/arch/i386/conf/
# cp GENERIC MYKERNEL
# vi MYKERNEL
    

Quando se modifica um arquivo de configuração do kernel, são realizados basicamente dois tipos de operação.

  1. desabilita-se o suporte para os periféricos não presentes no sistema e se habilita o suporte para aqueles que estão presentes (por exemplo, quem não tem dispositivos SCSI pode desabilitar o suporte para a interface SCSI no kernel).

  2. habilita-se e se desabilita o suporte das características suportadas pelo kernel (por exemplo, o suporte para a compatibilidade com o Linux, etc.).

  3. otimizam-se os parâmetros do kernel.

Para desabilitar uma linha do arquivo de configuração é necessário acrescentar um caracter "#" no início dessa mesma linha. Um bom ponto de partida para determinar o que se pode eliminar é o estudo do output do comando dmesg para cada linha do tipo

<XXX> at <YYY>    

É necessário que no arquivo de configuração estejam presentes tanto XXX como YYY. Antes de chegar a uma configuração mínima, um pouco de experimentação é necessária. Para um sistema de desktop, sem periféricos SCSI e placas PCMCIA, pode-se chegar a produzir um kernel de dimensões bem menores que o genérico.

Também é bom dar uma olhada nas opções presentes no arquivo de configuração, desabilitando aquelas que não nos interessam. Cada opção é acompanhada de uma breve descrição. Muitas opções estão descritas mais aprofundadamente em options(4). Antes de recompilar convém definir as opções para o teclado italiano e para o fuso horário. (Há necessidade de desenvolvimento da opção para o teclado br-abnt2 e us com acentos (nota do tradutor).)

options RTC_OFFSET=-60
...
options PCKBD_LAYOUT="KB_IT"    

Existe um script Perl que gera automaticamente um arquivo de configuração reduzido, analisando o output do dmesg. Esse script pode ser encontrado na URL http://www.feyrer.de/Misc/adjustkernel. Para poder executá-lo, naturalmente, é necessário ter instalado o Perl no sistema, o que é bem fácil de se fazer. Ver o Capítulo 8. A título de antecipação, um modo muito simples de instalar o Perl consiste em obtermos o pacote pré-compilado perl-5.00404.tgz e depois executar o comando:

# pkg_add perl-5.00404.tgz    

Neste ponto o Perl já está instalado, configurado e pronto para funcionar. Mais fácil que isso...

O script se executa com:

# cd /sys/arch/i386/conf
# perl adjustkernel GENERIC > MYKERNEL
    

Pessoalmente usei esse script apenas uma vez e deu ótimos resultados. Preste-se atenção, contudo, no fato de que o script configura as linhas relativas aos dispositivos e não as das opções.

7.5. Configurando o kernel

Depois de ter modificado à vontade o arquivo de configuração do kernel (que estaremos supondo chamar-se MYKERNEL), dar o comando

# config MYKERNEL    

Se o MYKERNEL não contém erros, o programa criará os arquivos necessários para poder compilar o kernel. Caso contrário deve-se voltar ao ponto anterior e corrigir os erros. O programa config analisa o arquivo de configuração indicado como parâmetro e cria os arquivos necessários para a compilação, habilitando os dispositivos selecionados.

7.6. Gerar as dependências e recompilar

Deslocar-se para o diretório criado pelo config no passo anterior, executar o comando make depend e, enfim, o comando make.

# cd ../compile/MYKERNEL
# make depend
# make
    

Na compilação podem-se verificar erros, caso em que ela própria se interrompe. Se isso ocorre, significa que o arquivo de configuração não foi modificado corretamente e é necessário corrigí-lo e repetir o procedimento. Um exemplo típico é o seguinte: a opção B, que exige a opção A, está ativa; a opção A, todavia, está comentada.

Uma compilação completa pode durar de poucos minutos a muitas horas, de acordo com o hardware utilizado. A tabela seguinte contém alguns exemplos:

Ao término da compilação será criado no diretório corrente o arquivo netbsd. O último passo a ser dado é a cópia do novo kernel em / (não sem antes renomear o kernel precedente).

# mv /netbsd /netbsd.old
# mv netbsd /
    

Como já dito, personalizando o kernel podêmo-lo reduzir consideravelmente de tamanho. Por exemplo, ao término das operações precedentes se tem:

-rwxr-xr-x  1 root  wheel  1342567 Nov 13 16:47 /netbsd
-rwxr-xr-x  1 root  wheel  3111739 Sep 27 01:20 /netbsd.old    

Neste ponto não resta senão reinicializar o sistema com o comando reboot.

7.7. Se alguma coisa deu errado

É sempre possível que, ao reinicialirmos, alguma coisa não corra como o esperado. No limite, o novo kernel poderia até mesmo não conseguir reinicializar. Neste caso não precisa se desesperar. Basta inicializar com o kernel precedente, que tinhamos providencialmente salvado, em modo monousuário, da seguinte maneira: