Executando verificação de segurança...
1

Como compilar um kernel Linux? (Ajuda)

Olá pessoal, não sei se esse é o lugar certo pra isso mas vale a tentativa. Tenho um dispositivo Android e preciso aplicar alguns patches no kernel pra uma finalidade específica. Consegui o source code do kernel do meu dispositivo pedindo no repositório da fabricante no GitHub. Tentei primeiro apenas compilar o kernel padrão, sem nenhuma alteração porém nem isso consigo devido a não existir um guia conciso sobre como proceder, tudo que eu acho são métodos distintos e datados e informações dispersas. Pelo o que percebi, não existe um procedimento padrão para se buildar um kernel. Gostaria de saber de alguém experiente em Linux, o que preciso saber e fazer para compilar um kernel Linux?

Carregando publicação patrocinada...
2

td;dr - Não existe um procedimento padrão, mas uma sequência de operações para ser tomadas. No mercado dos smartphones é um pouco pior pois cada fabricante pode adicionar novas camadas de drivers externos ou dependencias com outras ferramentas para que seu build de kernel tenha sucesso. Esta deve ser a razão pela qual você vê muita informação desencontrada na internet.

A fragmentação do mundo Android não ajuda muito, e o fato de que você precisa embutir o novo kernel numa imagem e não simplesmente instalar como arquivos dispersos no filesystem colaboram para que este procedimento seja mais burocrático.

Método "padrão" de compilação de Kernel.

Não existe bem um "método padrão" de se compilar o Kernel já que existem inúmeras variáveis que podem afetar tal procedimento. Algumas delas são (e não restritas a):

  1. Se o dispositivo é Android um uma Distribuição Linux clássica
  2. Se o vendor Android tem algum procedimento específico por conta de módulos
  3. Se Secure Boot está ativo ou bootloader está bloqueado
  4. Se a distribuição em uso possui alguns "helpers" pra compilar e já empacotar o Kernel pra você
  5. Se você pretende enxugar alguns módulos ou manter uma configuração que já é herdada da sua distribuição
  6. Compilador sendo utilizado ou a necessidade de utilizar compilação cruzada
  7. Necessidade de utilizar ferramentas específicas do fabricante para compilar o Kernel(Android).

Linhas gerais da compilação de um Kernel

No Desktop

Builds de Kernel no desktop se resumem a:

  1. Clonar o respositório do Linux
  2. Definir a configuração. Aqui se usa comumente o make olddefconfig ou se copia o .config atual da distribuição(zcat /proc/config.gz > .config) por ser um padrão são(sane defaults), e que apesar de inchado conterá módulos pra quase tudo que é utilizado portanto, você terá a certeza de um amplo espectro no tocante a suporte de hardware periférico(pci, usb, sata, etc)
  3. Compilar o kernel e módulos
  4. Instalar kernel e módulos
  5. Atualizar entradas no bootloader ou criar uma Unified Kernel Image caso não esteja usando um bootloader mas sim inicializando a imagem diretamente como EFI(Linux é seu próprio bootlaoder por assim dizer)

A maioria das distribuições também provê o mesmo kernel já empacotado para facilitar a integração com o sistema de pacotes corrente, ou ferramentas que geram um pacote para que desta forma você gerencie seu kernel de forma mais fácil.

O Linux em distribuições de desktop também conta com o dkms (Dynamic Kernel Module Support), e módulos out-of-the tree que eram uma dor de cabeça no passado(nvidia, virtualbox, binder...) são compilados automaticamente assim que um novo kernel é instalado.

No Android

O lugar que é referencia para mods de smartphones é o forum XDA-evelopers, e lá há uma vasta documentação relacionada a compilação de Kernel para Android, incluindo instruções de cross-compiling, já que muito provavelmente você estará utilizando um computador x86_64 para compilar um kernel que é aarch64.

A documentação oficial do Android é essa, mas ela é beeeeem genérica e não foca em builds que contenham especificidades de fabricantes.

O que muda em relação a compilação em desktops:

Alguns passos adicionais entram aqui na jogada, e eles são(referência):

  1. Baixar um cross-compiler. Geralmente isso faz parte da toolchain provida pelo fabricante.
  2. Encontrar a defconfig do seu celular. Ela geralmente está dentro do diretório arch/arm64/configs ou em algum repositório do próprio fabricante. Como celulares tendem a ser estáticos do ponto de vista de upgrade de componentes internos, e você não vai remover ou adicionar hardware outro que um sim, sdcard, bluetooth, as imagens de celular são padronizadas por modelo. Não existem um kernel aarch64 que vá suportar todos os dispositivos correntes, como ocorre em distribuições Linux para desktop.
  3. A instalação do Kernel não ocorre como no make install e make modules_install de uma distribuição convencional copiando arquivos para lugares arbitrários e sim, através do reempacotamento da imagem completa do fabricante. Você terá que obter uma ROM oficial ou utilizar algum sistema alternativo como o LineageOS, desempacotar a image, copiar a zImage que foi gerada para o seu aparelho e enviar/flashear tal ROM para o seu dispositivo.
  4. O seu aparelho pode possuir uma trava de bootloader(bem comum nos dispositivos de hoje em dia) que precisa ser liberada antes que você consiga enviar uma ROM custom para o dispositivo. Alguns fabricantes liberam na hora e requerem apenas um cadastro em seu site, e outros além do cadastro te dão um chá de cadeira de 1 semana até te enviar a chave de desbloqueio por email(cof, cof, Xiaomi...).
1

Muito obrigado pela resposta. Em relação ao item 4 da criação de kernels para dispositivos Android, acho que existem métodos como o AnyKernel para facilitar. Minha maior dificuldade mesmo é em saber qual compiler/toolchain usar ou mesmo entender o conceito destes. Percebi que pode existir um gcc/clang do fabricante do meu aparelho (Motorola), do fabricante do chipset (Qualcomm), da própria ARM, e do AOSP.
No guia de referência que você indicou, o link para a toolchain AOSP fornecido cai em uma página que indica que o android abandonou o gcc em favor do LLVM, que eu creio que seja o clang.
Ao executar um cat /proc/version no meu dispositivo, mostra que foi utilizado o clang v11.02, seria necessariamente essa a versão que eu teria que utilizar no processo e como obtê-la?