DKMS ­ Dynamic Kernel Module Support
             Rômulo Jales




                   
Apresentação
Rômulo de Barros Correia Jales
  10º período do curso de engenharia da 
    computação (FINALMENTE!!!)
  10 anos de uso de Linux, mas ainda um noob
  Desenvolvimento de device drivers,  sistemas 
   embarcados e aplicações Linux.
  Atualmente na Fundação para Inovações 
    Tecnológicas – FITec
  www.romulojales.com <­ Bagunçado ao extremo
                           
Fé, fe na catucagem


          
O que veremos?
Introdução a módulos para Linux
DKMS




Não veremos desenvolvimento de módulos !!!


                        
Módulos – O que são?
São peças que se encaixam em tempo de 
 execução ao kernel com o intuito de:


  Expandir uma funcionalidade
  Ampliar Controle


São carregados sob­demanda


                          
Exemplos:
Device Drivers
  Modems
Sistemas de arquivos
  Ntfs
Controle
  Cpufreq_ondemand



                        
Onde estão no meu sistema Linux?
/lib/modules/`uname ­r`/
Contém as referencias para:
  Dependências ­> modules.dep
  Ordem ­> modules.ord
  Apelidos > modules.alias
  Mapeamentos ­> modules.{usb,pci,...}map
Diretório de construção ­> build
Diretórios de modulos
  kernel                      
Mais sobre os arquivos...
/etc/[modprobe.conf,modprobe.d]


/lib/modules/`uname ­r`/build


/proc/modules


/sys/module
                         
Comandos para gerenciamento
insmod
rmmod
modprobe
depmod
lsmod 
modinfo


Providos pelo pacote module­init­tools
                        
insmod
Carrega um módulo


insmod MODULO [opções do modulo]

  P/ opções do módulo vide o manual do módulo




ALGUNS KERNELS NÂO SUPORTAM 
                  
rmmod
Remove um módulo
rmmod ­fw MODULO
 ­f ­> força a remoção
 ­w ­> espera o termino do uso




 ALGUNS KERNELS NÂO SUPORTAM REMOÇÂO
                          
depmod
Cria/Atualiza os arquivos modules.dep e de 
 mapeamento. 
Varre todo o /lib/modules/`uname ­r` lendo os 
 símbolos de cada módulo
depmod [opções]
  ­a ­> todos os módulos
  ­b ­> Varre outro diretório base

                          
modprobe
Agrega funções de insmod rmmod
Depende de um bom uso do depmod
Incrementa mais opções a gestão de módulos
Pode forçar situações que dão erro no insmod e 
 rmmod
Qualquer mensagem ou erro será vista pelo 
 comando dmesg

                        
modprobe
Para adicionar
modprobe MODULO
Para remover
modprobe ­r MODULO




                     
 
lsmod
Mostra o status dos módulos em execução
É uma forma mais amigável de ver o conteúdo de 
 /proc/modules
lsmod




                       
modinfo
Extrai informações do módulo como:
Licença
Autor
Vermagic
Dependências de outros módulos
Versão


                       
Dependências
Vermagic
UTS_RELEASE
LINUX_VERSION_CODE
KERNEL_VERSION
Arquitetura do sistema




                          
Ok, show me the code!
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("GPL");
static int hello_init(void){
    printk(KERN_ALERT "Olá, VI encontro de sl POLIn");
    return 0;
}
static void hello_exit(void){
    printk(KERN_ALERT "Xau, pessoaln");
}
module_init(hello_init);
module_exit(hello_exit)
                            
Compilando...


 obj­m := hello.o


all:
    make ­C /lib/modules/`uname ­r`/build M=$(shell pwd) 
modules



                             
Código intermediário
#include <linux/module.h>
#include <linux/vermagic.h>
#include <linux/compiler.h>
MODULE_INFO(vermagic, VERMAGIC_STRING);
struct module __this_module
__attribute__((section(".gnu.linkonce.this_module"))) = {
 .name = KBUILD_MODNAME,
 .init = init_module,
#ifdef CONFIG_MODULE_UNLOAD
 .exit = cleanup_module,
#endif
 .arch = MODULE_ARCH_INIT,
};
static const char __module_depends[]
__used
                                 
__attribute__((section(".modinfo"))) = "depends=";
Modinfo de hello.ko


filename:       hello.ko
license:        GPL
srcversion:     471D708B0804FE26B554DB1
depends:        
Vermagic:        2.6.29.6­217.2.8.fc11.i586  SMP 
mod_unload 586 



                         
Carregando nosso módulo...
insmod hello.ko
dmesg | tail
Olá, VI encontro de sl POLI
rmmod hello
demsg | tail
xau, Vi encontro de sl Poli


                               
Agora suponhamos...
Você é um fornecedor de módulo
  ATI
  REALTEK
  SUN
  Catucador
Observemos o cenário



                        
Cenário
2^12344535634563472134123 builds de kernel
  Ou seja 2^12344535634563472134123 vermagic.o
  Algumas distros num mesmo release apresentam 
    mais de um kernel (e.g. Fedora!)
Quantas arquiteturas temos mesmo?
Quantas pessoas se dispõem a compilar um 
 módulo?


                         
Ou seja...
Para cada vermagic diferente e arquitetura 
 diferente um novo build do módulo.
Para cada arquitetura disponível um build novo
Para cada atualização da distro um build novo
A chance disso quebrar é de 100%




                         
Um módulo dois sistemas

Filename: /lib/modules/2.6.24­21­
server/kernel/fs/fuse/fuse.ko
alias:          char­major­10­229
license:        GPL
description:    Filesystem in Userspace
author:         Miklos Szeredi <miklos@szeredi.hu>
srcversion:     E541E638476D5621E6382F8
depends:        
vermagic: 2.6.24­21­server SMP mod_unload 686 
                         
Um módulo dois sistemas
filename:       
/lib/modules/2.6.29.6­217.2.8.fc11.i586/kernel/fs/fu
se/fuse.ko
alias:          char­major­10­229
license:        GPL
description:    Filesystem in Userspace
author:         Miklos Szeredi <miklos@szeredi.hu>
srcversion:     900C9E5D6A8FFEA327DB1CF
depends:        
vermagic:       2.6.29.6­217.2.8.fc11.i586 SMP 
mod_unload 586                
DKMS
DYNAMIC KERNEL MODULE SUPPORT




               
O que é DKMS?
Um framework para auxiliar o build, 
 empacotamento e manutenção de módulos
Feito em shell script
Não é uma ferramenta de desenvolvimento!!
GPLv2
Desenvolvido pela DELL (um provedor de 
 módulos)

                         
Quais os objetivos?
Permitir a sysadmin saber o real estado dos 
 modulos instalados
Reduzir o tamanho do Makefile
Impactar o menos possível na complicada tarefa 
  de fazer um modulo (basta um arquivo)
Fácil para vários perfis de usuários: 
 desenvolvedores, administradores e usuários 
 comuns.

                         
O que dá para fazer?
Abstrair a versão do kernel que roda no cliente.
Abstrair a versão, quando possível, que roda no 
 cliente.
Testar amplamente o número de kernels e 
 arquiteturas.




                         
Instalando...
Presente em distribuições como:
  Fedora
  Ubuntu
  ...
Da fonte
  make install
        Possível gerar debs e rpms



                                 
 
Usando
Apenas um comando dkms...
  install
  build
  remove
  uninstall




                     
dkms.conf
Semelhante a um shellscript
Variáveis primitivas:
  PACKAGE_NAME
  PACKAGE_VERSION
  BUILT_MODULE_NAME
  MAKE
  DEST_MODULE_LOCATION
  CLEAN
                         
PACKAGE_NAME
 Define o nome do pacote. Deve ter o mesmo nome 
  do modulo de /usr/scr/modulo­versao
PACKAGE_VERSION
 Define a versão corrente do modulo
BUILT_MODULE_NAME
 O nomo do modulo, é o modulo objeto
DEST_MODULE_LOCATION
 Onde será instalo o modulo a partir de 
  /lib/modules/`uname ­r`
MAKE  & CLEAN
 O comando de build e limpeza
                          
DEST_MODULE_LOCATION
Algumas distribuições não funciona
  UBUNTU
  SUSE
  Fedora...
O alvo sempre será /updates/dkms




                        
Iniciando o processo
Criar o diretório /usr/src/modulo­versao
Copiar o fonte para o diretório
Configurar o arquivo dkms.conf




                          
Passo 1
dkms add ­m modulo ­v versao
Será criado um diretório:
  /var/lib/dkms/modulo/versao




                           
Passo 2
dkms build ­m modulo ­v versao
Será copiado o /usr/src/modulo­versao para 
 /var/lib/dkms/modulo/versao/build
Caso queira especificar um kernel adicione a flag 
 ­k <VERSAO>




                         
Passo 3
dkms install ­m modulo ­v versao ­k versao
É instalado no sistema principal em 
 /lib/module/`uname 
 ­r`/DEST_MODULE_LOCATION




                         
Desinstalar
dkms uninstall ­m module ­v versao ­k kernel
Apenas retira o modulo para o kernel 
 especificado.




                         
Remover
dkms remove ­m modulo ­v versao ­k kernel
dkms remove ­m modulo ­v versal ­­all




                        
Empacotamento
RPM
 dkms mkrpm ­m versao ­v versao ­k kernel
DEB
 dkms mkdeb ...




                         
dkms_autoinstaller
Serviço que detecta um kernel novo e realiza 
 todo o processo automaticamente.




                         
Nosso modulo


PACKAGE_NAME="hello”
PACKAGE_VERSION="1.0"
BUILT_MODULE_NAME[0]="hello"
DEST_MODULE_LOCATION[0]=/kernel/extra
MAKE[0]="make"
CLEAN[0]=”make clean
AUTOINSTALL=”yes”

                     
Executando
dkms add ­m hello ­v 1.0
dkms build ­m hello ­v 1.0
dkms install ­m hello ­v 1.0
modprobe hello
Pronto!!! 
Agora qualquer novo kernel não teremos mais 
 que reinstalar, rebuildar um hello.ko

                          
Dúvidas?

<romulojales@gmail.com>




            

DKMS ­ Dynamic Kernel Module Support