DKMS Dynamic Kernel Module Support

Preview:

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.

Citation preview

 

DKMS ­ Dynamic Kernel Module SupportRô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 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

 

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

extra

 

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

 

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 MODULOPara 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 POLI\n");    return 0;}static void hello_exit(void){    printk(KERN_ALERT "Xau, pessoal\n");}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=";MODULE_INFO(srcversion,"471D708B0804FE26B554DB1");

 

Modinfo de hello.ko

filename:       hello.kolicense:        GPLsrcversion:     471D708B0804FE26B554DB1depends:        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.koalias:          char­major­10­229license:        GPLdescription:    Filesystem in Userspaceauthor:         Miklos Szeredi <miklos@szeredi.hu>srcversion:     E541E638476D5621E6382F8depends:        vermagic: 2.6.24­21­server SMP mod_unload 686 

 

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 <miklos@szeredi.hu>srcversion:     900C9E5D6A8FFEA327DB1CFdepends:        vermagic:       2.6.29.6­217.2.8.fc11.i586 SMP mod_unload 586

 

DKMSDYNAMIC 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 installPossí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/extraMAKE[0]="make"CLEAN[0]=”make cleanAUTOINSTALL=”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>

Recommended