Compilação de Kernel – Atualizando o Linux Manualmente

Nessa nova série de posts irei falar sobre o que é um kernel e como compilar um, sendo esse primeiro post mais voltado para quem não deseja arriscar desenvolvendo um sistema operacional do 0, e sim atualizar o kernel de sua distribuição.

O que é um Kernel?

 

O kernel é o coração do sistema operacional: sua tarefa é criar uma camada de abstração entre as aplicações e o hardware, facilitando a vida dos desenvolvedores, já que não será mais necessário desenvolver módulos para o hardware da máquina, como CPU, Memória, Disco, entre outros. A palavra vem do inglês e significa “Núcleo”, que é bem descritivo de onde ele fica alocado no sistema operacional (no núcleo ou coração).

Existem diversos kernels para diferentes sistemas operacionais, como por exemplo o MINIX, do sistema homônimo, o Kernel32.dll ,  do sistema operacional Windows e do ReactOS (através de engenharia reversa), o Hurd, do sistema operacional GNU/Hurd, e também o Linux, do sistema operacional GNU/Linux.

Esse post tem como foco falar sobre o Linux, desenvolvido por Linus Torvald em 1991 através de uma necessidade, aonde o mesmo precisava de algumas funções que não existiam no MINIX e não haviam planos de inclusão delas no mesmo, pois se tratava de um sistema operacional voltado para estudos e o Andrew Tanenbaum tinha medo que caso incluísse muitas funcionalidades em seu sistema acabasse se tornando complexo demais para ser considerado algo didático.

Atualmente ele se encontra na versão 4.12.4 porém com uma adoção baixa, visto que distribuições grandes (como a Debian e a Red Hat) preferem ficar com uma versão anterior e simplesmente lançar patchs de correções afim de manter a estabilidade toda de seu sistema. Essa versão porém está inclusa em distribuições de GNU/Linux conhecidas como Rolling Releases, distribuições que possuem o costume de lançar a versão mais recente do pacote sempre que possível (ex. Arch Linux e seus derivados e o Gentoo Linux).

 

Compilando o Linux

 

Primeiramente devemos baixar os pacotes necessários para compilar nosso Kernel. Para isso rode os comandos abaixo de acordo com a distribuição que utiliza:

CentOS/Red Hat:

# yum groupinstall -y "Development Tools"

Debian/Ubuntu:

# apt-get update && apt-get install make gcc g++ autoconf libncurses5 libncurses5-dev ncurses-base ncurses-bin ncurses-term

Agora baixe o pacote com a versão mais recente do kernel no seu computador ou servidor. Você pode encontrar a versão mais recente do pacote no endereço https://www.kernel.org. Descompacte-o em algum diretório (de preferência o /usr/local/src), e entre dentro do diretório para que possamos começar a configurar a compilação.

# cd /usr/local/src
# wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.12.4.tar.xz
# tar -xf linux-4.12.4.tar.xz
# cd linux-4.12.4

Caso queira versionar o seu kernel, abra o arquivo Makefile e edite a linha “EXTRAVERSION” para algum valor que você queria (por exemplo “-v1”):

# vim Makefile
...
EXTRAVERSION = -v1
...

Agora vem o passo que diferencia a compilação, aonde você deseja criar um novo Linux (LFS – Linux From Scratch, por exemplo) de uma mera atualização de versão. Normalmente é aconselhado que execute o comando “make menuconfig” para gerar um arquivo .config, aonde possuem as configurações do kernel, como os módulos que serão built-in, porém, como estamos usando uma distribuição como base, esse arquivo já existe dentro do diretório /boot com o nome config-$(uname -r). Tudo que precisamos fazer é copiar ele para dentro do diretório do código fonte do Linux, renomear para .config, e atualizar usando o comando “make oldconfig”. Esse comando fará diversas perguntas sobre ativar ou não as novas funcionalidades do kernel mais recente. Caso não saiba o que está fazendo, simplesmente execute um “echo yes” e redirecione sua saída para o oldconfig para ativar todas elas.

# cp /boot/config-$(uname -r) .config
# echo yes | make oldconfig

Desse ponto em diante é o mesmo procedimento de compilação: make -j2 -> make modules_install. Ao término, dentro do diretório “arch/<arquitetura>/boot/” existirá um arquivo chamado bzImage. Esse é o resultado da compilação. Faça uma cópia dele para /boot e renomeie para vmlinuz-4.12.4-v1 (4.12.4-v1 deve ser alterado para a versão do kernel que você está compilando).

# cd arch/x86_64/boot
# cp bzImage /boot/vmlinuz-4.12.4-v1

O ultimo passo é criar o initrd que será o arquivo usado como carga inicial do seu sistema operacional. O initrd nada mais é que um arquivo do tipo cpio que contém o initramfs (Initial Ram File System), um conjunto de arquivos que são utilizados na inicialização do sistema operacional GNU/Linux. Para criar esse arquivo usamos o comando mkiniramfs passando como parâmetro o nome do arquivo destino (sempre deve se chamar initrd.img-versão) e a versão do Linux que esse arquivo será responsável por inicializar.

# mkinitramfs -vo /boot/initrd.img-4.12.4-v1 4.12.4-v1

Agora basta executar o update-grub2 para que o grub reconheça a nova versão do seu Linux, e reinicie o sistema operacional para validar. Caso algo não funcione corretamente, execute os passos anteriores pois é possível que algo tenha dado errado durante ou depois da compilação.

# update-grub2
# reboot

Esse post foi feito utilizando parte o material de estudo fornecido pela 4Linux para o curso de 451 – Linux Security SysAdmin in Cloud e parte o livro Certificação LPI-2 201 – 202 do autor Luciano Antonio Siqueira. Deixarei abaixo o link para o curso da 4Linux e o link para compra do livro, caso queiram consultar um ou outro.

Links:

  • https://www.amazon.com.br/dp/8576088363/ref=asc_df_85760883635004099?smid=A1ZZFT5FULY4LN –
  • https://www.4linux.com.br/curso/linux-security-sysadmin-cloud

One thought to “Compilação de Kernel – Atualizando o Linux Manualmente”

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *