Como carregar módulos do kernel comprimidos no Ubuntu?

3

Eu gostaria de usar módulos do kernel compactados com LZMA no meu sistema. Infelizmente, a Canoncial deixa esse recurso desativado tanto no kernel quanto nas ferramentas de espaço do usuário. Aqui está o que eu fiz até agora:

  1. Compile e instale o 14.04.05-LTS atual kernel (v4.4.19) com:

    CONFIG_MODULE_COMPRESS=y
    CONFIG_MODULE_COMPRESS_XZ=y
    

    Após a instalação, vejo agora um monte de .ko.xz arquivos em /lib/modules/4.4.19-37.56+/kernel/ .

  2. Retroceda o pacote kmod_22 do Xenial (16.04) para o Trusty (14.04) configurado com a opção --with-xz . Isso parece funcionar também.

  3. Executar update-initrams -u -k 4.4.19-37.56+ .

O que funciona até agora:

  • operações arbitrárias em módulos não compactados (como aqueles construídos pelo DKMS):

    $ modinfo nvidia_370
    filename:       /lib/modules/4.4.19-37.56+/updates/dkms/nvidia_370.ko
    […]
    
  • mostrando os módulos compactados pelo caminho completo:

    modinfo /lib/modules/4.4.19-37.56+/kernel/fs/jfs/jfs.ko.xz
    
  • carregando módulos compactados sem (faltando) dependências pelo caminho completo:

    insmod /lib/modules/4.4.19-37.56+/kernel/fs/jfs/jfs.ko.xz
    
  • descarregando esses módulos:

    rmmod jfs
    

O que não funciona:

  • Descarregando com modprobe -r .

  • Qualquer outra operação com apenas um nome de pacote, mas sem caminho, e. g .:

    # insmod jfs
    insmod: ERROR: could not load module jfs: No such file or directory
    # modprobe jfs
    modprobe: FATAL: Module jfs not found in directory /lib/modules/4.4.19-37.56+
    

Portanto, para módulos sem dependências como jfs há uma solução alternativa onde eu posso especificar o caminho completo do arquivo de módulo para insmod , mas isso é chato e não executa resolução de dependência como modprobe .

Eu suponho que o diretório do módulo do kernel de alguma forma não pega arquivos de módulo compactados. Como posso carregar módulos de kernel comprimidos pelo nome com modprobe ?

    
por David Foerster 09.09.2016 / 14:51

1 resposta

2

Você precisa executar depmod .

depmod (por padrão) lê os módulos em /lib/modules/$(uname -r) , descobre quais símbolos eles exportam e também o que eles mesmos precisam, então, usar essas informações cria as dependências de símbolos (módulos) entre os módulos e as salva no arquivo /lib/modules/$(uname -r)/modules.dep e também cria um hash binário /lib/modules/$(uname -r)/modules.dep.bin .

Também cria dois outros arquivos:

  • /lib/modules/$(uname -r)/modules.symbols (e é hash binário /lib/modules/$(uname -r)/modules.dep.bin ): contém os símbolos que cada módulo exporta

  • /lib/modules/$(uname -r)/modules.devname : contém a entrada /dev que precisa ser criada para os módulos necessários, contém o nome do módulo, o nome da entrada /dev e os números maiores e menores

Apenas para observar, você também pode executar depmod para uma versão específica do kernel ou em um módulo específico, verifique man depmod .

    
por 09.09.2016 / 20:09