Compilando a última versão do Kernel Linux para a Raspberry Pi 3B +

Kernel Linux para a Raspberry Pi

O Kernel Linux está em pleno desenvolvimento. É um dos maiores projetos open-source com uma média de mais de 1500 desenvolvedores envolvidos pra cada versão. Nesse artigo vamos aprender a compilar a última versão do Kernel Linux, direto do código fonte da árvore GIT do seu criador, Linus Torvalds, para nossa Raspberry Pi 3B+.

 

Introdução

 

Linux é o sistema operacional mais comum em soluções de sistemas embarcados atualmente. É o Kernel Linux que conhece, sabe “conversar”, com nosso hardware, gerenciar a memória, processos, acesso a periféricos, entrada e saída, interrupções e deixa tudo funcionando perfeitamente e de forma transparente para nossas distribuições Linux.

 

A Raspberry Pi Foundation fornece uma distribuição Linux para suas placas baseada na famosa distribuição Debian. E lógico uma distribuição Linux utiliza o Kernel Linux como núcleo. Atualmente a última versão do Raspbian vem com o Kernel Linux v4.14, uma versão LTS (Long Term Support), que recebe correções de bugs por um período de tempo maior.

 

Figura 1 - Versão do Kernel do Rasbpian 2018-11-13

 

Kernel mainline

 

O código fonte do Kernel para a Raspberry Pi pode ser encontrado em vários repositórios pela web. Mas o oficial é do Github da Raspberry Pi Foundation. O código desse repositório que é utilizado para compilar o Kernel do Raspbian.

 

Para as últimas versões do Kernel nós vamos utilizar o repositório oficial do Kernel Linux, a árvore GIT do seu criador Linus Torvalds: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/

 

Figura 2 - repositório oficial do Kernel Linux

 

Esse repositório é chamado geralmente de “mainline” por ser aonde os desenvolvedores do Kernel Linux submetem os mais novos patches, tanto novas funcionalidades como correção de bugs, para serem incluídos no Kernel. Na verdade o repositório Github da Raspberry Pi Foundation é um fork do repositório do Linus, em que são incluídas algumas customizações e estabilizações para o funcionamento da Raspbian.

 

Por que utilizar a última versão?

 

O recomendado é sempre utilizar uma versão LTS em seus projetos e produtos. Utilizar a última versão do Kernel Linux é útil se houver alguma funcionalidade, correção de bug que foi incluída recentemente a qual você realmente precise, ou para fins de desenvolvimento, testes e diversão. Todo o ciclo de desenvolvimento do Kernel Linux é aberto, então utilizando a última versão do Kernel Linux para testes você também pode estar ajudando no desenvolvimento, caso ache alguma falha ou instabilidade no sistema, reportando a mesma através do Linux Kernel Mainling List.

 

Compilando o kernel

 

Para compilar o Kernel primeiramente precisamos de uma máquina com uma distribuição Linux. Para esse artigo estou utilizando o Mint 19.1, mas acredito que as instruções aqui de instalação de pacotes sirva para todas as distribuições Debian based. Vamos instalar os seguintes pacotes de pré requisitos para a compilação no terminal:

 

 

Com os pacotes instalados corretamente agora devemos baixar o código fonte do repositório do Linus Torvalds (Obs: esse comando pode demorar um pouco dependendo da velocidade da sua conexão à internet, o repositório tem cerca de 3 GB de arquivos):

 

 

Com todo o código do Kernel em nossa máquina agora podemos começar o processo de compilação. Vamos configurar a compilação:

 

 

O retorno deverá ser algo parecido com isso:

 

Figura 3 - configurando a compilação

 

Explicando o comando:

 

  • ARCH=arm: Estamos dizendo ao make, nossa ferramenta de gerenciamento de build, que vamos compilar o Kernel para a arquitetura ARM. O processador da nossa Raspberry Pi o BCM2837 é um ARMv8;
  • CROSS_COMPILE=arm-linux-gnueabihf-: Estamos compilando o Kernel em uma máquina rodando em um processador Intel x86. Então precisamos dizer para o make que vamos “cross compilar” o Kernel utilizando os compiladores do pacote arm-linux-gnueabihf-;
  • multi_v7_defconfig: Por fim o último argumento é o arquivo de defconfig (definição de configuração).

 

Se navegarmos dentro das pastas do código fonte do Kernel Linux podemos chegar até esses arquivos de configuração:

 

 

Figura 4 - Arquivos de configuração

 

Destaque para os bcm2835_defconfig que possui as configurações para os Raspi 1, 2 e 0, e o multi_v7_defconfig. Estes arquivos selecionam, ativam ou desativam, funcionalidades a serem compiladas e adicionadas a imagem do Kernel. O Kernel é um projeto gigante, multi arquitetura, com muitos drivers de dispositivo. Para compilar o Kernel para Raspberry Pi não vamos precisar de tudo isso. Cada projeto de placa, modelo de processador, utiliza um defconfig para configurar a compilação somente daquilo que for necessário para seu funcionamento. No caso da Raspberry Pi 3B, 3B+, e outras placas baseadas na arquitetura ARM, vamos utilizar as configurações definidas no multi_v7_defconfig.

 

Com as configurações selecionadas vamos para a hora da verdade com o comando:

 

 

Esse comando vai compilar e gerar a imagem do Kernel para nosso Raspberry Pi 3B+. Não se preocupe ele deve demorar cerca de uns 6 a 10 minutos para terminar, e seu retorno deve ser algo parecido com:

 

Figura 5 -Compilando e gerando a imagem do Kernel para nosso Raspberry Pi 3B+

 

Explicando o comando:

 

  • ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- : a mesma função descrita do comando anterior, compilar para a arquitetura ARM com o cross compiler arm-linux-gnueabihf-;
  • zImage : é o tipo de imagem do Kernel que queremos como output da compilação, o zImage é uma imagem comprimida que se auto extrai durante o boot;
  • modules : a Raspberry Pi utiliza alguns periféricos, por exemplo WiFi. O chip do WiFi precisa de um driver no Kernel, esse driver na configuração da imagem do Kernel é selecionado como module, um driver que pode ser carregado ao sistema sem precisar fazer parte da imagem do Kernel, um arquivo a parte. Passando o argumento modules estamos dizendo ao make para compilar todos os drivers e módulos (são as saídas de arquivos com extensão *.ko que vemos durante a compilação do Kernel);
  • dtbs : esse argumento diz ao make para compilar todos os Device Trees configurados pelo defconfig. Os Device Trees são de grande importância para descrição do hardware para o Kernel, são eles que irão definir quais periféricos utilizarão quais GPIOs e os estados dos pinos, output, input, pull down e etc;
  • -j 8 : o argumento -j ou –jobs diz ao make para compilar nosso Kernel utilizando processos em paralelo. Por exemplo meu computador tem 8 núcleos então eu posso passar “-j 8” para o make e ele ira compartilhar tarefas durante a compilação a todos os meus núcleos. Isso diminui bastante o tempo total de compilação.

 

Nesse momento se o comando rodou corretamente, sem erros, parabéns! Você acabou de compilar a última versão do Kernel Linux para a Raspberry Pi 3B+.

 

Instalando a nova imagem

 

Para testar nossa nova imagem do Kernel vamos utilizar uma instalação do Raspbian já gravada em um SD card. Conecte e monte o SD card no seu Linux. Vamos copiar os seguintes arquivos para a partição boot do SD card:

 

 

Esses arquivos são respectivamente a imagem do nosso novo Kernel, arquivo zImage, e o Device Tree Binary com a descrição de hardware que o Kernel precisa para o Raspberry Pi 3B+, o arquivo bcm2837-rpi- 3-b-plus.dtb.

 

O novo Kernel precisa dos seus módulos para funcionar corretamente. Lembra dos arquivos com extensão *.ko criados durante a compilação? Para instalação desses arquivos nos temos um comando make:

 

 

O sudo é necessário aqui por que estamos copiando os módulos para uma partição ext, rootfs do SD card. O retorno do comando deve ser algo parecido com isso:

 

Figura 6 - Instalando no SD card

 

Tudo instalado no SD card.

 

Atenção: troque os caminhos /media/castello/rootfs/ e /media/castello/boot/ dos comandos acima pelo caminho aonde estará montado a partição boot e rootfs do SD card do Raspbian no seu computador.

 

Por fim temos que configurar o bootloader da Raspberry Pi para carregar nosso novo Kernel, já que os novos arquivos não seguem o padrão que ele irá procurar. Abra o arquivo config.txt da partição boot do SD card e inclua o seguinte no final do arquivo:

 

 

Com isso o bootloader irá saber que ele tem que carregar para a memória a nova imagem e o device tree binary atualizado para o novo Kernel.

 

Com esses passos já podemos ligar nossa Raspberry Pi 3B+ e verificar se a nossa última versão do Kernel está funcionando corretamente:

 

 

Figura 7 - Versão do Kernel

 

No momento em que escrevo esse artigo o Kernel está na sua versão 5.0.0-rc6 (release candidate 6). Pronto, estamos rodando a última versão de desenvolvimento do Kernel Linux em nossa Raspberry Pi 3B+.

NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Matheus Castello
Cientista da Computação atuando desde 2013 nas áreas de sistemas embarcados, Android e Linux. Trabalhou diretamente com o Kernel Linux embarcado em modelos de smartphones e tablets Samsung comercializados na America Latina. Colaborou no upstream para o Kernel Linux, árvore git do Linus Torvalds, para o controlador de GPIO da família de processadores utilizados nos Raspberry Pi. Palestrante FISL 2018 e Linux Developer Conference Brazil 2018.

3
Deixe um comentário

avatar
 
3 Comment threads
0 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
2 Comment authors
Antonio CesarioPedro Otávio Mariano Perucelo Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
Antonio Cesario
Visitante
Antonio Cesario

Muito legal seu artigo e bem explicado. Voce teria um tutorial para criar uma versão customizada desse kernel que ja tivessem alguns programas instalados e o kernel novo ? Criar um imagem de um cartão SD ja pronto ocupa muito espaço então eu queria ter uma imagem customizada e pequena.

Obrigado

Antonio Cesario
Visitante
Antonio Cesario

Ótimo artigo. Mas eu gostaria de poder criar um imagem personalizada com varios programas já instalados para facilitar algumas instalações claro incluindo um kernel novo.

Pedro Otávio Mariano Perucelo
Membro
Pedro Otávio Mariano Perucelo

esse seria o melhor sistema operacional para trabalhar com o raspberry?