Como o Linux escolhe quais módulos carregar?

3

Estou executando o Ubuntu 12.04.3 LTS

uname -a
Linux guru 3.8.0-34-generic #49~precise1 [...] x86_64 [...]

Quando eu reinicio, vejo o seguinte no syslog:

Dec 29 06:30:22 guru kernel: [...] e1000e: Intel PRO/1000 Network Driver - 2.1.4-k

No entanto:

cd /lib/modules/3.8.0-34-generic/kernel/drivers/net/ethernet/intel/e1000e
strings e1000e.ko | grep -i version
version=2.5.4-NAPI

modinfo e1000e me fornece a mesma versão ( 2.5.4-NAPI )

Na inicialização, eu acreditei que o kernel percorreu /lib/modules/{version string}/kernel/drivers e carregou o que precisava ...

mas claramente estou enganado

Existem duas outras versões do e1000e.ko nesta unidade de inicialização:

/lib/modules/3.8.0-29-generic/kernel/drivers/net/ethernet/intel/e1000e/e1000e.ko
/lib/modules/3.8.0-33-generic/kernel/drivers/net/ethernet/intel/e1000e/e1000e.ko

E ambos são versão 2.1.4-k ... o kernel de alguma forma está pegando módulos desses locais mais antigos?

Exclua:

grep -r e1000e /etc/*
/etc/udev/rules.d/70-persistent-net.rules:# PCI device 0x8086:/sys/devices/pci0000:00/0000:00:19.0 (e1000e)

em outras palavras, nenhuma menção a este módulo em /etc/modprobe.d/blacklist* ou /etc/init/module-init-tools.conf , etc.

Eu noto que: /lib/modules/3.8.0-34-generic/kernel/drivers/net/ethernet/intel/e1000e/e1000e.ko used to be version 2.1.4-k ... mas depois fiz o upgrade por link e reiniciei ... o que trouxe-me para onde estou agora

Existe uma maneira de consultar um módulo atualmente em execução para perguntar onde o disco foi carregado?

- sk

Stuart Kendrick

    
por skendric 29.12.2013 / 16:27

1 resposta

0

AFAIK, modprobe carrega apenas os mesmos módulos de versão do kernel em execução, ou seja, de:

/lib/modules/<kerne-version>/

modinfo mostra o caminho completo do módulo SUPPOSED a ser executado pelo kernel atual (não aquele atualmente em execução na verdade). Então você não pode retransmitir isso. Estou usando o Ubuntu 14.04, Exemplo:

$ modinfo e1000e
filename:       /lib/modules/3.13.0-38-generic/kernel/drivers/net/ethernet/intel/e1000e/e1000e.ko
version:        2.3.2-k
license:        GPL
description:    Intel(R) PRO/1000 Network Driver
author:         Intel Corporation, <[email protected]>
srcversion:     FAFC167239309C03F11F440
alias:          pci:v00008086d000015A3sv*sd*bc*sc*i*
alias:          pci:v00008086d000015A2sv*sd*bc*sc*i*
alias:          pci:v00008086d000015A1sv*sd*bc*sc*i*
[...]
alias:          pci:v00008086d000010A4sv*sd*bc*sc*i*
alias:          pci:v00008086d0000105Fsv*sd*bc*sc*i*
alias:          pci:v00008086d0000105Esv*sd*bc*sc*i*
depends:        ptp
intree:         Y
vermagic:       3.13.0-38-generic SMP mod_unload modversions 
signer:         Magrathea: Glacier signing key
sig_key:        2A:DE:ED:EA:6C:BA:0B:95:A6:22:22:40:71:1F:49:C8:72:07:BB:F6
sig_hashalgo:   sha512
parm:           debug:Debug level (0=none,...,16=all) (int)
parm:           copybreak:Maximum size of packet that is copied to a new buffer on receive (uint)
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:           IntMode:Interrupt Mode (array of int)
parm:           SmartPowerDownEnable:Enable PHY smart power down (array of int)
parm:           KumeranLockLoss:Enable Kumeran lock loss workaround (array of int)
parm:           WriteProtectNVM:Write-protect NVM [WARNING: disabling this can lead to corrupted NVM] (array of int)
parm:           CrcStripping:Enable CRC Stripping, disable if your BMC needs the CRC (array of int)

Se não aparecer, tente: modinfo -n e1000e ou modinfo --filename e1000e

/lib/modules/3.13.0-38-generic/kernel/drivers/net/ethernet/intel/e1000e/e1000e.ko

É possível usar insmod para carregar um módulo específico por caminho completo. Mas isso pode ser prejudicial e pode danificar o hardware. No entanto, na maioria dos casos, o kernel aplicará verificações rigorosas, gerando alguns erros como (observe 3.13.0-37-generic carregado com êxito):

$ sudo insmod /lib/modules/3.11.0-24-generic/kernel/drivers/net/ethernet/intel/e1000e/e1000e.ko
insmod: ERROR: could not insert module /lib/modules/3.11.0-24-generic/kernel/drivers/net/ethernet/intel/e1000e/e1000e.ko: Invalid module format
$ sudo insmod /lib/modules/3.13.0-30-generic/kernel/drivers/net/ethernet/intel/e1000e/e1000e.ko
insmod: ERROR: could not insert module /lib/modules/3.13.0-30-generic/kernel/drivers/net/ethernet/intel/e1000e/e1000e.ko: Invalid module format
$ sudo insmod /lib/modules/3.13.0-36-generic/kernel/drivers/net/ethernet/intel/e1000e/e1000e.ko
insmod: ERROR: could not insert module /lib/modules/3.13.0-36-generic/kernel/drivers/net/ethernet/intel/e1000e/e1000e.ko: Invalid parameters
$ sudo insmod /lib/modules/3.13.0-37-generic/kernel/drivers/net/ethernet/intel/e1000e/e1000e.ko
$ sudo rmmod /lib/modules/3.13.0-37-generic/kernel/drivers/net/ethernet/intel/e1000e/e1000e.ko
$ sudo insmod /lib/modules/3.13.0-38-lowlatency/kernel/drivers/net/ethernet/intel/e1000e/e1000e.ko
insmod: ERROR: could not insert module /lib/modules/3.13.0-38-lowlatency/kernel/drivers/net/ethernet/intel/e1000e/e1000e.ko: Invalid module format

Acho que sysfs mostra o módulo carregado real:

$ more /sys/module/e1000e/version 
2.3.2-k
$ more /sys/module/e1000e/srcversion 
FAFC167239309C03F11F440

Eu não pude ver como 3.13.0-37-generic & amp; 3.13.0-38-generic no meu caso tem as mesmas versões.

Nota:

Para completar, os módulos do kernel carregados dinamicamente são manipulados por dkms , carregados de:

/var/lib/dkms/<driver-name>/<driver-last-version>/<kernel-version>/<kernel-arch>/module/ 
    
por user.dz 23.10.2014 / 14:24