Aula #7 - Configuração do modulo do kernel - modprobe, modinfo, rmmode, insmod, lsmod e depmod


O kernel do Linux faz uso extensivo de módulos, que contêm programas importantes que são carregados e descarregados conforme necessário depois que o sistema for iniciado. 




Muitos módulos incorporam drivers de dispositivo para controlar o hardware. Outros módulos podem controlar protocolos de rede, suportar diferentes tipos de sistemas de arquivos e muitos outros fins. 
Os parâmetros podem ser especificados ao carregar módulos para controlar seu comportamento. 

O resultado final é uma grande flexibilidade e agilidade na resposta às mudanças nas condições e necessidades.

 Muitos recursos do kernel do Linux são projetados para serem parte integral do kernel quando ele é compilado, ou para ser adicionado (ou removido) mais tarde, como módulos, conforme necessário. Logo todos os componentes do kernel que não são essenciais são compilados e distribuídos como módulos.

Tais módulos podem(ou não) ser um driver de dispositivo. Por exemplo, eles podem implementar um determinado protocolo de rede ou sistema de arquivos. Mesmo nos casos em que a funcionalidade quase sempre será necessária, a capacidade de carregar e descarregar como um módulo facilita o desenvolvimento, e testes já que carregar e descarregar módulos não depende de reiniciar o computador.
Mesmo com o uso generalizado dos módulos do kernel, o Linux mantém um kernel monolítico, ao invés de microkernel. Isso ocorre porque quando um módulo é carregado, ele se torna parte integral do kernel, com poucas restrições. O módulo tem acesso a todos os sub-sistemas do kernel acessando a memória diretamente, e não através de troca de mensagens como acontece em um microkernel.

O Linux não é o único sistema operacional que usa módulos; O Solaris e o AIX, fazem uso de mecanismos semelhantes que são chamados de extensões do kernel. No entanto, o Linux usa módulos de uma forma particularmente robusta.


 Há vários programas que são utilizados com os módulos do kernel:
  •     lsmod: Lista módulos carregados.
  •     insmod: Carrega módulos diretamente.
  •     rmmod: Remove módulos.

    modprobe: Carrega ou descarrega módulos, usando um banco de dados de módulos pré-construído com informações de dependência.

    depmod: reconstrói o banco de dados de dependência do módulo; necessário para o modprobe e para o modinfo.

    modinfo: Exibe informações sobre um módulo.
  
  
  
  

Carregar e descarregar módulos


Carregar e descarregar módulos deve ser feito pelo usuário root.  
Caso o caminho completo para o arquivo do módulo seja conhecido, é possível carregar o módulo com:

$ sudo /sbin/insmod /nome_do_modulo.ko
 

Normalmente os módulos instalados junto com o kernel estão na pasta /lib/modules/.  

Um módulo do kernel sempre tem a extensão  .ko, como em e1000e.ko, ext4.ko, e usbserial.ko.

 

Módulos do kernel são para uma versão do kernel específica e deve ser EXATAMENTE a mesma do kernel em execução, ou não poderá ser carregado. 
Eles devem ser compilados com o próprio kernel, ou posteriormente em um sistema com o código fonte do kernel com a configuração de compilação usada para o kernel em execução.

É possível ver a lista de módulos carregados com o comando lsmod:


$ lsmod


Module                     Size   Used by
...
usb_storage               50309   0
vmnet                     38408   13
fuse                      74097   5
....
snd_hda_codec_analog       9813   1
snd_hda_codec_generic     47551   1 snd_hda_codec_analog
snd_hda_intel             19279   4
snd_usb_audio            140055   3
....
soundcore                  5891   2 snd,snd_hda_codec
nouveau                  911957   4
ahci                      23547   8
libahci                   21534   1 ahci
skge                      29924   0
.....

É possível remover módulos com o comando:

$ sudo /sbin/rmmod nome_do_modulo

Para remover não é necessário fornecer nem o caminho do módulo no disco nem a extensão .ko.

 

modprobe


Na maioria dos casos os módulos não são carregados e descarregados com insmod e rmmod. 
Em vez disso, utiliza-se o modprobe

como em:

$ sudo /sbin/modprobe module_name

$ sudo /sbin/modprobe -r module_name

 

A segunda forma sendo utilizada para a remoção. Para o modprobe funcionar, os módulos devem ser instalados em local apropriado, geralmente sob   /lib/modules/$(uname -r) onde $(uname -r) retorna a versão do kernel em execução como 3.18.3.
Existem algumas coisas importantes para ter em mente ao carregar e descarregar módulos:
    

  • É impossível descarregar um módulo que está sendo utilizado por um ou mais módulos. Use o lsmod  para verificar as dependências. 
  • É impossível descarregar um módulo que está sendo utilizado por um ou mais processos, que também pode ser visto com o lsmod. No entanto, existem módulos que não respeitam o mecanismo de contagem de referência, como módulos de dispositivos de rede, porque seria muito difícil substituir temporariamente um módulo sem desligar toda a pilha de rede. 

  • Quando um módulo é carregado com modprobe o sistema irá carregar automaticamente outros módulos que precisam ser carregados primeiro.


  • Quando um módulo é descarregado com modprobe -r, o sistema vai automaticamente descarregar outros módulos que foram carregados como dependências, se eles não estiverem sendo mais utilizados.
   

modinfo

O modinfo pode ser usado para ver informações sobre módulos do kernel (eles estando carregados ou não):


$ /sbin/modinfo meu_modulo
$ /sbin/modinfo
/meu_modulo.ko

 

Por exemplo:

$ modinfo e1000


filename: /lib/modules/3.1.0/kernel/drivers/net/e1000/e1000.ko
version: 7.3.21-k8-NAPI
license: GPL
description: Intel(R) PRO/1000 Network Driver
author: Intel Corporation,

srcversion: E005D763BC7910379BDD09A
alias: pci:v00008086d00002E6Esv*sd*bc*sc*i*
alias: pci:v00008086d000010B5sv*sd*bc*sc*i*
alias: pci:v00008086d00001099sv*sd*bc*sc*i*
....
alias: pci:v00008086d00001000sv*sd*bc*sc*i*
depends: vermagic: 3.1.0 SMP preempt mod_unload
parm: TxDescriptors:Number of transmit descriptors (array of int)
parm: RxDescriptors:Number of receive descriptors (array of int)
parm: Speed:Speed setting (array of int)
parm: Duplex:Duplex setting (array of int)
parm: AutoNeg:Advertised auto-negotiation setting (array of int)
parm: FlowControl:Flow Control setting (array of int)
parm: XsumRX:Disable or enable Receive Checksum offload (array of int)
parm: TxIntDelay:Transmit Interrupt Delay (array of int)
parm: TxAbsIntDelay:Transmit Absolute Interrupt Delay (array of int)
parm: RxIntDelay:Receive Interrupt Delay (array of int)
parm: RxAbsIntDelay:Receive Absolute Interrupt Delay (array of int)
parm: InterruptThrottleRate:Interrupt Throttling Rate (array of int)

parm: SmartPowerDownEnable:Enable PHY smart power down (array of int)
parm: copybreak:Maximum size of packet that is copied to a new buffer on receive (uint)
parm: debug:Debug level (0=none,...,16=all) (int)

Este exibe informações sobre a versão, o nome do arquivo, hardware compatível com o módulo, e quais parâmetros podem ser configurados.
Também existe muita informação sobre os módulos no /sys, e para o exemplo anterior o local correto para procurar seria /sys/module/e1000 e a lista de parâmetros pode ser lida e alguns parâmetros podem ser alterados usando /sys/module/e1000/parameters. 

Vamos mostrar como ajustar os parâmetros a seguir.
Muitos módulos podem ser carregados pela linha de comando, como em:

$ sudo /sbin/insmod /e1000e.ko debug=2 copybreak=256

ou se o módulo estiver corretamente instalado, é mais fácil com:


$ sudo /sbin/modprobe e1000e debug=2 copybreak=256


Arquivos na pasta /etc/modprobe.d controlam alguns parâmetros usados pelo modprobe. Estes parâmetros incluem aliases (ou rótulos, ou apelidos) nome do módulo e opções. Este arquivo também é útil para criar uma lista negra de módulos para evitar que módulos indesejáveis sejam carregados na inicialização.

As configurações afetam carregar e remover módulos, e elas podem ser alteradas sempre que necessário.

O formato dos arquivos na pasta /etc/modprobe.d é simples: um comando por linha, linhas em branco e linhas começando com # são ignoradas (útil para adicionar comentários). Uma barra invertida no final de uma linha faz com que ele continue na linha seguinte, o que pode tornar o arquivo um pouco mais limpo.

Mais vistos no mês:

As melhores distribuições Linux para 2017

Teste de Performance de Rede com Iperf

TuxMath - Tux, do Comando da Matemática. Ensino e diversão a crianças.

Aula #14 - Os sistemas de arquivos ext2/ext3/ext4

Modelo Firewall Completo em Iptables para pequena rede/office

DHCP - Guia Completo

OPNsense - Firewall Open Source

SSD no linux

Administração de sistema e Deploys: Ansible, Chef, Fabric, Puppet ou Salt?

Oracle Linux 7.0 Server com Xfce - Instalação e configurações iniciais