DKMS Dynamic Kernel Module Support
-
Upload
romulo-jales -
Category
Documents
-
view
1.701 -
download
0
description
Transcript of DKMS Dynamic Kernel Module Support
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 sobdemanda
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 moduleinittools
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 MODULOf > 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...
objm := 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.6217.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.2421server/kernel/fs/fuse/fuse.koalias: charmajor10229license: GPLdescription: Filesystem in Userspaceauthor: Miklos Szeredi <[email protected]>srcversion: E541E638476D5621E6382F8depends: vermagic: 2.6.2421server SMP mod_unload 686
Um módulo dois sistemasfilename: /lib/modules/2.6.29.6217.2.8.fc11.i586/kernel/fs/fuse/fuse.koalias: charmajor10229license: GPLdescription: Filesystem in Userspaceauthor: Miklos Szeredi <[email protected]>srcversion: 900C9E5D6A8FFEA327DB1CFdepends: vermagic: 2.6.29.6217.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/moduloversao
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/moduloversao
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/moduloversao 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