Como compilar um Kernel?

Eu imagino que só o linux-image se trata do kernel em si. Mas eu sempre instalei todos mesmo com um sudo dpkg -i *.deb.

2 curtidas

Eu também entendo a mesma coisa pela descrição dos pacotes no Debian, teoricamente basta instalar linux-image (versão sem dbg) para poder apenas usar. No máximo, o usuário que não vai trabalhar com desenvolvimento do kernel vai querer instalar os headers também (para poder compilar drivers que não vêm com o kernel, como Nvidia, V4L2-Loopback, etc.).

Os outros eu entendo que são para desenvolvedores, o image com dbg seria um pouco mais lenta, mas mais fácil de um programador extrair informações no caso de bugs, e o libc-dev já diz no nome (compilar bibliotecas do C).

2 curtidas

Só o pacote de módulos que é o

linux-headers-5.11.8-custom-walefy_5.11.8-custom-walefy-1_amd64.deb

E o kernel em sí

linux-image-5.11.8-custom-walefy_5.11.8-custom-walefy-1_amd64.deb

Eu já cheguei a instalar o kernel sem o headers e funcionou mas quando fui usar o virtualbox que usava os módulos do headers o virtualbox não funcionou.

O Lubuntu vem com o linux-image instalado junto com o headers.

1 curtida

E ai aplico os parâmetros

"-O3 -march=native"

E removeu o “Generic-x86-64” do menuconfig em “Processor family” para deixar o kernel brutalmente otimizado?

1 curtida

eu fiz só de teste então só segui os comandos do segundo vídeo, queria continuar testando mas não tenho mais meu pc.

Alias, pode me explicar como eu faço isso?

Processador você altera com
make menuconfig

É uma listinha, vai ter processor family… aí já dá uma boa diferença indicar a família correta, saindo da genérica.

1 curtida

O que estes parâmetros fazem? Fiquei curioso e não vi respostas no google.

1 curtida

o meu processador é a carroça Pentium E5300

ele não aparece aqui:
image

Aparece sim, vai scrolando para cima.

Mas já adianto que não faz muita diferença.

esse é o problema, ele não vai além dos itens que está aparecendo.

Não é que não faz muita diferença, fazer faz mas o que é a nivel de kernel já é rapido o que demora para fazer as tarefas é a nivel de usuario.
Exemplo:

$ adm1@jca-h310:~$ time cat <<EOF
> Teste de time
> EOF
Teste de time

real    0m0,003s
user    0m0,003s
sys     0m0,000s

Esta vendo o kernel levou 0 milesegundos.
E o meu não é otimizado, quer dizer que se otimizar vai continuar sendo 0 milesegundos, vai mudar nada.
Nivel de kernel é o Ring 0.
É por isso que o driver de video do VirtualBox é no Ring 0 e o VirtualBox no sistema host também instala driver no Ring 0 para ganhar desempenho.

1 curtida

São parâmetros dos compiladores GCC ou CLang sei lá qual você vai usar.

$ man gcc

Mas esses parâmetros eu defino no makefile, não sei se funciona se aplicar no comando.

-march=native

Vai compilar especificamente para o CPU da maquina que esta compilando, mas é possível definir processadores diferente caso queira fazer compilação cruzada para outros CPU.

-O3

Vai aplicar otimização:

-O3 Otimiza ainda mais. -O3 ativa todas as otimizações especificadas por -O2 e também ativa os seguintes sinalizadores de otimização:

            -fgcse-after-reload -finline-functions -fipa-cp-clone -floop-interchange -floop-unroll-and-jam -fpeel-loops -fpredictive-commoning
            -fsplit-path -ftree-loop-distribuir-padrões -ftree-loop-distribuição -ftree-loop-vetorizar -ftree-parcial-pre -ftree-slp-vetorizar
            -funswitch-loops -fvect-cost-model -fversion-loops-for-strides 

Aplicar otimização -O3 pode gerar bugs por parte do compilador gerando bug que não esta no código fonte.
Sim existe bug em compilador que buga a compilação mas o GCC parece estável.
O parâmetro -O0 é o que compila exatamente como esta no código fonte sem otimização alguma geralmente utilizado para debug.

2 curtidas

Tenta fazer desse jeito que o @Capezotte falou:

Acho que isso você vai ter que alterar manualmente no arquivo .config.

1 curtida

Segundo a lista do link: choose-gcc-optimization.sh - aur.git - AUR Package Repositories
A 3ª opção vai da família Core2 ate a família Intel Xeon(Cooper Lake).
Eu só não sei se esse link do ARCH esta certo.
O meu CPU é da família 6th (Skylake).

adm1@jca-h310:~$ lscpu | grep "Família da CPU:"
Família da CPU:                  6

O link diz que você pode ver também por esse comando:

gcc -c -Q -march=native --help=target | grep march | awk '{print $2}' | head -1

Mas esse comando diz a família usando o GCC diferente do que eu passei que é o kernel que detecta.

Selecionando a CPU família no menuconfig você otimiza o código fonte, já o -O3 -march=native você otimiza a compilação.

É assim que faz para aplicar o -O3 -march=native:
Estava assim antes:

export KBUILD_USERCFLAGS := -Wall -Wmissing-prototypes -Wstrict-prototypes \
			      -O2 -fomit-frame-pointer -std=gnu89

Ai quando aplico a otimização eu troco o -O2 por -O3 e adiciono o -march=native para o GCC detectar a família da CPU fica assim:


Eu alterei em:
KBUILD_HOSTCXXFLAGS
Também mas é só porque ele esta usando o -O2 e eu não quero que usa a -O2 eu quero que use a -O3.
Você aplica nesta “CFLAGS” ai usa o buscador do editor para encontrar.

Agora que você já sabe tudo que precisa é só otimizar ^^.

Quando eu abre o mekefile agora olha só o que eu encontrei:
Agora por padrão o makefile vai usa o CLang e se não tiver sera usado o GCC vejam selecionado de azul.

2 curtidas

Built-in é mais rápido do que modules você pode colocar as coisas que você vai usar muito como built-in.
Exemplo no caso do KVM:


De preto a legenda, e o KVM esta selecionado para compilar em built-in.
Colocar KVM em built-in é bom para quem usa maquina virtual usando KVM.

1 curtida

Para complementar a discussão, temos um post no blog de um passo a passo:

https://diolinux.com.br/linux/compilar-um-kernel-linux-passo-a-passo.html

3 curtidas

Mas e de 3 anos atrás, ele pode estar desatualizado, não? :thinking:

1 curtida

A forma de compilar é a mesma coisa ate hoje ^^.

1 curtida

É um risco que se corre com tutoriais de fato, é bom estar atento a isso, mas não é o caso deste felizmente. :slight_smile:

O que muda, naturalmente, é a versão do Kernel.

5 curtidas