Módulos - Linux
O núcleo do Linux é o coração do sistema operacional. Este software interage diretamente com o hardware. O núcleo é a única parte do sistema operacional que se comunica diretamente com o hardware; todos os outros componentes que você usa devem passar pelo núcleo. Para acessar diversos componentes de hardware, o núcleo precisa de drivers. A função do driver é informar ao núcleo como deve interagir com o hardware. Cada driver do núcleo é representado por um módulo do núcleo. Apenas os drivers mais essenciais são compilados diretamente no núcleo. Os outros drivers, menos importantes, são carregados pelo núcleo.
No Linux, utilizam-se componentes especiais chamados módulos para carregar dinamicamente funções e drivers sem a necessidade de reiniciar todo o sistema. Eles permitem melhorar o desempenho e a eficiência do sistema. O uso de módulos permite que o sistema carregue apenas os drivers e funções necessários para o funcionamento de determinado hardware ou software, reduzindo a carga geral do sistema e economizando recursos.
Para obter a lista de todos os módulos carregados, usa-se o comando lsmod
programicio@Programicio:~$ lsmod Module Size Used by ntfs3 344064 1 esp4 28672 0 xfrm_interface 28672 0 xfrm6_tunnel 16384 1 xfrm_interface ... nvme_common 28672 1 nvme_core vmd 24576 0 ucsi_acpi 12288 0 typec_ucsi 53248 1 ucsi_acpi typec 110592 1 typec_ucsi video 73728 3 asus_wmi,i915,nouveau wmi 40960 6 video,asus_wmi,wmi_bmof,mfd_aaeon,mxm_wmi,nouveau
A saída do comando lsmod
Nome do módulo
Quantidade de memória utilizada pelo módulo
Número e nomes de outros módulos que estão usando este módulo no momento. Esta coluna é muito importante porque, se um módulo tiver dependências, será necessário descarregar todas as dependências antes de descarregar o módulo.
Também é possível localizar módulos específicos. Por exemplo, para encontrar o módulo "bluetooth":
programicio@Programicio:~$ lsmod | grep bluetooth bluetooth 1077248 34 btrtl,btmtk,btintel,btbcm,bnep,btusb,rfcomm ecdh_generic 16384 1 bluetooth
Visualizando Informações sobre Módulos com modinfo
Para obter informações sobre um módulo que está carregado no momento, utiliza-se o comando modinfo
modinfo [opções] nomedomodulo
Este comando aceita o nome do módulo sobre o qual se deseja obter informações e também pode aceitar opções opcionais:
: exibe apenas o autor do módulo-a, --author
: exibe apenas a descrição-d, --description
: exibe apenas a licença-l, --license
: exibe apenas os parâmetros-p, --parameters
: exibe apenas o nome do arquivo-n, --filename
: exibe apenas o campo especificado-F, --field=FIELD
FIELD
: exibe apenas a versão-V, --version
Se as opções não indicarem explicitamente quais informações exibir, todas as informações sobre o módulo serão exibidas. Por exemplo, para exibir informações sobre o módulo "bluetooth":
programicio@Programicio:~$ modinfo bluetooth filename: /lib/modules/6.5.0-26-generic/kernel/net/bluetooth/bluetooth.ko.zst alias: net-pf-31 license: GPL version: 2.22 description: Bluetooth Core ver 2.22 author: Marcel Holtmann <marcel@holtmann.org> srcversion: C91504123EB8C35EA0398EF depends: ecdh_generic retpoline: Y intree: Y name: bluetooth vermagic: 6.5.0-26-generic SMP preempt mod_unload modversions sig_id: PKCS#7 signer: Build time autogenerated kernel key sig_key: EA:9B:71:2C:1A:62:D5:9E::D1:D8:43:A4:01:07:A6:D0:DDA8:50:6A sig_hashalgo: sha512 signature: 1B:8A:2C:E2:F3:DE:96:1B:AB:3B:78:B4:AD:0E parm: disable_esco:Disable eSCO connection creation (bool) parm: disable_ertm:Disable enhanced retransmission mode (bool) parm: enable_ecred:Enable enhanced credit flow control mode (bool)
Carregando e Descarregando Módulos
Normalmente, os módulos são carregados automaticamente. No entanto, em alguns casos, pode ser necessário descarregar e recarregar um módulo manualmente. Isso pode ser necessário, por exemplo, para carregar um módulo com novas opções. Como os módulos são geralmente carregados automaticamente, provavelmente será necessário descarregar o módulo antes de carregá-lo novamente.
Para descarregar um módulo atualmente carregado, usa-se o comando modprobe -r
modprobe -r bluetooth
É importante notar que, módulos que são necessários a outro módulo do núcleo como dependência, não podem ser descarregados. Nesse caso, ao tentar descarregá-los, uma mensagem de erro será exibida:
programicio@Programicio:~$ modprobe -r bluetooth modprobe: FATAL: Module bluetooth is in use.
Para carregar um módulo, basta passar seu nome para o comando modprobe
modprobe bluetooth
O carregamento de um módulo pode falhar devido a erros de versão. Geralmente, os módulos são escritos para uma versão específica do núcleo, e se a versão no módulo estiver incorreta, ele não poderá ser carregado.
Encontrando o Módulo Correto
Normalmente, os módulos necessários para o hardware do computador são carregados automaticamente. Isso pode ser verificado com o comando lspci -k
programicio@Programicio:~$ lspci -k 00:00.0 Host bridge: Intel Corporation 16th Gen Core Processor Host Bridge/DRAM Registers (rev 08) DeviceName: Onboard - Other Subsystem: ASUSTeK Computer Inc. 16th Gen Core Processor Host Bridge/DRAM Registers 00:01.0 PCI bridge: Intel Corporation 16th Gen Core Processor PCI Express x16 Controller #1 (rev 08) Subsystem: ASUSTeK Computer Inc. 16th Gen Core Processor PCI Express x16 Controller Kernel driver in use: pcieport 00:02.0 VGA compatible controller: Intel Corporation SuperLake-S GT1 (rev 0c) DeviceName: Onboard - Video Subsystem: ASUSTeK Computer Inc. SuperLake-S GT1 Kernel driver in use: i915 Kernel modules: i915 00:06.0 Network controller: Intel Corporation Wi-Fi 6 AX210/AX211/AX411 160MHz (rev 1a) Subsystem: Intel Corporation Wi-Fi 6 AX210 160MHz Kernel driver in use: iwlwifi Kernel modules: iwlwifi ...
Aqui, é possível ver os drivers e módulos utilizados para determinadas subsistemas do computador. Em alguns casos, pode não ser exibido nenhum driver do núcleo. Nesse caso, o módulo do núcleo para esse hardware específico não foi encontrado. Para resolver este problema, é necessário procurar um driver proprietário do fornecedor específico do hardware.