Gerenciando módulos do kernel Linux

Gerenciando módulos do kernel Linux

Compreendendo o kernel Linux

O kernel Linux é o núcleo do sistema operacional Linux. Ele contém os principais componentes para abordar o hardware e permite comunicação e interação entre o usuário e o hardware. O kernel Linux não é um sistema monolítico, mas bastante flexível, e o kernel é estendido pelos chamados módulos de kernel.

O que é um módulo de kernel?

Em geral, um módulo de kernel é um “pedaço de código que pode ser carregado e descarregado no kernel sob demanda. Eles estendem a funcionalidade do kernel sem a necessidade de reiniciar o sistema ”[1]. Isso leva a uma grande flexibilidade durante a operação.

Além disso, “um módulo de kernel pode ser configurado como embutido ou carregado. Para carregar ou remover dinamicamente um módulo, ele deve ser configurado como um módulo carregado na configuração do kernel ”[1]. Isso é feito no arquivo de origem do kernel/usr/src/linux/.Config [2]. Os módulos embutidos são marcados com módulos "y" e carregáveis ​​com "M". Como exemplo, a Listagem 1 demonstra isso para o módulo SCSI:

Listagem 1: Declaração de uso do módulo SCSI

Config_scsi = y # módulo interno
Config_scsi = m # Módulo carregado
# Config_scsi # variável não está definido

Não recomendamos editar o arquivo de configuração diretamente, mas usar o comando "Make Config", "Make Menuconfig" ou "Make Xconfig" para definir o uso do módulo correspondente no kernel Linux.

Comandos do módulo

O sistema Linux vem com vários comandos diferentes para lidar com os módulos do kernel. Isso inclui listar os módulos atualmente carregados no kernel Linux, exibindo informações do módulo, além de carregar e descarregar módulos de kernel. Abaixo, explicaremos esses comandos com mais detalhes.

Para os kernels do Linux atuais, os seguintes comandos são fornecidos pelo pacote KMOD [3]. Todos os comandos são links simbólicos para o KMOD.

A lista atualmente carregada módulos com LSMOD

Começamos com o comando lsmod. O LSMod abrevia os “módulos de lista” e exibe todos os módulos atualmente carregados no kernel Linux formatando bem o conteúdo do arquivo /proc /módulos. A Listagem 2 mostra sua saída que consiste em três colunas: nome do módulo, o tamanho usado na memória e outros módulos de kernel que usam este específico.

Listagem 2: Usando LSMOD

$ lsmod
Tamanho do módulo usado por
CTR 12927 2
CCM 17534 2
SND_HRTIMER 12604 1
SND_SEQ 57112 1
SND_SEQ_DEVICE 13132 1 SND_SEQ
..
$

Encontre módulos disponíveis para o seu kernel atual

Pode haver módulos de kernel disponíveis que você ainda não conhece. Eles são armazenados no diretório /lib /módulos. Com a ajuda de encontrar, combinada com o comando uname, você pode imprimir uma lista desses módulos. "UNAME -R" apenas imprime a versão do kernel Linux atualmente em execução. Listagem 3 demonstra isso para um 3 mais velho.16.0-7 Linux
kernel, e mostra módulos para IPv6 e Irda.

Listagem 3: Exibindo módulos disponíveis (seleção)

$ find/lib/módulos/$ (uname -r) -name '*.ko '
/lib/módulos/3.16.0-7-AMD64/kernel/net/ipv6/ip6_vti.Ko
/lib/módulos/3.16.0-7-AMD64/kernel/net/ipv6/xfrm6_tunnel.Ko
/lib/módulos/3.16.0-7-AMD64/kernel/net/ipv6/ip6_tunnel.Ko
/lib/módulos/3.16.0-7-AMD64/kernel/net/ipv6/ip6_gre.Ko
/lib/módulos/3.16.0-7-AMD64/KERNEL/NET/IRDA/IRNET/IRNET.Ko
/lib/módulos/3.16.0-7-AMD64/KERNEL/NET/IRDA/IRLAN/IRLAN.Ko
/lib/módulos/3.16.0-7-AMD64/kernel/net/irda/irda.Ko
/lib/módulos/3.16.0-7-AMD64/KERNEL/NET/IRDA/IRCOMM/IRCOMM.Ko
/lib/módulos/3.16.0-7-AMD64/KERNEL/NET/IRDA/IRCOMM/IRCOMM-TTY.Ko
..
$

Exibir informações do módulo usando modinfo

O comando Modinfo diz mais sobre o módulo do kernel solicitado ("Informações do módulo"). Como parâmetro, o Modinfo requer o caminho completo do módulo ou simplesmente o nome do módulo. A Listagem 4 demonstra isso para o módulo IRDA Kernel que lida com a pilha de protocolo de acesso direto infravermelho.

Listagem 4: Informações do módulo de exibição

$ /sbin /modinfo irda
nome do arquivo:/lib/módulos/3.16.0-7-AMD64/kernel/net/irda/irda.Ko
Alias: Net-PF-23
Licença: Gpl
Descrição: a pilha do protocolo Linux Irda
Autor: Dag Brattli & Jean Tourrilhes
Depende: CRC-CCITT
Vermágico: 3.16.0-7-AMD64 SMP MOD_UNLOAD MODVERSIONS
$

A saída contém diferentes campos de informação, como o caminho completo para o módulo do kernel, seu nome de alias, licença de software, descrição do módulo, autores e internos do kernel. O campo "depende" mostra quais outros módulos do kernel depende.

Os campos de informação diferem de módulo para módulo. Para limitar a saída a um campo de informações específico, o Modinfo aceita o parâmetro "-f" (abreviação de "-field") seguido pelo nome do campo. Na Listagem 5, a saída é limitada às informações de licença disponibilizadas usando o campo de licença.

Listagem 5: exiba apenas um campo específico.

$ /sbin /modinfo -f licença Irda
Gpl
$

Nos kernels Linux mais recentes, um recurso de segurança útil está disponível. Isso abrange módulos de kernel assinados criptograficamente. Conforme explicado no site do projeto Linux Kernel [4], “Isso permite maior segurança do kernel, desaprovando o carregamento de módulos ou módulos não assinados
assinado com uma chave inválida. A assinatura do módulo aumenta a segurança, tornando mais difícil carregar um módulo malicioso no kernel. A verificação da assinatura do módulo é feita pelo kernel para que não seja necessário ter “bits de espaço de usuários confiáveis.”A figura abaixo mostra isso para o
Módulo parport_pc.

Mostrar configuração do módulo usando o ModProbe

Cada módulo de kernel vem com uma configuração específica. O comando modProbe seguido pela opção "-c" (abreviação de "-ShowConfig") lista a configuração do módulo. Em combinação com o Grep, esta saída é limitada a um símbolo específico. A Listagem 6 demonstra isso para opções IPv6.

Listagem 6: Mostrar configuração do módulo

$ /SBIN /MODPROBE -C | Grep IPv6
Alias ​​net_pf_10_proto_0_type_6 dccp_ipv6
Alias ​​net_pf_10_proto_33_type_6 dccp_ipv6
Alias ​​nf_conntrack_10 nf_conntrack_ipv6
Alias ​​nf_nat_10 nf_nat_ipv6
Alias ​​nft_afinfo_10 nf_tables_ipv6
Alias ​​NFT_CHAIN_10_NAT NFT_CHAIN_NAT_IPV6
Alias ​​NFT_CHAIN_10_ROUTE NFT_CHAIN_ROUTE_IPV6
Alias ​​nft_expr_10_reject nft_reject_ipv6
Alias ​​símbolo: nf_defrag_ipv6_enable nf_defrag_ipv6
Alias ​​Symbol: nf_nat_icmpv6_reply_translation nf_nat_ipv6
Símbolo de alias: nft_af_ipv6 nf_tables_ipv6
Alias ​​símbolo: nft_reject_ipv6_eval nft_reject_ipv6
$

Mostre dependências do módulo

O kernel Linux foi projetado para ser modular e a funcionalidade é distribuída por vários módulos. Isso leva a várias dependências do módulo que podem ser exibidas usando o ModProbe novamente. A Listagem 7 usa a opção "-Show-Dependes" para listar as dependências para o módulo i915.

Listagem 7: Mostrar dependências do módulo

$ /SBIN /MODPROBE-Show depende I915
insmod/lib/módulos/3.16.0-7-AMD64/kernel/drivers/i2c/i2c-core.Ko
insmod/lib/módulos/3.16.0-7-AMD64/kernel/drivers/i2c/algos/i2c-algo-bit.Ko
insmod/lib/módulos/3.16.0-7-AMD64/kernel/Drivers/Thermal/Thermal_sys.Ko
insmod/lib/módulos/3.16.0-7-AMD64/kernel/drivers/gpu/drm/drm.Ko
insmod/lib/módulos/3.16.0-7-AMD64/kernel/drivers/gpu/drm/drm_kms_helper.Ko
insmod/lib/módulos/3.16.0-7-AMD64/kernel/drivers/acpi/vídeo.Ko
insmod/lib/módulos/3.16.0-7-AMD64/kernel/drivers/acpi/botão.Ko
insmod/lib/módulos/3.16.0-7-AMD64/kernel/drivers/gpu/drm/i915/i915.Ko
$

Para exibir as dependências como uma árvore semelhante ao comando "árvore" ou "lsblk", o projeto Modtree [5] pode ajudar (veja a figura abaixo para a árvore do módulo i915). Embora esteja disponível gratuitamente no GitHub, exige que algumas adaptações cumpram as regras para o software livre e se tornem parte de uma distribuição Linux como um pacote.

Módulos de carregamento

Carregar um módulo para um kernel em execução pode ser feito por dois comandos - Insmod ("Inserir Module") e ModProbe. Esteja ciente de que há uma diferença leve, mas importante, entre esses dois: o insmod não resolve as dependências do módulo, mas o ModProbe é mais inteligente e faz isso.

Listagem 8 mostra como inserir o módulo Irda Kernel. Observe que o Insmode funciona com o caminho completo do módulo, enquanto o ModProbe está feliz com o nome do módulo e olha para si mesmo na árvore do módulo para o kernel Linux atual.

Listagem 8: Inserindo um módulo de kernel

# insmod/lib/módulos/3.16.0-7-AMD64/kernel/net/irda/irda.Ko
..
# ModProbe Irda

Módulos de descarga

O último passo lida com módulos de descarga de um kernel em execução. Novamente, existem dois comandos disponíveis para esta tarefa - ModProbe e Rmmod ("Remover Módulo"). Ambos os comandos esperam o nome do módulo como um parâmetro. A Listagem 9 mostra isso para remover o módulo IRDA do kernel Linux em execução.

Listagem 9: Removendo um módulo de kernel

# rmmod irda
..
# modprobe -r irda
..

Conclusão

Lidar com módulos do kernel Linux não é grande mágica. Apenas alguns comandos para aprender, e você é o mestre da cozinha.

Obrigado

O autor gostaria de agradecer a Axel Beckert (ETH Zurique) e Saif du Plessis (Hothead Studio Cape Town) por sua ajuda ao preparar o artigo.

Links e referências

  • [1] Módulo Kernel, Arch Linux Wiki, https: // wiki.Archlinux.org/índice.php/kernel_module
  • [2] Configuração do kernel, https: // tldp.org/howto/scsi-2.4-howto/kconfig.html
  • [3] Kmod, https: // git.núcleo.org/pub/scm/utils/kernel/kmod/kmod.git
  • [4] Instalação de assinatura do módulo de kernel, https: // www.núcleo.org/doc/html/v4.15/admin-guide/sinalização do módulo.html
  • [5] Modtree, https: // github.com/falconindy/modtree