Como configurar um kernel na prática

Obter o código fonte

Você pode obter os fontes via ftp anônimo em ftp.kernel.org no diretório /pub/linux/kernel/vx.y, onde x.y é o número da versão (p/ ex., 2.4), e, conforme mencionado antes, aqueles terminados em dígitos ímpares são versões de desenvolvimento e podem ser instáveis. Os fontes são tipicamente distribuídos em arquivos chamados linux-x.y.z.tar.gz, onde x.y.z é o número de versão completo. Os sites também armazenam arquivos com o sufixo .bz2, que são comprimidos com bzip2, (estes arquivos são menores e levam menos tempo para serem transferidos, mas requerem que você tenha o bzip2 instalado).

É melhor usar ftp.xx.kernel.org, onde xx é o código de seu país; por exemplo, ftp.br.kernel.org para o Brasil, e ftp.ar.kernel.org para a Argentina.

Desempacotar os fontes

Efetue login como `root' ou execute o comando su para simular este usuário, mudando em seguida (cd) para o diretório /usr/src. Se você instalou os fontes do kernel durante a instalação do Linux (como a maioria faz), já haverá ali um sub-diretório chamado `linux', que contém toda a árvore de fontes do kernel corrente de seu sistema. Se você tiver espaço em disco e quiser ser conservador, não apague este sub-diretório. Uma boa idéia é descobrir qual a versão corrente que seu sistema está rodando e renomear o diretório apropriadamente. O comando `uname -r' mostra a versão corrente do kernel. Assim, se `uname -r' disser `1.0.9', você poderia renomear o sub-diretório com: `mv linux linux-1.0.9'. Se você for ligeiramente imprudente, simplesmente apague este diretório. Seja como for, certifique-se de que não haja nenhum sub-diretório de `/usr/src' com o nome de `linux' antes de desempacotar a árvore completa dos fontes.

Agora desempacote os fontes em /usr/src com `tar zxpvf linux-x.y.z.tar.gz'. Se você tiver um arquivo .tar, isto é, sem o .gz no final, use xpvf ao invés de zxpvf como opções para o comando tar.

Se o sufixo do arquivo for .tar.bz2 e você possuir o programa bzip2, use `bz2cat linux-x.y.z.tar.bz2 | tar xpvf -'. Caso isto não funcione, tente `bzip2 -dc linux-x.y.z.tar.bz2 | tar xpvf -' ou leia sobre o bzip2 em http://www.muraroa.demon.co.uk/.

Configurar o kernel

Nota: parte do texto a seguir é para enfatizar ou esclarecer alguma seção similar do arquivo README do Linus.

O comando `make config', emitido no diretório /usr/src/linux inicia um script de configuração que lhe faz diversas perguntas. Ele requer o uso de bash, portanto verifique se o bash é /bin/bash, /bin/sh ou & dollar;BASH.

Felizmente, há algumas alternativas bem mais agradáveis ao comando `make config' e você provavelmente irá considerá-las mais fáceis e mais confortáveis de usar. `make menuconfig' provavelmente é a mais comumente usada. Quem roda ``X windows'' e tem Tk instalado (`click-o-rama' - Nat) pode tentar `make xconfig'. `make menuconfig' é para quem tem (n)curses e prefere um menu em tela de texto. Mas ambas as interfaces de menu têm uma clara vantagem: se você se atrapalhar e fizer uma escolha errada durante a configuração, é fácil voltar atrás e corrigí-la.

As opções de configuração aparecerão hierarquicamente tanto com `make menuconfig' quanto com `make xconfig'.

Após escolher a interface que lhe for mais conveniente, você estará pronto para responder às perguntas, normalmente com `y' (yes/sim) ou `n' (no/não). Drivers de dispositivo tipicamente têm uma opção `m'. Esta significa ``module'' (módulo), o que quer dizer que o sistema o compilará, mas não diretamente no kernel, mas como um módulo carregável. Uma maneira mais irônica de descrever esta opção é ``maybe'' (talvez). Algumas das opções mais óbvias e não-críticas não serão descritas aqui; veja a seção ``Outras opções de configuração'' para breves descrições de algumas outras. Com `make menuconfig', a barra de espaço muda a seleção entre não compilar, compilar como módulo ou compilar diretamente no kernel.

Nas versões 2.0.x e posteriores, há uma opção `?', que mostra uma breve descrição do parâmetro de configuração. Esta informação é provavelmente a mais recente possível. A seguir há uma lista de algumas das mais importantes características, a qual hierarquia elas pertencem, e uma breve descrição.

Kernel math emulation (Processor type and features)

Se você não tiver um coprocessador matemático (isto é, se seu processador for um 386 sem 387 ou se for um 486SX), você deve responder `y' (sim) a esta pergunta, para ativar a emulação de coprocessador matemático. Por outro lado, se você tiver um coprocessador e ainda assim responder `y', não se preocupe -- o coprocessador ainda será utilizado e a emulação ignorada. Para qualquer máquina mais ou menos moderna (ou mesmo muitas das antigas), a resposta será `n'.

Enhanced (MFM/RLL) disk and IDE disk/cdrom support (Block Devices)

Você provavelmente irá precisar de suporte para isto. Este é o suporte do kernel para os discos rígidos mais comuns para PC, que quase todo mundo tem. Este driver não inclui suporte para drives SCSI; estes virão mais adiante na configuração.

A seguir virá a pergunta sobre o suporte a drivers ``old disk-only'' ou ``new IDE'' (``antigo, apenas para discos''; ou ``novo IDE''). Você deve escolher apenas um deles; a principal diferença é que o driver antigo suporta apenas dois discos em uma única interface, enquanto o novo suporta uma interface secundária e drives de CD-ROM IDE/ATAPI. O novo driver ocupa 4k a mais que o antigo e também é supostamente ``melhorado''; o que quer dizer que, além de conter um número diferente de bugs, ele deve melhorar o desempenho de seu disco, especialmente se você tem um hardware atual (do tipo EIDE ou Ultra-ATA, por exemplo).

Networking support (General Setup)

Normalmente, você só diria `y' (sim) se sua máquina estivesse em uma rede, tal como a Internet ou se você quisesse utilizar SLIP, PPP, etc para estabelecer um acesso discado à Internet. Entretanto, muitos pacotes (como o sistema X windows) precisam de suporte a redes mesmo se sua máquina não estiver numa rede verdadeira. Você deve responder `y' (sim). Mais adiante, em `Networking Options', haverá uma pergunta sobre suporte a redes TCP/IP (``TCP/IP networking''); novamente, você deve responder `y' se você não tiver certeza absoluta sobre o que responder.

System V IPC (General Setup)

Uma das melhores definições de IPC (Interprocess Communication/Comunicação Interprocessos) está no glossário do livro de Perl. Não causa surpresa que alguns programadores Perl utilizem IPC para fazer os processos falarem entre si, da mesma forma como como outros pacotes (notavelmente DOOM), de modo que não é uma boa idéia responder `n', a não ser que você saiba exatamente o que está fazendo.

Processor family (Processor type and features)

(em kernels mais antigos: use -m486 para otimizações específicas para 486)

Tradicionalmente, esta opção habilitava a compilação de algumas otimizações para um processador em particular; os kernels rodavam direitinho em outros chips, mas eram talvez um pouco maiores. Nos kernels mais novos, entretanto, isto não é mais verdade, de forma que você deve escolher o processador exato para o qual você está compilando este kernel. Um kernel para 386 funcionará em todas as máquinas suportadas pelo Linux.

SCSI support

Se você tiver dispositivos SCSI, responda `y' (sim). Haverá então outras perguntas sobre assuntos como suporte a CD-ROM, discos rígidos, e qual o tipo de interface SCSI você possui. Leia o SCSI-HOWTO para mais detalhes.

Network device support

Se você tiver uma placa de rede, ou se você quiser utilizar SLIP, PPP ou uma porta paralela para se conectar à Internet ou uma intranet, responda `y' (sim). O script de configuração perguntará qual tipo de placa você possui e qual o protocolo a ser usado.

Filesystems

O script de configuração lhe perguntará se você quer suportar os seguintes sistemas de arquivo (`filesystems'):

Standard (minix) - Novas distribuições não criam sistemas de arquivos minix, e poucas pessoas os utilizam hoje em dia, mas ainda pode ser uma boa idéia configurá-lo. Alguns programas de ``rescue disk'' (disco de recuperação) os usam, e ainda há muitos disquetes que podem ter sistemas de arquivos minix, já que este sistema de arquivos é mais eficiente para uso em disquetes que muitas das alternativas.

Second extended (ext2) - Este é o sistema de arquivos padrão do Linux. Você MUITO provavelmente quer um destes, e deve responder `y' (sim).

Ext3 journalling file system - extensões adicionadas ao ext2 para acrescentar um sistema de ``journaling'' (lista de mudanças), de modo que você não precise rodar `fsck' (``file system checker''/verificador de sistemas de arquivos) sobre seus sistemas de arquivos após um travamento. O ``journal'' mantém uma lista de todas as mudanças que estavam sendo feitas na hora do travamento e pode assegurar que seu sistema de arquivos está consistente sem a necessidade de uma verificação demorada. Fora a adição do journal, o sistema de arquivos ext3 é idêntico ao ext2, e pode-se até usar o driver de um com o outro, desde que o sistema de arquivos tenha sido propriamente desmontado (``cleanly unmounted''), ou que tenha-se corrigido eventuais erros de um travamento com o programa fsck (ou e2fsck, que é chamado pelo fsck).

DOS FAT fs support - se você quiser usar suas partições DOS ou Windows de seu disco rígido enquanto roda Linux, ou ser capaz de montar disquetes formatados para DOS/Windows, responda `y' (sim) a esta pergunta. Haverão perguntas sobre suporte a MS-DOS e VFAT. MS-DOS é o sistema de arquivos original da Microsoft. VFAT é o mesmo sistema de arquivos, mais as extensões acrescentadas para suportar nomes de arquivos com mais de oito caracteres, usadas a partir do Windows 95. Este último também suporta a leitura e gravação em disquetes e/ou partições MS-DOS simples, mas pode criar problemas com nomes de arquivos se você desejar ler um disco gravado por este driver em um sistema Windows anterior ao 95 ou DOS. Se você escolher a opção MS-DOS, será possível utilizar também as exensões UMSDOS, que permitem gravar um sistema de arquivos com os atributos de Unix (nomes maiores que 8 caracteres, permissões de acesso, dono, grupo, links simbólicos, etc). Note que mesmo com suporte a VFAT, você não será capaz de utilizar sistemas de arquivos NTFS, possivelmente presentes em sistemas com Windows NT/2000/XP. Para suportar NTFS, que não utiliza FATs (``file allocation table''/tabela de alocação de arquivos), você deve escolher a opção específica para NTFS.

Há ainda vários outros tipos de sistemas de arquivos, de outros sistemas operacionais, que são suportados pelo Linux.

/proc - (idéia da Bell Labs, acho). Não se cria um sistema de arquivos ``proc'' em disco; este sistema de arquivos é uma interface entre o kernel e os processos. Muitos listadores de processos (como o programa `ps') o utilizam. Uma hora dessas, experimente `cat /proc/meminfo' ou `cat /proc/devices'. Alguns shells (particularmente o rc) usam para fazer E/S o arquivo /proc/self/fd (em outros sistemas, pode ser conhecido pelo nome de /dev/fd, que não deve ser confundido com o driver de disquetes do Linux). Você quase certamente deve responder `y' a esta pergunta; muitas ferramentas importantes do Linux dependem disto.

NFS - Se sua máquina for conectada a uma rede local e você quiser utilizar sistemas de arquivos que residem em outras máquinas via NFS (``Network File System''/sistema de arquivos de rede), responda `y' (sim).

ISO9660 - É o sistema de arquivos da maioria dos CD-ROMs. Se você tem um drive de CD e gostaria de usá-lo no Linux, responda `y'.

devpts - Outro sistema de arquivos virtual (tal como ``/proc'') que serve para acessar terminais virtuais, juntamente com `/dev/ptmx'. Por exemplo, se você montar um sistema de arquivos devpts em `/dev/pts', o arquivo de dispositivo tradicionalmente conhecido como `/dev/ttyp2' passa a ser acessado como `/dev/pts/2'.

usbdevfs - Mais um sistema de arquivos virtual, este normalmente montado em ``/proc'', como `/proc/bus/usb'. Neste sistema de arquivos, existe um arquivo para cada dispositivo conectado no momento a algum barramento USB da máquina, com o nome de /proc/bus/usb/xxx/yyy, onde xxx é o número do barramento e yyy é o número do dispositivo. Estes arquivos são virtuais, não sendo armazenados em disco, e servem para que um processo fora do kernel possa falar diretamente a um dispositivo.

Mas eu não sei de quais sistemas de arquivos eu preciso!

Ok, digite `mount'. Você vai obter algo parecido com isto:

    blah# mount
	/dev/hda1 on / type ext2 (rw)
	none on /proc type proc (rw)
	/dev/hda3 on /usr type ext2 (rw)
	/dev/hda15 on /transfer type hfs (rw,uid=500)
	/dev/fd0 on /mnt/floppy type vfat (rw,uid=500)
	none on /proc/bus/usb type usbdevfs (rw)
	none on /dev/pts type devpts (rw,gid=5,mode=620)

Dê uma olhada em cada linha. A palavra seguinte a `type' é o tipo de sistema de arquivos. Neste exemplo, meus sistemas de arquivos / e /usr são do tipo ``second extended'', /transfer é do tipo ``hfs'' (um sistema ainda usado em Macintosh, mas que está sendo substituído por HFS+), estou usando /proc, usbdevfs, devpts, e há um disquete montado utilizando o sistema de arquivos ``vfat'' (argh).

Você também pode tentar `cat /proc/filesystems' se você tiver /proc instalado; você então verá uma lista dos sistemas de arquivos que o kernel atualimente instalado em sua máquina suporta.

A inclusão de suporte a sistemas de arquivos raramente utilizados e não-críticos podem inflar seu kernel desnecessariamente; veja a seção sobre módulos para saber como evitar isto, e a seção ``Armadilhas'' sobre porquê não é desejável ter-se um kernel grande demais.

Dispositivos de caracteres

Aqui você habilita os drivers para sua impressora (paralela ou USB), mouse de barramento (bus mouse), mouse PS/2 (vários notebooks utilizam o protocolo de mouse PS/2 para seus trackballs ou trackpads), alguns acionadores de fita e outros dispositivos orientados a caracteres. Responda `y' (sim) onde for apropriado.

Nota: gpm é um programa que permite o uso do mouse fora do sistema de janelas X windows para recortar e colar texto entre consoles virtuais. Mesmo não querendo utilizar o sistema X windows, você talvez queira habilitar suporte a mouse para utilizar o gpm ou programas similares.

Som

Se você sente um grande desejo de ouvir o latido do biff, responda `y', para poder contar dos detalhes de sua placa de som ao programa de configuração. (uma nota sobre configuração da placa de som: responda `n' quando perguntado sobre a instalação da versão completa do driver de sua placa e poupe alguma memória do kernel, escolhendo apenas os recursos que você considera necessários.

Nota do tradutor: biff é um programa que avisa assim que chegam novas mensagens de e-mail. Há rumores de que seu nome foi dado em homenagem ao cachorro do programador que o criou. Suas primeiras versões eram somente em texto, mas há hoje o xbiff, para X windows, além de outros similares.

Se você quer suporte da melhor qualidade à sua placa de som, dê uma olhada nos drivers gratuitos em http://www.linux.org.uk/OSS/ e pagos de Open Sound System em http://www.opensound.com/. Note que os drivers encontrados neste último site não são gratuitos, chegando alguns a custar US$60,00 à época em que este documento foi traduzido para o português.

Recentemente, o suporte para o sistema ALSA, uma alternativa gratuita ao OSS, tem crescido bastante, e espera-se que ao menos parte deste sistema esteja integrado às versões 2.5 do kernel. Isto deve-se não apenas ao fato de ser gratuita, mas também por ser compatível com a API existente. Em particular, o driver ALSA para placas GUS (Gravis Ultrasound) é (ou era, no começo de 1999) bem superior à versão OSS.

Outras opções de configuração

Nem todas as opções de configuração estão listadas aqui porquê elas mudam rápido demais ou são óbvias (por exemplo, 3Com 3C509 support para compilar o driver de dispositivo para esta placa de rede em particular. Há uma lista razoavelmente extensa de todas as opções (além de uma maneira de colocá-las no script Configure) num trabalho iniciado e mantido por Axel Boldt (boldt@math.ucsb.edu), que é o sistema de ajuda do configurador do kernel. Ele também está disponível como um grande arquivo em Documentation/Configure.help em sua árvore de fontes do kernel desde a versão 2.0. Infelizmente, ainda não está disponível em português.

Kernel hacking

Citando o README do Linus:

os detalhes de configuração ``kernel hacking'' normalmente resultam em um kernel maior ou mais lento (ou ambos), e podem até tornar o kernel menos estável ao configurar algumas rotinas para tentar ativamente fazer com que código ruim não funcione, permitindo que se encontre problemas no kernel (kmalloc()). Portanto, você provavelmente deverá responder `n' a esta pergunta quando estiver compilando um kernel de ``produção''.

E agora? (O arquivo Makefile)

Após terminar a configuração, uma mensagem dirá a você que seu kernel foi configurado, e que você deve ``checar o arquivo Makefile da raiz de sua árvore de fontes para configurações adicionais'', etc.

Portanto, revise o Makefile gerado. Você provavelmente não precisará alterá-lo, mas não custa nada dar uma olhada. Você também pode alterar algumas opções com o comando `rdev' após a criação ou instalação do novo kernel. Se você não entender patavinas do conteúdo do arquivo, confie no configurador e não se preocupe.