201.1 Componentes do Kernel
O kernel é o núcleo de um sistema operacional, responsável por fazer a ponte entre o hardware e o software. Ele gerencia recursos como CPU, memória e dispositivos de entrada/saída, controlando a execução de processos, alocação de memória, comunicação entre dispositivos e garantindo que os programas tenham acesso seguro aos recursos do sistema. Já o Linux é composto pelo Kernel e somente por ele, quando juntando o kernel mais os programas que os usuários usam, chamamos isso de distribuição (frequentemente chamada GNU/Linux). Existem dois tipos de Kernel, o Monolítico e o Micro-Kernel.
Pense no kernel monolítico como uma "caixa", que carrega, de uma vez só, tudo o que o sistema precisa para funcionar, como: drivers, gerência de memória, sistemas de arquivos e assim por diante. Essa caixa fica no espaço de kernel, onde não há separação rígida entre os componentes. O Linux segue esse modelo, mas com um tempero extra: ele é monolítico modular. Isso significa que, embora o núcleo seja um só, você pode habilitar ou remover módulos, como drivers de placa de vídeo ou de rede, em tempo de execução, sem precisar reinicializar a máquina.
Já o microkernel adota a filosofia "menos é mais". Ele mantém dentro do núcleo apenas o mínimo indispensável (escalonamento, comunicação entre processos e um controle básico de memória). Todo o resto (drivers, sistemas de arquivos, pilha de rede) roda fora do kernel, em processos normais de usuário. Essa separação reduz o risco de um erro derrubar o sistema inteiro e facilita a manutenção de cada componente, mas cobra seu preço, já que como esses processos precisam conversar o tempo todo com o kernel por meio de mensagens, a sobrecarga de comunicação pode tornar o microkernel menos eficiente em operações intensivas.
Para baixar um Kernel, podemos baixar visitando o site oficial, a versão oficial do Kernel seguem algumas características que devemos entender. Vamos analisar a imagem abaixo:
Mainline é uma versão que irá se tornar a versão estável, mas ainda não é.
Stable é a versão estável do momento.
EOL (End Of Life) é a versão que deixará de ser estável.
LongTerm são versões antigas que ainda são mantidas.
A versão do kernel pode ser entendida como V.R.I, onde:
- V representa a versão principal do kernel;
- R indica o release (lançamento principal) dentro dessa versão;
- I é o número de incremento, que aumenta sempre que um patch de correção é lançado.
Por exemplo, na versão 5.14.7:
- 5 é a versão principal do kernel;
- 14 é o 14º lançamento dentro da versão 5;
- 7 indica que já foram aplicados 7 patches de correção desde o lançamento do kernel 5.14.
Isso significa que estamos na versão 5 do kernel, com o 14º lançamento e 7 correções aplicadas.
Arquivos e Localização
Quando você instala apenas o binário e os módulos vindos do repositório da sua distro, você apenas receberá:
- O vmlinuz-versão (ou bzImage) em
/boot
, que o bootloader carrega na memória. - O diretório
/lib/modules/<versão>/
, com todos os módulos, que são os "drivers" carregáveis em tempo de execução.
Para compilar um módulo externo ou o próprio kernel você precisa instalar os cabeçalhos (Debian/Ubuntu: linux-headers-*
, RHEL/Fedora: kernel-devel
). Esses pacotes criam subpastas dentro de /usr/src/
. No caso da compilação, você pode colocar em outro lugar, mas é bom manter nesse diretório.
# Listando o código fonte do headers do Kernel:
$ ls /usr/src/
linux-headers-5.4.0-42 linux-headers-5.4.0-42-generic linux-headers-5.4.0-66
linux-headers-5.4.0-66-generic linux-headers-5.4.0-86 linux-headers-5.4.0-86-generic
# Listando os Kernels que temos instalado:
$ ls -l /boot/vmlinuz*
lrwxrwxrwx 1 root root 24 Sep 23 21:11 /boot/vmlinuz -> vmlinuz-5.4.0-86-generic
-rw------- 1 root root 11662080 Jul 10 2020 /boot/vmlinuz-5.4.0-42-generic
-rw------- 1 root root 11690752 Jan 27 2021 /boot/vmlinuz-5.4.0-66-generic
-rw------- 1 root root 11776256 Sep 17 18:51 /boot/vmlinuz-5.4.0-86-generic
lrwxrwxrwx 1 root root 24 Sep 23 21:11 /boot/vmlinuz.old -> vmlinuz-5.4.0-66-generic
Os cabeçalhos do kernel são arquivos de código em C que contêm definições de estruturas, funções e macros usadas pelo kernel do Linux. Eles são essenciais para compilar qualquer código que precise se comunicar diretamente com o kernel, como módulos do kernel, drivers de dispositivos e até alguns programas de espaço de usuário que fazem chamadas ao kernel. Esses cabeçalhos fornecem a interface necessária para garantir que o código externo possa interagir corretamente com o kernel, utilizando as APIs e estruturas que ele oferece.
Sempre que baixamos um novo Kernel ele vem agrupado com tar
e compactado com xz
.
bzImage ou zImage
A imagem do Kernel poderia ser de dois tipos, zImage ou bzImage, coloquei como poderia porque zImage
não se utiliza mais por causa de seus limitações principalmente no tamanho do arquivo final. Tanto bzImage quanto zImage só tem relação com o tamanho do Kernel, isso não diz respeito a algoritmo de compactação.
# Vendo o tipo de arquivo do Kernel:
$ sudo file /boot/vmlinuz-$(uname -r)
/boot/vmlinuz-5.4.0-86-generic: Linux kernel x86 boot executable bzImage, version 5.4.0-86-generic (buildd@lgw01-amd64-041) \#97-Ubuntu SMP Fri Sep 17 19:19:40 UTC 2021, RO-rootFS, swap_dev 0xB, Normal VGA
Para ver os módulos que nosso Kernel possui a nível de arquivo e ver quais Kernel temos, podemos olhar em /lib/modules/
:
# Listando os Kernels:
$ sudo ls /lib/modules
5.4.0-42-generic 5.4.0-66-generic 5.4.0-86-generic
# Vendo os Kernels por outro caminho:
$ sudo ls /boot/vmlinuz-*
/boot/vmlinuz-5.4.0-42-generic /boot/vmlinuz-5.4.0-66-generic /boot/vmlinuz-5.4.0-86-generic
# Listando os módulos do nosso Kernel:
$ sudo ls -l /lib/modules/$(uname -r)
total 5828
lrwxrwxrwx 1 root root 39 Sep 17 18:35 build -> /usr/src/linux-headers-5.4.0-86-generic
drwxr-xr-x 2 root root 4096 Sep 17 18:35 initrd
drwxr-xr-x 17 root root 4096 Sep 23 21:08 kernel
-rw-r--r-- 1 root root 1398916 Sep 23 21:11 modules.alias
-rw-r--r-- 1 root root 1375306 Sep 23 21:11 modules.alias.bin
-rw-r--r-- 1 root root 8105 Sep 17 18:35 modules.builtin
-rw-r--r-- 1 root root 25015 Sep 23 21:11 modules.builtin.alias.bin
-rw-r--r-- 1 root root 10257 Sep 23 21:11 modules.builtin.bin
-rw-r--r-- 1 root root 63546 Sep 17 18:35 modules.builtin.modinfo
-rw-r--r-- 1 root root 610290 Sep 23 21:11 modules.dep
-rw-r--r-- 1 root root 853209 Sep 23 21:11 modules.dep.bin
-rw-r--r-- 1 root root 330 Sep 23 21:11 modules.devname
-rw-r--r-- 1 root root 220079 Sep 17 18:35 modules.order
-rw-r--r-- 1 root root 895 Sep 23 21:11 modules.softdep
-rw-r--r-- 1 root root 614713 Sep 23 21:11 modules.symbols
-rw-r--r-- 1 root root 747828 Sep 23 21:11 modules.symbols.bin
drwxr-xr-x 3 root root 4096 Sep 23 21:08 vdso
zImage
Tinha limitação de 512KB de tamanho e era iniciada na memória baixa do S.O chamada low memory.
bzImage (big zImage)
É a evolução da zImage, não possui limitação de tamanho, é iniciada na memória alta do S.O, chamada high memory.