Eu tenho um módulo do kernel do Linux que compilei dinamicamente. Como é adicionado à inicialização? Existem muitos .ko
arquivos no /lib/modules
. Como é definida a prioridade para o carregamento desses módulos?
fonte
Eu tenho um módulo do kernel do Linux que compilei dinamicamente. Como é adicionado à inicialização? Existem muitos .ko
arquivos no /lib/modules
. Como é definida a prioridade para o carregamento desses módulos?
Eles não são carregados automaticamente na inicialização ou em qualquer outro momento, embora muitos deles acabem sendo carregados durante a inicialização. Existem três mecanismos diferentes pelos quais isso acontece:
Solicitação de espaço no usuário: que abrange tudo, desde os serviços init ao udev até a linha de comando. Init ou udev são provavelmente os meios mais diretos se você deseja carregar um módulo específico no momento da inicialização.
Dispositivo hotplugged: Quando você conecta algo a, por exemplo, USB ou PCI, o kernel detecta isso e solicita um módulo apropriado com base em como o dispositivo se identifica.
Protocolo necessário ou outra implementação : Quando o kernel precisar fazer algo, como ler um sistema de arquivos, e descobrir que não possui o conhecimento necessário, solicitará um módulo.
Observe que nos últimos dois eu usei a frase "request a module" - isso ocorre porque o kernel realmente é carregado através de um daemon de espaço de usuário, kmod
que é executado /sbin/modprobe
. De acordo com Wolfgang Mauerer no Linux Kernel Architecture , existem apenas ~ 100 pontos diferentes no kernel 2.6, onde ele chama uma request_module()
função interna .
modprobe
usa um banco de dados de MODULE_ALIAS's instalados. Elas são especificadas no código-fonte do módulo explicitamente ou derivadas do MODULE_DEVICE_TABLE, que é uma lista de IDs de dispositivos OEM que o módulo atende.
Muitos sistemas são configurados para usar um initrd ou initramfs . Estas são imagens do sistema de arquivos carregadas pelo gerenciador de inicialização e disponibilizadas para o kernel antes de montar a partição raiz. Isso permite que os drivers necessários para montar a partição raiz (drivers de disco, drivers de sistema de arquivos, mapeador de dispositivos ou drivers de volume lógico,…) sejam compilados como módulos e carregados no initrd / initramfs.
Os scripts de inicialização no initrd ( /linuxrc
) ou initramfs ( /init
) normalmente carregam alguns módulos e localizam o sistema de arquivos raiz. Cada distribuição tem sua própria configuração. O Ubuntu usa um initramfs que é montado a partir de componentes no initramfs-tools
pacote e regenerado para cada kernel com base nos drivers necessários para montar o sistema de arquivos raiz.
Após a montagem do sistema de arquivos raiz, durante a inicialização do sistema, os módulos listados em /etc/modules
(Debian,…) ou /etc/modules.conf
(Red Hat, Arch,…) são carregados. Esse arquivo geralmente lista alguns módulos, se houver. A maioria dos módulos é carregada sob demanda.
Quando o kernel detecta algum hardware para o qual não possui um driver, ou alguns outros componentes, como protocolos de rede ou algoritmos criptográficos, ele chama /sbin/modprobe
para carregar o módulo. Para drivers de hardware, o kernel passa nomes que codificam a identificação PCI, a identificação USB ou outra designação sistemática do hardware. Há uma tabela /lib/modules/$VERSION/modules.alias
que mapeia essas designações sistemáticas para nomes de módulos. Esta tabela é gerada depmod
e lida por modprobe
.
Se você tiver um módulo extra do kernel que você compilou manualmente para um dispositivo de hardware, solte-o /lib/modules/$VERSION/local
(crie o local
subdiretório se ele não existir) e execute depmod -a
para gerar novamente o banco de dados de alias. Se o módulo é para algum recurso incomum que o kernel não consegue detectar automaticamente, solte-o /lib/modules/$VERSION/local
, execute-o depmod -a
para analisar suas dependências e adicione o nome do módulo /etc/modules
.
/var/lib/modules
nem/lib/modules/*/local
nem encontrar menção a isso no Google ou nadepmod
página de manual. Olhado em CentOS 6.4, 7.4 e Ubuntu 19.04./lib/modules/…
. Basta criar olocal
subdiretório (depmod
percorre/lib/module/$VERSION
recursivamente).