LPIC-2 tópico 201: Linux Kernel
Continuando os nossos estudos para a certificação LPIC-2, neste artigo iremos abordar o Linux Kernel.
Linux Kernel
Quando falamos em Linux, a maioria das pessoas associa o nome às diferentes distribuições existentes (como Debian, Ubuntu, CentOS, Kali, entre outras). Porém, o Linux é na verdade um Kernel, ou seja, o núcleo do sistema operacional. É o Kernel que efetivamente gerencia o acesso aos recursos do hardware.
Entender o seu funcionamento é importante não só para a prova 201-450, mas também para compreender as bases da operação de sistemas operacionais modernos. Detalhes de arquitetura de computadores e sistemas operacionais podem fazer parte de uma outra postagem, pois aqui iremos nos concentrar nos tópicos da LPIC-2.
Entendendo o versionamento do Kernel
A versão atual do Kernel Linux pode ser obtida oficialmente em https://kernel.org. No momento da escrita deste artigo, a versão atual do Kernel é a 6.2.10.
Vamos entender o motivo de tais números:
6 → Versão.
2 → Release principal.
10 → Patch/release secundária.
Vale notar que o código fonte do Kernel fica localizado em /usr/src/linux. Normalmente esse arquivo é um link simbólico para o diretório que contém o código da versão atual do Kernel.
Imagem do Kernel
A imagem do Kernel fica localizada em /boot/vmlinuz. Esse é o Kernel em formato executável e comprimido utilizando o formato gzip.
Módulos
São arquivos de extensão .ko e servem para estender as funções do Kernel em execução. Estão localizados em /lib/modules.
Compilação do Kernel
A compilação do Kernel pode ser dividida em três etapas: configuração, a compilação propriamente dita e a instalação.
Configuração
Antes de compilar o Kernel, é necessário instalar o pacote build-essential. Após isso, descompacte o arquivo baixado do https://kernel.org em /usr/src e crie um link simbólico para o diretório.
Entre no diretório /usr/src/linux e digite o comando make menuconfig. Ele irá abrir uma tela para que você selecione as configurações da compilação. É comum que erros ocorram e que você tenha que instalar pacotes ausentes. No meu caso, tive que instalar os pacotes libncurses-dev, flex e bison.
Um ponto importante é que as opções marcadas com um “M” indicam que o item será instalado como um módulo do Kernel, enquanto o “*” indica que será um built-in do Kernel.
A configuração realizada fica salva no arquivo .config. Uma variável interessante e que pode ser cobrada na prova é a CONFIG_LOCALVERSION, que indica o nome da sua compilação.
Compilação
Compile a imagem do Kernel com o comando make -j2 bzImage. A opção -j indica que dois processos serão utilizados para a compilação, o que a torna mais rápida.
A imagem do Kernel fica localizada em arch/x86/boot/bzImage. Após a compilação dele, é necessário compilar também os módulos com o comando make -j2 modules.
Instalação
Para efetivamente realizar a instalação do novo Kernel, utilize o comando make modules_install seguido do make install.
O próprio make install se encarrega de executar comandos como o update-initramfs e o update-grub. O primeiro gera o arquivo initrd, que contém a estrutura inicial para carregamento do Kernel durante o processo de boot. Já o segundo atualiza os arquivos do bootloader.
Gerando pacotes
O processo de compilação é bastante demorado, o que o torna bem cansativo de ser feito manualmente em cada máquina da sua rede. Para facilitar esse processo, você pode utilizar o comando make deb-pkg (Debian) ou make rpm-pkg (Red Hat-based) para gerar um pacote instalável do Kernel.
Dessa forma, você pode facilmente o instalar em outras máquinas sem a necessidade de realizar uma nova compilação (similar ao que ocorre quando utilizamos o comando apt upgrade). O arquivo .deb resultante fica localizado em /usr/src.
Limpeza
Uma vez que o processo de compilação e instalação for concluído, você pode realizar uma limpeza com o comando make clean.
A opção clean limpa todos os arquivos compilados. Uma outra opção útil é a mrproper, que também limpa os arquivos de configuração.
Gerenciamento e solução de problemas do Kernel em tempo real
O exame 201-450 aborda alguns comandos para gerenciamento e solução de problemas no Kernel. Entre eles:
uname: apresenta informações sobre o Kernel.
uname -a # todas as informações
uname -s # Kernel name
uname -r # Kernel release
uname -v # versão da compilação
O uname captura tais informações em tempo real por meio de arquivos localizados em /proc/sys/kernel (e.g., version, ostype).
sysctl: este comando é responsável por configurar parâmetros do Kernel em tempo de execução (configurações permanentes podem ser adicionadas no arquivo /etc/sysctl.conf). No exemplo abaixo, estamos bloqueando tráfego ICMP direcionado à nossa máquina.
lspci: lê informações de dispositivos conectados ao barramento PCI. O parâmetro -s apresenta informações de um dispositivo em específico.
lsusb: lista dispositivos conectados ao barramento USB. O parâmetro -d apresenta informações de um dispositivo em específico.
dmesg: exibe informações referentes ao boot e execução do Kernel. As informações são obtidas do Kernel Ring Buffer.
Módulos do sistema
Os módulos do sistema ficam localizados em /lib/modules e separados por diretórios, um para cada versão do Kernel. Entre os comandos para se trabalhar com módulos, estão:
lsmod: lista os módulos carregados no sistema.
modinfo: apresenta informações detalhadas sobre o módulo especificado.
insmod e rmmod: utilizados para carregar ou remover módulos do sistema. Esses comandos precisam do caminho completo do módulo.
modprobe: também utilizado para carregar ou remover (opção -r) módulos do sistema. Entretanto, não precisa do caminho completo do módulo.
udevadm monitor: monitora eventos do udev (processo que gerencia ações relacionadas a dispositivos). As configurações do udev estão localizadas em /etc/udev/udev.conf e suas regras em /etc/udev/rules.d/ ou /lib/udev/rules.d.
Conclusão
Neste artigo abordamos o processo de compilação do Kernel, bem como comandos úteis para visualização de informações, alteração de parâmetros e gerenciamento de dispositivos em tempo real.