Parte distintiva de distribuições de compilação (source-
based) é seu grande nível de
flexibilidade e configuração. Mesmo assim, qual seria o
sentido em usar uma distribuição de
compilação, se não configurarmos a mesma para otimizar
o uso do nosso hardware? Este
artigo é uma introdução sobre otimização para usuários
que pretendem usar esse tipo de
distribuição. O foco são as distribuições Funtoo e Gentoo.
AVISO: se você acha inútil, por qualquer motivo que seja,
usar distribuição de compilação, por
favor se exima de deixar um comentário do tipo "pra que
fazer isso?", pois este artigo,
evidentemente, não é voltado para você. Distribuições de
compilação, pelo menos para mim,
são divertidas, e isso é motivo suficiente para eu querer
usá-las. Admiro o
Linux pelo que de
fato ele é, um kernel, e não como distribuição, pois
distribuições envolvem tão somente gosto
pessoal, e não entro mais nesse tipo de discussão.
Obrigado pela atenção. Pode ser que
amanhã eu desista de usar Funtoo, e use Debian,
Slackware, ou Ubuntu. Mas hoje estou
curtindo a experiência de usar Funtoo e o artigo é para
quem também curte.
Reconhecendo o hardware
Três comandos básicos para reconhecermos o nosso
hardware:
Comando 1: lspci
Como o nome do comando deixa claro "list all PCI
devices", ou seja, "lista todos os dispositivos
PCI".
Não vou me aprofundar no tema, mas para quem não
sabe, PCI é um tipo de barramento onde
se conectam os periféricos à placa-mãe. Sim, executar o
comando "lspci" significa que você
está pedindo uma listagem de tudo o que está conectado
à placa-mãe pelo barramento PCI.
Exemplo de saída:
0:00.0 Host bridge: Intel Corporation Core Processor
DRAM Controller (rev 02)
00:02.0 VGA compatible controller: Intel Corporation Core
Processor Integrated Graphics
Controller (rev 02)
00:16.0 Communication controller: Intel Corporation 5
Series/3400 Series Chipset HECI
Controller (rev 06)
00:1a.0 USB controller: Intel Corporation 5 Series/3400
Series Chipset USB2 Enhanced Host
Controller (rev 05)
00:1b.0 Audio device: Intel Corporation 5 Series/3400
Series Chipset High Definition Audio (rev
05)
00:1c.0 PCI bridge: Intel Corporation 5 Series/3400 Series
Chipset PCI Express Root Port 1 (rev
05)
00:1c.1 PCI bridge: Intel Corporation 5 Series/3400 Series
Chipset PCI Express Root Port 2 (rev
05)
00:1c.2 PCI bridge: Intel Corporation 5 Series/3400 Series
Chipset PCI Express Root Port 3 (rev
05)
00:1c.4 PCI bridge: Intel Corporation 5 Series/3400 Series
Chipset PCI Express Root Port 5 (rev
05)
00:1d.0 USB controller: Intel Corporation 5 Series/3400
Series Chipset USB2 Enhanced Host
Controller (rev 05)
00:1e.0 PCI bridge: Intel Corporation 82801 Mobile PCI
Bridge (rev a5)
00:1f.0 ISA bridge: Intel Corporation Mobile 5 Series
Chipset LPC Interface Controller (rev 05)
00:1f.2 SATA controller: Intel Corporation 5 Series/3400
Series Chipset 6 port SATA AHCI
Controller (rev 05)
00:1f.3 SMBus: Intel Corporation 5 Series/3400 Series
Chipset SMBus Controller (rev 05)
00:1f.6 Signal processing controller: Intel Corporation 5
Series/3400 Series Chipset Thermal
Subsystem (rev 05)
12:00.0 Network controller: Broadcom Corporation
BCM4313 802.11bgn Wireless Network
Adapter (rev 01)
13:00.0 Ethernet controller: Qualcomm Atheros AR8152
v2.0 Fast Ethernet (rev c1)
ff:00.0 Host bridge: Intel Corporation Core Processor
QuickPath Architecture Generic Non-core
Registers (rev 02)
ff:00.1 Host bridge: Intel Corporation Core Processor
QuickPath Architecture System Address
Decoder (rev 02)
ff:02.0 Host bridge: Intel Corporation Core Processor QPI
Link 0 (rev 02)
ff:02.1 Host bridge: Intel Corporation Core Processor QPI
Physical 0 (rev 02)
ff:02.2 Host bridge: Intel Corporation Core Processor
Reserved (rev 02)
ff:02.3 Host bridge: Intel Corporation Core Processor
Reserved (rev 02)
Comando 2: cat
/proc/cpuinfo
Mostra informações sobre o processador.
Comando 3: cat
/proc/meminfo
Mostra informações sobre a memória.
Com isso dá para termos uma boa ideia da "matéria-
prima" necessária para realizar a
compilação adequada de um kernel. Os parâmetros "-v" ou
"-vv" do comando "lspci", mostram
informações mais detalhadas ainda.
Supondo que você esteja compilando o kernel, qual driver
de rede deve habilitar? Qual tipo de
processador? Qual driver de vídeo? É por isso que esses
comandos tem sua importância.
Porém, eu não sou perfeccionista e nem tenho
conhecimento para saber o que cada uma das
CENTENAS de opções do kernel significam na prática. No
entanto, a escolha da família do
processador é de suma importância. Outra opção
importante é o SMP (Symmetric multi-
processing), que deve ser habilitado para permitir o uso
dos vários processadores pelo kernel.
Como diz a descrição do mesmo:
"This enables support for systems with more than one
CPU. If you have a system with only one
CPU, say N. If you have a system with more than one CPU,
say Y."
Esta primeira parte sobre o kernel teve o objetivo apenas
de ilustrar um ponto que é
importante no quesito otimização, mas que não exige,
necessariamente, muito trabalho. Pelo
menos na distribuição Funtoo, criada para ser simples, há
uma série de opções de kerneis
disponíveis para download. O manual oficial de instalação,
inclusive, recomenda o uso do
kernel Debian universal, que embora leve um pouco de
tempo para ser instalado, deixa a
máquina pronta para uso. Depois disso, o usuário pode
enxugar o kernel aos poucos, refiná-lo,
desabilitando o que não precisa para o seu hardware. Não
é por nada que eu chamo Funtoo de
"distro bonsai", que exige tempo, dedicação e paciência
enquanto o usuário lentamente vai
dando uma aparada aqui, outra ali e arredondando o
sistema aos poucos.
Há uma dica de como instalar o kernel Debian no Funtoo:
CFLAGS e CXXFLAGS
O arquivo make.conf, do gerenciador Portage, exige a
definição dessas duas opções (CFLAGS e
CXXFLAGS). São variáveis usadas pelo "GNU Compiler
Collection" (GCC). O GCC É um
compilador, ou um sistema de compilação, criado pela tão
desprezada fundação GNU.
As pessoas esquecem que Linux é um sistema
operacional, cujo papel é fazer o seu hardware
funcionar, mas sem ferramentas e outros programas,
como o GCC, os aplicativos não
funcionam! Por isso muitos usuários insistem em usar o
termo
GNU/Linux, ao invés de apenas
Linux. Já que o sistema e suas ferramentas andam juntas.
Mas isso é outro assunto.
Tá, mas o que é um compilador? Bem rápido e impreciso,
mas suficiente por agora: é um
sistema que lê o código de um programa, escrito em
linguagem de programação, e traduz o
código para linguagem de máquina, para que o
computador possa entendê-lo.
CFLAGS diz respeito à linguagem C, e CXXFLAGS diz
respeito à linguagem C++.
O principal objetivo de configurar essas duas variáveis é
fazer o GCC trabalhar de forma mais
eficiente.
Quer saber a lista completa de opções para essas
variáveis? Então veja:
Agora que você viu a lista, me responda se existe algum
"guru" no universo GNU/Linux capaz
de usar essas opções SEM consultar um manual. Eu
duvido. É por isso que distribuições de
compilação como Gentoo são bem documentadas. Se
não, ninguém usa! Vamos ver o que o
manual do Gentoo diz sobre isso:
Se você viu, então ficou claro que a opção mais simples é
usar:
CFLAGS="-march=native -O2 -pipe"
CXXFLAGS="${CFLAGS}"
Pois assim, o tipo de processador será detectado
automaticamente ("-march=native"). A opção
"-O2" otimiza ainda mais (se quiser detalhes, veja
aqui), e "-pipe" acelera o
processo de compilação usando arquivos temporários.
O uso de variáveis é algo prático. Você não precisa repetir
os parâmetros de CFLAGS em
CXXFLAGS, basta usar "${CFLAGS}", que quer dizer o
mesmo.
Outra opção que pode ser usada é "-fomit-frame-pointer",
que reduz o tamanho do código, mas
torna mais difícil debugar a compilação. É o que diz aqui:
E aqui:
Obs.: fiz esse artigo com base em Funtoo, mas então por
que estou usando documentação de
Gentoo? Eu estou usando a distribuição Funtoo, mas
como Gentoo e Funtoo são distribuições
do mesmo criador, e Funtoo é baseado em Gentoo
(Gentoo melhorado), a documentação de
Gentoo quase toda serve para Funtoo. Como Funtoo é
uma distribuição mais nova, tem pouca
documentação oficial.
Próxima variável: CHOST
Essa variável especifica ao GCC em que tipo de máquina o
código será construído. Ela tem um
valor dividido em 4 campos: arquitetura, plataforma,
sistema operacional e biblioteca C.
Apenas o primeiro campo é obrigatório. Você pode definir
o CHOST apenas como, por exemplo:
x86_64. Fim.
Mas estamos falando de uma distribuição de compilação,
e não uma distribuição genérica. O
sentido de usar uma distribuição dessas é especificar
detalhes em busca de um melhor
"encaixe" entre sistema e hardware. O normal seria deixar
assim, por exemplo:
CHOST="x86_64-pc-linux-gnu"
Para ver outros parâmetros, veja:
FEATURES
Existe uma série de melhorias ou opções que podem ser
especificadas no make.conf, são as
FEATURES. Para vê-las consulte o manual do Portage.
Para ver as que estão ativadas, no momento, use o
comando:
# emerge --info | grep ^FEATURES=
Saída:
FEATURES="assume-digests binpkg-logs clean-logs
collision-protect config-protect-if-modified
distlocks ebuild-locks fail-clean fixlafiles merge-sync news
parallel-fetch preserve-libs protect-
owned sandbox sfperms strict unknown-features-warn
unmerge-logs unmerge-orphans
userfetch xattr"
Mas eu não especifiquei todas elas no arquivo make.conf.
Elas são determinadas, também,
pela escolha do "profile" (perfil) durante a configuração do
sistema. Para ver os profiles atuais
use o comando:
# eselect profile show
Saída:
Currently set profiles:
arch: gentoo:funtoo/1.0/linux-gnu/arch/x86-64bit
build: gentoo:funtoo/1.0/linux-gnu/build/current
flavor: gentoo:funtoo/1.0/linux-gnu/flavor/desktop
mix-ins: gentoo:funtoo/1.0/linux-gnu/mix-ins/xfce
Automatically enabled profiles:
mix-ins: gentoo:funtoo/1.0/linux-gnu/mix-ins/print
mix-ins: gentoo:funtoo/1.0/linux-gnu/mix-ins/X
mix-ins: gentoo:funtoo/1.0/linux-gnu/mix-ins/audio
mix-ins: gentoo:funtoo/1.0/linux-gnu/mix-ins/dvd
mix-ins: gentoo:funtoo/1.0/linux-gnu/mix-ins/media
mix-ins: gentoo:funtoo/1.0/linux-gnu/mix-ins/console-
extras
O uso de perfis facilita a configuração do sistema, pois
automatiza a escolha de FEATURES do
Portage e também de FLAGS que não estão explícitas no
arquivo make.conf.
As únicas FEATURES que eu especifiquei no make.conf
foram:
FEATURES="clean-logs parallel-fetch collision-protect fail-
clean"
- clean-logs - apaga os logs com mais de 7 dias, por
padrão.
- parallel-fetch - manda a saída de busca ou download
para background, enquanto compila.
- collision-protect - evita que um aplicativo não
substitua arquivos que não são seus.
- fail-clean - limpa arquivos temporários quando uma
compilação falha.
As outras foram selecionadas automaticamente com base
no meu perfil.
ACCEPT_KEYWORDS
Define o nível de estabilidade do sistema, pela arquitetura.
Por exemplo: se usar "amd64",
estará se referindo aos pacotes estáveis e se usar
"~amd64", os pacotes instáveis serão
aceitos.
Essa informação não tem necessariamente a ver com
otimização, mas como precisa da
definição do processador, torna-se interessante defini-la
de forma consciente.
MAKEOPTS
Se refere ao número de processos em paralelo que serão
divididos entre os núcleos do
processador durante a compilação. O manual oficial do
Funtoo recomenda definir o número de
processadores +1. Exemplo:
MAKEOPTS="-j5"
Para saber o número de núcleos do processador, use:
# grep "processor" /proc/cpuinfo | wc -l
Acrescente 1, e adicione à variável.
Conclusão
Com certeza isso não encerra o assunto em questão,
longe disso. Mas acredito que serviu
como uma introdução aos usuários que estão querendo
usar a distribuição Funtoo. Digo isso,
pois me coloco no lugar daqueles que apreciariam ter
alguma informação sobre o tema, um
incentivo, mas sentem dificuldade em encontrar. Como
sou usuário recente em Funtoo, peço
que por gentileza me corrijam caso tenha cometido algum
deslize. Os links que recomendo e
que usei para este artigo estão descritos no corpo do
texto.
Abraço.