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
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.
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 <openssl/bio.h> | ^ | 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!
4 Comentários