Compilando o Kernel Linux: Debian

Se você apoia nosso site, desative o AdBlock quando visitá-lo, inclusive no Mobile!
Os anúncios são poucos e não invasivos. Se quiser contribuir com nosso trabalho, clique em qualquer banner do Google, de sua preferência! Qualquer banner, exceto dos Parceiros.
Seja um anunciante, anuncie conosco!
Mais detalhes clicando aqui.

O tutorial definitivo para o usuário comum que usa alguma distribuição baseada no Debian, como o Ubuntu, PepperMint, LinuxMint, ZorinOS e muitos outros!

| Se você apoia nosso site, desative o AdBlock quando visitá-lo, inclusive em Mobile!
Os anúncios são poucos e não invasivos. Se quiser contribuir com nosso trabalho, clique em qualquer banner de sua preferência, exceto dos Parceiros. 
Mais detalhes clicando aqui.

Introdução

Tutorial voltado para sistemas baseados em Debian, como o Debian, Ubuntu e seus sabores, LinuxMint, entre outros, por conta dos comandos de instalação dos pacotes. Além disso, o kernel será gerado em formato .deb!
Pretendo fazer um tutorial voltado para aqueles que usam Fedora, OpenSUSE e outras distribuições Linux.

Para os mais corajosos e/ou curiosos, chega num momento da vida em que a pessoa busca uma emoção a mais (ou resolver algum problema). E é ai que surge o momento de se compilar um kernel! Os principais objetivos de se compilar o kernel linux são:

  • Habilitar funções experimentais e que não estão ativas por padrão, como drivers e módulos específicos de alguns hardwares.
  • Habilitar o suporte a hardwares recém lançados que estejam em fase experimental, como alguns da linha Ryzen e AMD A4
  • Debuggar o kernel (procurar erros) para ajudar a reportar problemas/bugs.
  • Ou simplesmente aprender como um kernel funciona e ter um kernel customizado com seu nome, um kernel para chamar de seu.

Compilar o seu próprio kernel é sinal de ter uma margem maior para compatibilidade já que, quando compilamos algo no Linux, ele passa a ter maior compatibilidade/solidez, como o Gentoo já o faz.
Um programa/sistema/kernel compilado utiliza máxima compatibilidade com seu hardware do que um código genérico pré-compilado, isso reflete principalmente em estabilidade mas também pode render desempenho.

Pré-Requesitos

  • Tenha 15Gb livres na pasta raíz ( / )
    A compilação gera aprox. 13Gb. Quando estiver pronta, você terá um arquivo .deb de uns 50 Mb para instalar o kernel que, uma vez instalado, consumirá aprox. 200Mb.
  • Instale os seguintes pacotes se você é usuário de sistemas baseados em Debian e/ou Ubuntu e seus sabores: [Tudo em 1 linha]
$ sudo apt-get install libncurses5-dev gcc make git exuberant-ctags 
bc libssl-dev dkms kernel-package build-essential

OBS: O pacote kernel-package é o mais importante, por ser o responsável por concluir a compilação. Ele possui aproximadamente 800Mb. Os 15Gb que pedi que fossem reservados geram uma folga de ~1.5Gb para evitar erros na compilação por falta de espaço.

Baixe o kernel mais recente clicando em “Latest Stable Kernel” no site oficial: https://kernel.org/
Até a data deste post, é a versão 4.17.2, para caso queira a mais recente.
Ou baixe a versão que você desejar, mais abaixo no site, recomendo a LongTerm (4.14.51) para o usuário comum que não quer correr o risco de ver algum bug e deseja estabilidade.

Lembrando que para máquinas mais antigas, como as que possuem Core 2 Duo, o kernel ideal é o da linha stable 4.4.X. Já se sua CPU é alguma da linha Core i3, i5 ou i7, você pode usar o kernel 4.14.51 do nosso exemplo. 

Ao clicar em download, o kernel será baixado em .tar.xz.
Você pode extrair o conteudo desse arquivo com o comando do terminal:

$ tar -xvJf NOME-DO-ARQUIVO.tar.xz

OU, com o Gerenciador de Pacotes Engrampa (do Ubuntu MATE, mas disponivel tambem para outras distros), você pode abri-lo e extraí-lo com uma interface mais amigável, parecida com a do WinRAR.
Só abrir e clicar em “extrair em”.
Mas abra-o como Administrador, porque deve ser extraído na pasta /usr/src.

Essa é a pasta padrão para sources do sistema. Não mude-a para evitar problemas entre diretórios no momento da compilação.

Compilando

Agora que você ja baixou e extraiu seu kernel .tar.xz pra pasta /usr/src, é hora de compilar!
Primeiro abra o terminal e defina o diretorio raiz da pasta extraida do kernel:
$ cd /usr/src/seu-kernel-baixado-e-extraido
Exemplo:

$ cd /usr/src/linux-4.11.8

Salve seus trabalhos e feche todos os seus programas.
A compilação do kernel exige 100% de uso do computador e pode demorar em media 1 hora. (Dependendo da compilação e das configurações da máquina, vai 1 dia!
Aqui, no meu notebook com i5 de 2.2Ghz a compilação demorou umas 1h30.
Ja no Core i7 foi evidentemente mais rapido, 1h.

Quando estiver tudo pronto, execute o seguinte: [Tudo em 1 linha]

$ sudo make-kpkg --initrd --append-to-version "-nome-customizado" 
--revision 1 -j 2 kernel_image

Explicando:

  • make-kpkg: é o comando instalado pelo pacote kernel-package.
  • –initrd: criar um sistema de boot initrd
  • –bzimage (opcional) gera um arquivo .bz do kernel
  • –append-to-version “-nome-customizado”: pra deixar seu kernel com a sua “cara” assim:
Note a linha “System”, meu kernel customizado se chama 4.12.0-nathan-drake-msicubi

Recomendo deixar o padrão “-separado-por-traço” com 1 traço no começo. Assim, quando pronto, ele ficará espaçado assim: 4.4.40-teste-de-nome. O kernel não permite nomes com espaços vazios. Sempre use traço.

  • –revision 1: revisão do pacote que será gerado. É apenas um valor para controle. Pode ser 1, 2, 3, qualquer numero que você preferir.

Caso você editou o kernel e compilou mas deu algum problema, faça suas correções, compile novamente e mude esse valor de 1, pra 2, por exemplo. Assim você sabe de qual versão se trata. Por padrão eu pessoalmente sempre deixo em 1. Só mudo pra 2 ou 3 se eu editei algo muito escalafobético e o sistema mudou pra melhor ou pior. Assim sei que fiz uma versão 2 que está melhor que a anterior.

  • -j 2: quantas CPUs serão usadas durante a compilação. Se sua máquina tem múltiplos cores como a minha, basta colocar esse número.
    Se você usa um Pentium 4 sem HT, use o valor 1.
    Se você usa um Core i5 por exemplo, o valor pode ser 4, para usar os 4 nucleos da CPU. Se não tem ou não sabe, não use esse parâmetro, apague-o.
    Dependendo do modelo de i7, você terá 8 nucleos. Mude de 2 para 8.
  • kernel_image: é o que diz pro kernel-package pra gerar o pacote kernel-image.deb, a imagem base completa do kernel que você vai precisar!
  • kernel_headers: (opcional) gera os arquivos kernel-headers.deb mas normalmente esse comando dá erros. Se você mantiver os arquivos na pasta /usr/src, esse comando é desnecessário.

Se tudo correr bem você verá a seguinte tela. Se quiser, abra o gerenciador de recursos e veja 100% de uso da CPU!

Encoste e relaxe. Pode demorar entre 1h e 2h, dependendo do poder do computador. Recomendo ver algo na Netflix (em outro computador!) enquanto isso.

Caso veja Erros!

Caso você veja algum erro nas “receitas” do compilador, verifique o que falta.

No caso, presenciei:
fatal error: openssl/opensslv.h.

Para corrigi-lo, você deve adicionar os seguintes pacotes:

user@debian-based:~$ sudo apt install linuxbrew-wrapper libssl-dev

E então faça:

user@debian-based:~$ brew install cmake autoconf libtool gcc automake openssl
user@debian-based:~$ brew link openssl --force

Finalizado sem erros!

Pós Compilação

Quando concluir você verá um arquivo .deb com seu kernel, uma pasta acima da pasta do kernel.
Ou seja, deve estar em /usr/src.

Uma vez terminada, se não tiver nenhum erro, será gerado um pacote com o formato “/usr/src/linux-image-<versão do kernel><nome que você personalizou>_<revisão>_<arquitetura da máquina>.deb”.
No meu caso foi o pacote “/usr/src/linux-image-4.11.8-nathan-drake-_1_amd64.deb”. Basta instalar via dpkg, apt ou seu instalador favorito como o gdebi.

OBS: O novo kernel automaticamente configura o grub.cfg, então não precisaremos editar o GRUB nem rodar o comando update-grub2.

Reinicie o PC e, se tudo ocorreu normalmente, o novo kernel já estará ativo mas se e somente se ele for a versão mais recente do que aquela instalada em seu sistema. Se você possuir o 4.10.0 e instalar o 4.4.52, por exemplo, não verá mudanças, o sistema ainda vai carregar o 4.10.0 como prioridade a menos que você edite o boot segurando Shift e, no menu de “recovery” você selecione o kernel manualmente para essa dita versão mais antiga.

Se por acaso alguma coisa der errado e o kernel não iniciar a maquina corretamente ou você presenciar um Kernel Panic, basta segurar o <Shift> ou <Esc> na inicialização da máquina, antes de carregar o Grub, pra poder ver o menu do mesmo. Em seguida escolher o kernel que se estava rodando antes e inicializar por ele. Depois basta remover o kernel criado facilmente por ele ter sido gerado como um pacote .deb.

Remova seu novo kernel com o comando:

$ sudo apt purge linux-image-4.11.8-nathan-drake-_1_amd64.deb

Entao rode:

$ sudo update-grub2

OBS: Lembrando que você deve remover um kernel estando com outro em execução. Exemplo, inicie no 4.11.2 para remover o 4.11.3 ou mesmo entrar no 4.11.5 para remover o 4.11.1.
Nunca remova um kernel ativo!

Se a compilação gerou um .deb que não funciona no seu PC, é porque você usou uma versão incompatível para seu PC, como citei la no começo do post.
Os kerneis possuem todos os drivers para os mais diversos computadores (por isso engorda aos 13Gb!).
As vezes uma versão mais nova do kernel remove suporte a um determinado computador.
No meu caso, o kernel 4.12.0 ja nao suporta meu notebook com Core i5.
No momento do boot ele trava, dando erro de ausencia de modulo, porque não possui o modulo certo da placa mae. E ai por consequencia, Kernel Panic.
Nesse caso precisei compilar o 4.11.8 para ter suporte.

Agora que seu kernel está devidamente instalado e executando, você verá seu nome customizado ao rodar o comando $ uname -a

OBS: Você pode excluir o conteudo da pasta /usr/src/seu-kernel-baixado-e-extraido que possui 13Gb para liberar espaço em disco.

Tambem pode purgar o pacote kernel-package que possui 800Mb.
MAS só faça isso se você ja instalou todos os programas de que precisa!
Se você precisa de um driver especifico para Wifi ou mesmo pro VirtualBox, você precisa manter o conteudo de /usr/src para que tudo ocorra sem problemas.
Se seu VirtualBox ja foi reinstalado e está devidamente executando, por exemplo, então voce pode excluir.

Uma dica pessoal que dou, é você guardar essa pasta compilada de 13GB em algum pendrive ou HDD Externo. Caso você precise, pode usa-la como fonte para gerar alguma compilação futura e evitar o trabalho de fazer a compilação toda novamente.

Uma vez que você instalou seu kernel customizado, ele já possui em seus arquivos o caminho /usr/src/seu-kernel-baixado-e-extraido como fonte para módulos e configurações de programas novos que exigem compilação

Exemplo: VirtualBox, VMWare Player, QEMU, qualquer compilação nova como um driver Wifi ou Bluetooth, são exemplos que necessitam de instalar modulos extras no kernel e vão exigir a presença dessa pasta de 13GB em /usr/src.

PORTANTE, respeite esse diretorio! Se voce precisar dos arquivos compilados novamente, eles devem voltar á /usr/src, e nenhum outro caminho serve.

Se você usa SSD, recomendo executar o comando TRIM agora.

Ele não é um desfragmentador mas um meio de liberar espaço, depois que voce ja excluiu os arquivos, sem desgastar seu SSD.

$ sudo fstrim -v /

Note que ele vai exibir a quantidade de memoria fisica liberada após o procedimento. Isso mantem a velocidade de leitura/gravação do SSD e poupa sua vida util.

Faça esse comando pra cada partição montada no SSD com exceção da SWAP, caso esta esteja presente.

Caso você deseje customizar seu kernel, siga a partir daqui!

O kernel possui nativamente suporte a aproximadamente 3.000 configurações diferentes pré configuradas para uso geral.

Com o seguinte comando:

$ cd /usr/src/seu-kernel-baixado-e-extraido
$ sudo make menuconfig

Você habilitará uma janela interativa como essa:

…onde você vai definir o que quer que fique ativo ou inativo neste kernel, conforme sua necessidade. Se tiver duvidas, deixe na configuração padrão; não costuma ser um problema.

Você também pode usar o arquivo .config gerado por um kernel anterior como um .deb da Canonical, isso pode aliviar e até agilizar a compilação. Se não souber fazer isso, faça o procedimento padrão.

Observações

Existe um delay, um atraso, para que o pessoal que trabalha no kernel possa adicionar módulos funcionais e compatíveis do seu PC.

No caso de módulos especiais, o delay pode ser bem maior. Meu notebook com Core i5, por exemplo, fabricado em Dez/2015, foi receber os módulos corretos pra brilho de tela no kernel 4.10 lançado só em Fev/2017. Módulos prioritários são os de placa mãe, por exemplo. Mas esses menores como brilho de tela ainda demoram um tempo para aparecer.

Se o 4.14.51 por exemplo lhe trouxe problemas (erros de Wifi ou mesmo kernel panic por incompatibilidade com a placa mae) então é melhor tentar o 4.13.x – Todo o lote 4.14.x causará o mesmo erro. 

Se algum do lote 4.13 der problemas, tente o 4.12 e por ai vai. Em algum ponto, você achará seu kernel ideal.
Infelizmente nessa etapa, é tentativa e erro.

Conclusão

Hoje vocês aprenderam como compilar o Kernel Linux para sistemas baseados em Debian. Não pude incluir para sistemas baseados em OpenSUSE, Fedora ou Arch por serem diferentes com scripts extras. Para esses eu preferi deixá-los para uma postagem dedicada futura.

#UrbanCompassPony

Deixe um comentário