DKMS Dynamic Kernel Module Support

49
 DKMS - Dynamic Kernel Module Support Rômulo Jales

description

Apresentação para o VI encontro de software Livre da escola politécnica de Pernambuco.Não sei o que houve, que a organização da apresentação ficou bagunçada. Peguei do próprio site do evento.

Transcript of DKMS Dynamic Kernel Module Support

Page 1: DKMS  Dynamic Kernel Module Support

 

DKMS ­ Dynamic Kernel Module SupportRômulo Jales

Page 2: DKMS  Dynamic Kernel Module Support

 

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 noobDesenvolvimento 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

Page 3: DKMS  Dynamic Kernel Module Support

 

Fé, fe na catucagem

Page 4: DKMS  Dynamic Kernel Module Support

 

O que veremos?

Introdução a módulos para Linux

DKMS

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

Page 5: DKMS  Dynamic Kernel Module Support

 

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

Page 6: DKMS  Dynamic Kernel Module Support

 

Exemplos:

Device Drivers

Modems

Sistemas de arquivos

Ntfs

Controle

Cpufreq_ondemand

Page 7: DKMS  Dynamic Kernel Module Support

 

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

extra

Page 8: DKMS  Dynamic Kernel Module Support

 

Mais sobre os arquivos...

/etc/[modprobe.conf,modprobe.d]

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

/proc/modules

/sys/module

Page 9: DKMS  Dynamic Kernel Module Support

 

Comandos para gerenciamento

insmod

rmmod

modprobe

depmod

lsmod 

modinfo

Providos pelo pacote module­init­tools

Page 10: DKMS  Dynamic Kernel Module Support

 

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 INSERÇÂO

Page 11: DKMS  Dynamic Kernel Module Support

 

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

Page 12: DKMS  Dynamic Kernel Module Support

 

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

Page 13: DKMS  Dynamic Kernel Module Support

 

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

Page 14: DKMS  Dynamic Kernel Module Support

 

modprobe

Para adicionar

modprobe MODULOPara remover

modprobe ­r MODULO

Page 15: DKMS  Dynamic Kernel Module Support

 

Page 16: DKMS  Dynamic Kernel Module Support

 

lsmod

Mostra o status dos módulos em execução

É uma forma mais amigável de ver o conteúdo de /proc/modules

lsmod

Page 17: DKMS  Dynamic Kernel Module Support

 

modinfo

Extrai informações do módulo como:

Licença

Autor

Vermagic

Dependências de outros módulos

Versão

Page 18: DKMS  Dynamic Kernel Module Support

 

Dependências

Vermagic

UTS_RELEASE

LINUX_VERSION_CODE

KERNEL_VERSION

Arquitetura do sistema

Page 19: DKMS  Dynamic Kernel Module Support

 

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 POLI\n");    return 0;}static void hello_exit(void){    printk(KERN_ALERT "Xau, pessoal\n");}module_init(hello_init);module_exit(hello_exit)

Page 20: DKMS  Dynamic Kernel Module Support

 

Compilando...

 obj­m := hello.o

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

modules

Page 21: DKMS  Dynamic Kernel Module Support

 

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=";MODULE_INFO(srcversion,"471D708B0804FE26B554DB1");

Page 22: DKMS  Dynamic Kernel Module Support

 

Modinfo de hello.ko

filename:       hello.kolicense:        GPLsrcversion:     471D708B0804FE26B554DB1depends:        Vermagic:  2.6.29.6­217.2.8.fc11.i586  SMP mod_unload 586 

Page 23: DKMS  Dynamic Kernel Module Support

 

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

Page 24: DKMS  Dynamic Kernel Module Support

 

Agora suponhamos...

Você é um fornecedor de módulo

ATI

REALTEK

SUN

Catucador

Observemos o cenário

Page 25: DKMS  Dynamic Kernel Module Support

 

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?

Page 26: DKMS  Dynamic Kernel Module Support

 

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%

Page 27: DKMS  Dynamic Kernel Module Support

 

Um módulo dois sistemas

Filename: /lib/modules/2.6.24­21­server/kernel/fs/fuse/fuse.koalias:          char­major­10­229license:        GPLdescription:    Filesystem in Userspaceauthor:         Miklos Szeredi <[email protected]>srcversion:     E541E638476D5621E6382F8depends:        vermagic: 2.6.24­21­server SMP mod_unload 686 

Page 28: DKMS  Dynamic Kernel Module Support

 

Um módulo dois sistemasfilename:       /lib/modules/2.6.29.6­217.2.8.fc11.i586/kernel/fs/fuse/fuse.koalias:          char­major­10­229license:        GPLdescription:    Filesystem in Userspaceauthor:         Miklos Szeredi <[email protected]>srcversion:     900C9E5D6A8FFEA327DB1CFdepends:        vermagic:       2.6.29.6­217.2.8.fc11.i586 SMP mod_unload 586

Page 29: DKMS  Dynamic Kernel Module Support

 

DKMSDYNAMIC KERNEL MODULE SUPPORT

Page 30: 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)

Page 31: DKMS  Dynamic Kernel Module Support

 

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.

Page 32: DKMS  Dynamic Kernel Module Support

 

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.

Page 33: DKMS  Dynamic Kernel Module Support

 

Instalando...

Presente em distribuições como:

Fedora

Ubuntu

...

Da fonte

make installPossível gerar debs e rpms

Page 34: DKMS  Dynamic Kernel Module Support

 

Page 35: DKMS  Dynamic Kernel Module Support

 

Usando

Apenas um comando dkms...

install

build

remove

uninstall

Page 36: DKMS  Dynamic Kernel Module Support

 

dkms.conf

Semelhante a um shellscript

Variáveis primitivas:

PACKAGE_NAME

PACKAGE_VERSION

BUILT_MODULE_NAME

MAKE

DEST_MODULE_LOCATION

CLEAN

Page 37: DKMS  Dynamic Kernel Module Support

 

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

Page 38: DKMS  Dynamic Kernel Module Support

 

DEST_MODULE_LOCATION

Algumas distribuições não funciona

UBUNTU

SUSE

Fedora...

O alvo sempre será /updates/dkms

Page 39: DKMS  Dynamic Kernel Module Support

 

Iniciando o processo

Criar o diretório /usr/src/modulo­versao

Copiar o fonte para o diretório

Configurar o arquivo dkms.conf

Page 40: DKMS  Dynamic Kernel Module Support

 

Passo 1

dkms add ­m modulo ­v versao

Será criado um diretório:

/var/lib/dkms/modulo/versao

Page 41: DKMS  Dynamic Kernel Module Support

 

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>

Page 42: DKMS  Dynamic Kernel Module Support

 

Passo 3

dkms install ­m modulo ­v versao ­k versao

É instalado no sistema principal em /lib/module/`uname ­r`/DEST_MODULE_LOCATION

Page 43: DKMS  Dynamic Kernel Module Support

 

Desinstalar

dkms uninstall ­m module ­v versao ­k kernel

Apenas retira o modulo para o kernel especificado.

Page 44: DKMS  Dynamic Kernel Module Support

 

Remover

dkms remove ­m modulo ­v versao ­k kernel

dkms remove ­m modulo ­v versal ­­all

Page 45: DKMS  Dynamic Kernel Module Support

 

Empacotamento

RPM

dkms mkrpm ­m versao ­v versao ­k kernel

DEB

dkms mkdeb ...

Page 46: DKMS  Dynamic Kernel Module Support

 

dkms_autoinstaller

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

Page 47: DKMS  Dynamic Kernel Module Support

 

Nosso modulo

PACKAGE_NAME="hello”PACKAGE_VERSION="1.0"BUILT_MODULE_NAME[0]="hello"DEST_MODULE_LOCATION[0]=/kernel/extraMAKE[0]="make"CLEAN[0]=”make cleanAUTOINSTALL=”yes”

Page 48: DKMS  Dynamic Kernel Module Support

 

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

Page 49: DKMS  Dynamic Kernel Module Support

 

Dúvidas?

<[email protected]>