Compilando o último Kernel 5.3 stable, no dia do aniversário do Kernel monolítico de LinusTorvalds!

Compilando o último Kernel 5.3 stable, no dia do aniversário do Kernel monolítico de LinusTorvalds!

Hoje, em mais uma madrugada de estudos, estou redigindo este artigo, e tentando contextualizar toda minha experiência técnica de forma dinâmica, e por mais que seja um conteúdo que já exista de enxurrada na internet, irei tentar enxugar o máximo a tasklist do processo de compilação do kernel focado em distros debian, tentando o máximo não ser massivo e robótico, colocando apenas comandos sem saber a utilidade de cada um.

Compilar um Kernel é um passo importante para otimização e suporte a hardware, nós que sempre almejamos ser um bom sysadmin lnx, devemos conhecer, e de preferência dominar esse tipo de procedure.

O kernel abordado neste artigo, será o kernel monolítico, que diferentemente do microkernel, é modular, ou seja você pode desativar ou não módulos de funcionalidades, seja uma placa de som, webcam evitando blob do google, e também para evitar uso de processo/recursos.

No dia 17 de setembro de 1991, o Linus lançou a versão 0.0.1 através de um servidor FTP e possuía mais de 10k de linhas de código. E próximo do dia 17, vi que a versão já está na 5.3 e resolvi assim escrever este processo da minha forma. Só para constar, mais alguns dados históricos, em 1996 saiu a versão 2 do kernel, em 2003 a versão 2.6 e em 2011 a versão 3, em homenagem aos 20 anos de aniversário do Linux.

Recentemente Linus Torvalds lançou o release do kernel 5.3, mais precisamente no dia 15 de setembro, e com ele, diversas novas funções/features:

  • Suporte para AMDGPU Navi,isso inclui a Radeon RX 5700
  • Suporte para TuringTU116
  • Suporte para 16 milhões de novos ips IPv4
  • Melhorias ao nível do RISC-V
  • MacBook & MacBook Pro com suporte ao nível do teclado e touchpad
  • Melhor suporte para NVIDIA Jetson Nano
  • Ficheiro swap em F2FS (por omissão)
  • Melhorias ao nível da gestão de ficheiros EXT4

Topologia do Kernel Monolítico

Mão na massa

A localização do código fonte do kernel fica em /usr/src/ e independente de qual versão do kernel está sendo utilizada o sistema procura por /usr/src/linux como o caminho para o código fonte do Kernel. Este é o link simbólico que é principalmente usado por drivers que são compilados posteriormente para a versão de kernel compilada.

Iremos baixar a última versão do kernel em ‘https://kernel.org/’. Neste momento a última versão stable é a 5.3. Fiz o download e vou descompactar em /usr/src para facilitar, o arquivo baixado, vai ter o nome de ‘linux-5.3.tar.xz’ para descompactação, usaremos:

tar -xvf linux-5.3.tar.xz

O diretório da source (fontes do kernel) vai ser o seguinte:

root@igora:/usr/src# ls -ltr -d linux-5.3/
drwxrwxr-x 24 root root 4096 Sep  5 00:49 linux-5.3/
root@igora:/usr/src# readlink -f linux-5.3/
/usr/src/linux-5.3

 

Vamos criar também um link simbólico para que os drivers futuros entendam quem é a versão atual do kernel e também o código fonte deste kernel, e qual vai ser a versão padrão:

ln -s linux-5.3 linux

Um comando importante para você ver a versão do seu kernel, que está carregado antes de você compilar o novo é:

uname -r
4.19.0-6-amd64

A imagem desse seu kernel, vai ficar em /boot/ geralmente de nome ‘vmlinuz-4.19.0-6-amd64’ neste meu caso, além de outras imagens que possam existir de outras versões de kernel.

Vamos ver mais detalhes sobre essa imagem:

root@igora:/boot# file vmlinuz-4.19.0-6-amd64 
vmlinuz-4.19.0-6-amd64: Linux kernel x86 boot executable bzImage, version 4.19.0-6-amd64 (debian-kernel@lists.debian.org) #1 SMP Debian 4.19.67-2 (2019-08-28), RO-rootFS, swap_dev 0x5, Normal VGA

Veja que o tipo da imagem é bzImage(Big zImage), A zImage hoje não é mais usada pois é incompatível com a maioria do hardware atual, que pede diversos drivers e suportes ao kernel, ela tem um tamanho pequeno, limitado em 512kb, e é carregado na low memory (Memoria baixa do sistema até 640kb). O Big zImage(bzImage), não tem limite de tamanho e é carregado no High Memory, ambos são comprimidos usando o gzip.

No /boot/ fica assim o arquivo da imagem do kernel que vai ser carregado pelo grub na memória, o grub vai ter neste caso o grub.cfg (arquivo de configuração do grub que vai ter as definições de cada imagem e detalhes necessários para carregar a imagem no grub).

Os módulos do kernel ficarão em /lib/modules/ lá existirá todas as versões de kernel e dentro de cada versão vai ter os módulos que são usados por cada um destes kernel:

root@igora:/boot# ls -ltr /lib/modules
total 12
drwxr-xr-x 3 root root 4096 Aug 13 22:37 4.19.0-5-amd64
drwxr-xr-x 3 root root 4096 Sep  8 06:49 4.19.0-6-amd64

 

Gerando .config

Uma das partes mais vitais é agora, nesse ponto você já vai ter:

  • baixado o kernel/source do kernel.org
  • descompactado com tar -xvf em /usr/src/
  • link simbólico linux -> linux-5.3

Iremos precisar gerar o .config antes de compilar. No .config irá conter todas as personalizações de módulos do kernel que desejas, seja para tornar um módulo built-in(atrelar ao kernel) ou módulo de fato, seja para desativar um módulo desnecessário, e por ai vai, vou descrever os métodos mais usados para isso.

Vamos instalar alguns pacotes, que são necessários para o processo de compilação (make, gcc, g++,dpkg-dev e outras ferramentas fundamentais para o processo de compilação):

apt install build-essential

As formas de gerar o .config são:

  • make config
  • make menuconfig (recomendada)
  • make xconfig (qt) gráfica usando o Qt
  • make gconfig (gtk) gráfica usando o GTK

Para isso, vamos instalar alguns pacotes de dependências :

apt install bison flex ncurses-dev

Já adianto que o ncurses-dev é para o menuconfig, que lembra muito a interface do iptraf e das antigas BIOS, dispensando a necessidade de uma interface gráfica ou diversas perguntas como no make config, por isso o make menuconfig é o método mais usado hoje.

Ao instalar os pacotes acima, iremos seguir com o comando para iniciar e personalizar o kernel através da geração .config, escolhendo funcionalidades e até mesmo realizando alterações de um módulo para built-in (atrelado ao kernel) ou vice-versa, tornando algo built-in em módulo.

make menuconfig

 

Você pode escolher os recursos com espaço, seja para marcar ou desmarcar. Para entrar nos menus que possuem –> clique em enter e dentro use o espaço para marcar as opções desejadas. Os que possuem um <M> é porquê serão compilados como módulo e não vai ficar em memória, você pode escolher <*> se desejar, que neste caso será built-in.

make menuconfig

Ao dar exit, para o primeiro menu e depois exit novamente para sair completamente do menuconfig, ele vai solicitar para salvar a configuração do kernel, basta marcar Yes para salvar.

O arquivo vai ser salvo em /usr/src/linux, tendo em vista que você deve tar dentro dele, o nome do arquivo será .config 

Personalizando o nome do Kernel

Você poderá personalizar uma versão para essa compilação, isso é feito no arquivo /usr/src/linux/Makefile Alterando:

 

EXTRAVERSION = -2702

Ainda complementarei com outros dados nessa compilação, só que agora irei mecher no /usr/src/linux/.config:

CONFIG_LOCALVERSION="-IgoRAKernelCompile"

Ao tentar compilar, passei por um erro, onde foi necessário instalar um pacote:

| HOSTCC scripts/extract-cert
| /mnt/home/igora/Save/RPBbuild/build-rpb-wayland/tmp-rpb_wayland-glibc/work-shared/hikey/kernel-source/scripts/extract-cert.c:21:25: fatal error: openssl/bio.h: No such file or directory
| #include &lt;openssl/bio.h&gt;
| ^
| compilation terminated.
| make[3]: *** [scripts/extract-cert] Error 1
| make[2]: *** [scripts] Error 2
| make[1]: *** [sub-make] Error 2
| make: *** [__sub-make] Error 2

Instalei o pacote do openssl para desenvolvimento:

apt install libssl-dev

Compilando o Kernel

Agora, vou compilar, vou colocar um ajuste para utilizar 4 jobs, durante o processo de compilação para gerar o bzImage para agilizar um pouco o processo, se você apenas colocar -j sem argumento, nao vai ter limite de jobs sendo executados simultaneamente:

make -j4 bzImage

Ao término, a imagem vai ser gerada em :

/usr/src/linux/arch/x86/boot/bzImage

 

Módulos do Kernel

Precisaremos agora compilar os modulos e instalar, esse processo é o mais demorado de todos, vou colocar 4 jobs novamente:

Compilar:

make -j4 modules

Instalar:

make modules_install

Finalizando e atualizando o initramfs

Ao término de tudo isso, vou apagar os arquivos da compilação, usarei então:

make clean

Para remover tudo (arquivos de compilação + .config) inclusive o arquivo de configuração, eu usaria $make mrproper mas isso não é meu interesse.

Agora eu vou rodar o make install, para versao compilada do kernel ser movida e instalada lá de /usr/src/linux/arch/x86/boot/bzImage dentro de /usr/src/linux:

make install

Agora é só mandar um update no initramfs com comando indicado abaixo, ele já vai recriar a configuração no grub:

update-initramfs

Logs:

Generating grub configuration file ... ATUALIZA O GRUB.CFG
Found background image: /usr/share/images/desktop-base/desktop-grub.png
Found linux image: /boot/vmlinuz-5.3-2702-IgoRAKernelCompile
Found initrd image: /boot/initrd.img-5.3-2702-IgoRAKernelCompile
Found linux image: /boot/vmlinuz-4.19.0-5-amd64
Found initrd image: /boot/initrd.img-4.19.0-5-amd64
done

Agora dou um systemctl reboot voialà:

root@igora:/usr/src/linux-5.2.11# uname -r
5.3-2702-IgoRAKernelCompile

E aqui ficamos com o dia 17 de Setembro, e os 28 anos de aniversário do Kernel Linux(17/09/1991), antes com 10k de linhas aproximadamente, e hoje com 24milhoes+ .

Enjoy! Share the knowledge!

igorandrade

an IT & Infosec Expert, regex pro player and devops skills to made everything happens fast.

Deixe uma resposta