Qual é a sequência que carrega o módulo do kernel linux na inicialização? Como a prioridade é definida para eles?

9

Eu tenho um módulo do kernel do Linux que compilei dinamicamente. Como é adicionado à inicialização? Existem muitos .koarquivos no /lib/modules. Como é definida a prioridade para o carregamento desses módulos?

ganeshredcobra
fonte

Respostas:

11

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, kmodque é 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 .

modprobeusa 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.

Cachinhos Dourados
fonte
3

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-toolspacote 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/modprobepara 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.aliasque mapeia essas designações sistemáticas para nomes de módulos. Esta tabela é gerada depmode 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 localsubdiretório se ele não existir) e execute depmod -apara 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 -apara analisar suas dependências e adicione o nome do módulo /etc/modules.

Gilles 'SO- parar de ser mau'
fonte
Não consigo encontrar /var/lib/modulesnem /lib/modules/*/localnem encontrar menção a isso no Google ou na depmodpágina de manual. Olhado em CentOS 6.4, 7.4 e Ubuntu 19.04.
itsadok
@itsadok Tenho certeza de que pretendia escrever /lib/modules/…. Basta criar o localsubdiretório ( depmodpercorre /lib/module/$VERSIONrecursivamente).
Gilles 'SO- stop be evil'