# make menuconfig # Entra nas configurações do kernel
Para entrar nas opções, dê
Enter e para alterar de "M" para "*", e vice-versa, é só pressionar a barra de espaços.
Para sair de uma opção, dê
Esc duas vezes seguidas.
Vá em: Processor type and features → Processor Family (Generic-x86-64)
...e marque (barra de espaços) a opção que corresponde ao processador da sua máquina. No meu caso, mesmo sendo um processador Intel Pentium Dual E2140, marquei Core 2/newer Xeon, por ele ter dois núcleos (Cores).
Mais abaixo, vá em: "Preemption Model (Voluntary Kernel Preemption (Desktop))" e se for Desktop, deixe marcada a opção Desktop. Se for servidor, marque "No Forced Preemption (Server)".
No Dual-Core ficou "Desktop", e no Core 2 Quad, ficou "Server".
Mais abaixo, vá em "Timer frequency". Se a sua instalação for do tipo servidor, marque a opção "100 HZ" (isso melhorará o tempo de resposta do servidor para as requisições). Para Desktop, deixe "250 HZ".
No Dual-Core ficou "250 HZ", no Core 2 Quad, ficou "100 HZ".
Retorne ao menu principal:
Esc +
Esc
Caso seja um servidor, é aconselhável marcar as opções abaixo. Caso seja Desktop, você pode pular para "File Systems".
Vá em: Networking support → Networking options → Network packet filtering framework (netfilter) → IP: Netfilter Configuration
Verifique se "IPv4 connection tracking support (required for NAT)" está marcada.
Mais abaixo, marque a opção: "IPv4 NAT (NEW)". E as seguintes opções abaixo aparecerão já marcadas:
MASQUERADE target support
NETMAP target support
REDIRECT target support
Tecle:
Esc +
Esc
Vá em IPv6: "Netfilter Configuration" e marque:
IPv6 NAT
MASQUERADE
NPT
Tecle:
Esc +
Esc
Volte ao menu principal:
Esc +
Esc,
Esc +
Esc e
Esc +
Esc
Vá em "File Systems", marque os sistemas de arquivos utilizados com "*". No meu caso, ext4 (todas as partições) para o Desktop e ext4 (/boot) com btrfs (demais partições) para o servidor.
* Dica: para ext4, marque a primeira opção (The Extended 4 (ext4) filesystem) com "*", e deixe somente as duas seguintes marcadas. Ficarão 3 opções marcadas.
Para btrfs, ficarão três opções também:
Btrfs filesystem support;
Btrfs POSIX Access Control Lists e
Btrfs will run sanity tests upon loading.
Mais abaixo, vá em: "Network File Systems"
E se for servidor, coloque um "*" na opção "NFS server support".
Volte:
Esc +
Esc
Logo abaixo, vá em "Native language support" e marque com "*", as opções:
Codepage 860 (Portuguese)
ASCII (United...)
NLS 8859-1 (Latin 1, ...)
NLS UTF-8
Retorne ao menu principal dando
EXIT. Após o último
EXIT, aparecerá a janela "Do you wish...", deixe como: "Yes" e dê
Enter.
Execute:
# ls -a
E veja se o arquivo ".config" foi gravado. Se não, repita a operação.
Agora, vamos alterar os arquivos necessários para otimizar a compilação de acordo com o processador da máquina:
# cc -march=native -E -v - &1 | grep cc1
Veja a figura 1, com a saída desse comando.
Vamos alterar os arquivos (segue uma lista completa dos arquivos com as linhas a serem alteradas). É necessário alterar somente 5 arquivos (os 5 primeiros abaixo), porém, se você é paranoico e obcecado, altere os outros 10 também:
* Importante: em todos os arquivos, altere as opções "march" para "-march=native", as opções "mcpu" para "-mcpu=native" e as opções "mtune" para "mtune=nome_do_processador". Nesta última opção, "mtune", coloque o que aparecer na saída do comando
cc -march=native -E -v - &1 | grep cc1. No caso do Core 2 Quad e do Dual-Core, ficou "-mtune=core2". No caso dos Pentium 4, ficou "-mtune=nocona".
Se a versão do
GCC for 4.5.1, inclusive, para baixo, deixe "-mtune=generic". Como anteriormente instalamos e atualizamos a versão do GCC (o GCC, o G++ e o MAKE, entre outros, estão no pacotão "build-essential"), não precisa se preocupar muito com isso. A não ser que seu sistema e seu hardware sejam bem antigos.
Lista de arquivos:
- /usr/src/Linux-3.10.7/Makefile - linha 244;
- /usr/src/Linux-3.10.7/arch/x86/boot/compressed/Makefile - linha 12;
- /usr/src/Linux-3.10.7/arch/x86/boot/Makefile - linha 59;
- /usr/src/Linux-3.10.7/arch/x86/Makefile - linhas 64, 65, 68, 69, 70 e 71;
- /usr/src/Linux-3.10.7/arch/x86/Makefile_32.cpu - linhas 5, 13 à 22, 25 à 36, 39, 42, 43, 46 e 69.
Neste último arquivo acima, atenção especial na linha 46 "cflags-$(CONFIG_X86_GENERIC += $(call tune,generic,$(call tune,i686))", que deverá ficar assim:
cflags-$(CONFIG_X86_GENERIC += $(call tune,core2,$(call tune,core2))
Este arquivo de número 5, é o que supostamente otimizará a compilação para o processador da máquina.
A partir daqui, continue se quiser extrair mais, mas preste atenção para alterar os arquivos da forma certa.
O único arquivo que dará mensagem em caso de erro, é o "/usr/src/Linux-3.10.7/Makefile", então, faça com calma, cuidado e divirta-se.
- /usr/src/Linux-3.10.7/arch/alpha/Makefile - linhas 18 à 24 e 29;
- /usr/src/Linux-3.10.7/arch/arm/Makefile - linhas 62, 63, 67, 69 à 72 e 75 à 92;
- /usr/src/Linux-3.10.7/arch/avr32/Makefile - linha 19;
- /usr/src/Linux-3.10.7/arch/frv/Makefile - linhas 58, 59, 62, 63, 65 e 66;
- /usr/src/Linux-3.10.7/arch/m68k/Makefile - linhas 44 à 59;
- /usr/src/Linux-3.10.7/arch/mips/Makefile - linha 125 à 159;
- /usr/src/Linux-3.10.7/arch/parisc/Makefile - linhas 69 à 73;
- /usr/src/Linux-3.10.7/arch/powerpc/Makefile - linhas 91 à 96, 98 e 132;
- /usr/src/Linux-3.10.7/arch/s390/Makefile - linhas 38 à 44;
- /usr/src/Linux-3.10.7/arch/sparc/Makefile - linhas 27, 40, 43 e 44.
Alterando
Estando dentro de "/usr/src/Linux-3.10.7", vamos alterar:
# vim Makefile # Usei o Vim, use o teu editor de texto preferido
Seguem imagens com antes e depois da alteração.
Não vou colocar imagens de todos os arquivos, mas somente alguns para ilustração e entendimento, pois uma imagem vale mais do que mil palavras.
Figura 2 - /usr/src/Linux-3.10.7/Makefile antes
Figura 3 - /usr/src/Linux-3.10.7/Makefile depois
Figura 4 - /usr/src/Linux-3.10.7/arch/x86/Makefile_32.cpu antes
Figura 5 - /usr/src/Linux-3.10.7/arch/x86/Makefile_32.cpu depois
Terminadas as alterações nos arquivos "Makefile", vamos exportar algumas variáveis que parecem interessantes. Antes de executar os três comandos abaixo, leia o que significa cada opção, porém, a exportação dessas variáveis é opcional e não fará muita diferença.
# export CONCURRENCY_LEVEL=2 # Aqui usei o valor 2, pois é o número de cores (núcleos) do processador. No caso do Core 2 Quad, usei o valor 4; veja o número de núcleos com o comando cat /proc/cpuinfo | less
# export CFLAGS="-march=native -O2 -pipe"
# export CXXFLAGS="$CFLAGS"
A partir de agora, se você fechar o terminal, ao abri-lo de novo, deverá executar os três comandos acima novamente, pois as alterações serão perdidas.
Explicando:
- CONCURRENCY_LEVEL :: setar esta variável com o número de núcleos de sua CPU, ele usará todos eles ao compilar o kernel.
- CFLAGS :: são flags de compilação, principalmente para a otimização dos binários. As versões mais recentes do GCC, podem detectar automaticamente esses recursos, porém, definindo-os como "native" será adequado na maioria dos casos. A opção "-march" permite que o GCC compile o código tirando proveito de qualquer característica de sua CPU. As opções "-02" e "-pipe", são outras flags de otimização. Há mais flags, mas estas são as "genéricas" utilizadas, que oferecem uma suposta quantidade de benefícios.
- CXXFLAGS :: são opções extras para o GCC, normalmente você pode configurá-las para CFLAGS.