Ainda hoje muita gente mostra supresa quando digo que estou rodando um kernel recém lançado em meu sistema. Apesar de quase todo mundo saber que Linux é o kernel apenas, uma parte do sistema operacional, pouca gente compila seu próprio kernel. E isso é uma coisa bastante simples com Debian e Ubuntu, ou qualquer outro sistema baseado neles.
Também vejo pessoas distribuindo o kernel em forma de download em sites como 4share, mega, etc. É legal contribuir com comunidade, mas distribuir um kernel assim, a parte mais vital do sistema, dá brecha de segurança pra que alguém insira um malware ali. Então evite fazer isso. E compile seu próprio kernel.
O primeiro passo é ter o código fonte do Linux. Depois que passou a utlizar o git pra controle de versão (e muito mais que isso), eu também passei a usar o mesmo pra sincronizar meus fontes. No diretório "/usr/src", como root, crie o repositório git local da seguinte forma:
root@jessie:src# git clone https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
Não é um processo rápido. O sistema vai baixar mais de 1 GB de arquivos no diretório "/usr/src/linux-stable".
Antes de botar a mão na massa, crie um novo "branch" com a versão que irá compilar. É possível ver as versões disponíveis pelo comando "git tag -l". No meu caso eu usei a versão v4.1-rc7. Então a coisa toda pra listar e criar seu "branch" fica assim:
root@jessie:linux-stable# git tag -l | grep v4.1 root@jessie:linux-stable# git checkout -b v4.1-rc7 tags/v4.1-rc7
O próximo passo é criar uma configuração de kernel antes de compilar. Em geral eu copio o arquivo "/root/config-<minha versão corrente>". Se quiser fazer isso, o comando correto é:
root@jessie:linux-stable# cp /boot/config-$(uname -r) .
Existem outras maneiras de configurar o kernel, como usando o comando "make menuconfig" ou "make xconfig", entre outros. Mas é preciso saber exatamente o que se quer do kernel pra configurar o que se realmente deseja. Uma tarefa não muito fácil pras primeiras compilações.
O passo seguinte é instalar um pacote chamado "kernel-package". Esse pacote é que faz toda a mágica da compilação e geração de pacotes pra você. Isso mesmo: ao final do processo terá um kernel seu num arquivo .deb. Eu já usei isso muito pra compilar em uma máquina e instalar em várias outras. Voltando ao pacote, instale usado "apt-get", "apt" (novíssimo), ou "aptitude".
root@jessie:linux-stable# apt install kernel-package
O passo seguinte é chamar o kernel-package pra criar o kernel. Eu pessoalmente uso da seguinte forma:
root@jessie:linux-stable# make-kpkg --initrd --append-to-version "-helio" --bzimage --revision 1 -j 4 kernel_image
O comando passado e os parâmetros são:
- make-kpkg: é o comando instalado pelo pacote kernel-package.
- --initrd: criar um sistema de boot initrd (a maioria dos sistema usa).
- --append-to-version "-helio": pra deixar seu kernel com a sua "cara". Vai aparecer algo como 4.1.0-rc7-helio na versão dele.
- --bzimage: criar um kernel comprimido no formato bz.
- --revision 1: revisão do pacote que será gerado.
- -j 4: 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 não tem ou não sabe, não use esse parâmetro.
- kernel_image: é o que diz pro kernel-package pra gerar só o pacote .deb do linux-image. Pode-se criar outros pacotes como source, headers, etc.
Ao iniciar a compilação, o sistema passará por uma etapa de revisão da configuração que foi definida anteriormente. Todo opção nova passará por uma pergunta se deve ou não ser incluída, ou ficar como módulo (pra ser carregado dinamicamente). Toda pergunta já vem com alguma sugestão de resposta. Em geral essa é a melhor opção a menos que realmente saiba o que aquela configuração significa.
Passada essa etapa, pode ir pegar um café. Um café? Melhor um bule inteiro. E pode ir assistir ao último episódio de Game of Thrones que a compilação demora um pouco.
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.1.0-rc7-helio_1_amd64.deb". Basta instalar e rebootar o computador pra testar a nova versão.
root@jessie:linux-stable# cd .. root@jessie:linux-stable# dpkg -i linux-image-4.1.0-rc7-helio_1_amd64.deb root@jessie:linux-stable# reboot
Se por acaso alguma coisa der errado, 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, algo que e facilitado pela geração do pacote .deb.
root@jessie:linux-stable# dpkg -r linux-image-4.1.0-rc7-helio
Se for compilar o mesmo kernel, mas com opções de configuração diferentes, pode usar outra revisão. Aliás incrementar a mesma. Isso aparecerá no pacote gerado, mas não no kernel.
Boa compilação e boa diversão :)