LPIC-2: Entenda o DKMS de forma simples e prática
Fala galera! No artigo de hoje eu vou mostrar o que é o DKMS e qual a sua função, mostrando um exemplo bem prático e objetivo. Lembrando que este é um dos conteúdos para a prova da certificação LPIC-2.
O que é o DKMS?
DKMS é um acrônimo para Dynamic Kernel Module Support. É um software/framework utilizado para compilar dinamicamente módulos para o Kernel.
O DKMS foi desenvolvido pelo time de engenharia da Dell em 2003.
Mas o que o DMKS possui de diferente?
Imagine que você está utilizando qualquer distribuição Linux e uma atualização de Kernel é enviada pelo repositório da sua distribuição. Logo após essa atualização, no menu do Grub, irão aparecer mais opções, sendo estas o Kernel novo e o Kernel antigo. Veja na foto abaixo um exemplo do CentOS:
Neste caso temos o Kernel 3.10.0-514 e o 3.10.0-693.
O que acontece nessas situações é que, os módulos que você compilou manualmente no Kernel 3.10.0-514 não funcionarão no Kernel 3.10.0-693 depois da atualização. Entretanto, se você compilou este módulo com o DKMS, ele será automaticamente copiado para o Kernel 3.10.0-693 durante a atualização do Kernel.
Além disso, se você compilar um módulo pelo DKMS, ele será instalado automaticamente para todos os Kernels instalados.
Como compilar um módulo utilizando o DKMS?
Primeiramente, você precisa de um módulo. Aqui vou dar um exemplo compilando o módulo de uma Realtek 8101.
Vamos extrair o conteúdo do modulo:
$ tar xvjf 0008-r8101-1.032.04.tar.bz2
Depois de extrair, vamos acessar o diretório e validar o seu conteúdo:
Geralmente, módulos vem com uma pasta src em seu conteúdo. Este diretório deve ser movido para /usr/src utilizando como padrão o nome do dispositivo e a sua respectiva versão.
Obs.: Ele deve ser movido para /usr/src porque o DKMS trabalha desta forma:
$ mv src/ /usr/src/r8101-1.032.04
Agora vamos acessar a pasta que criamos e listar o seu conteúdo:
Veja que temos um arquivo Makefile, ou seja, podemos facilmente instalar com os comandos de compilação de source code.
Entretanto, ele será instalado somente no Kernel atual. Então na próxima atualização esse módulo não estará mais lá.
Resolvendo este problema
Para solucionar este problema, vamos preparar o ambiente para compilar utilizando o DKMS.
Primeiro, precisamos criar um arquivo de configuração do DKMS dentro do diretório do módulo.
$ vim dkms.conf
Bom, neste arquivo nós vamos somente definir valores para determinadas variáveis do DKMS. O DKMS por sua vez irá ler essas variáveis e entenderá o que deve fazer.
Vamos colocar o seguinte conteúdo:
- PACKAGE_NAME=“r8101″
- PACKAGE_VERSION=“1.032.04″
- BUILT_MODULE_NAME[0]=“r8101″
- DEST_MODULE_LOCATION[0]="/updates”
- AUTOINSTALL=“yes”
O PACKAGE_NAME define o nome do pacote que vamos instalar. Neste caso é o r8101. Lembre-se que ele deve ser o mesmo que está no nome da pasta dentro de /usr/src.
O PACKAGE_VERSION é a versão do pacote que estamos instalando e deve ser o mesmo da pasta que criamos.
Obs.: Os itens citados acima serão usados pelo comando do DKMS posteriormente para encontrar o arquivo de configuração, então lembre-se dos valores definidos.
O BUILT_MODULE_NAME[0] é o nome do módulo que estamos compilando que se encontra dentro da pasta:
No meu caso é o r8101 mesmo.
Porém, imagine que você baixou um “pacotão” de módulos da Realtek. Logo, haverão mais módulos para sererem compilados, aí você vai adicionando na lista. Como por exemplo:
- BUILT_MODULE_NAME[0]=”r8101”
- BUILT_MODULE_NAME[1]=”r8169”
Já a opção DEST_MODULE_LOCATION[0] é o local onde estaremos instalando este módulo. O diretório padrão é o /lib/modules/
No nosso caso, o /updates existe dentro do diretório padrão:
Note também que a opção DEST_MODULE_LOCATION possui uma numeração. Essa númeração trabalhará de acordo com o BUILD_MODULE_NAME, ou seja, a opção __ será instalada no local __.
E, para finalizar, a opção AUTOINSTALL vai usar o serviço do DKMS durante o boot para instalar o módulo. Então, se por algum motivo você instalar um novo Kernel sem usar algum módulo do DKMS, com esta opção marcada, ele será instalado durante o boot no Kernel novo.
Obs.: Todas as opções do dkms.conf podem ser encontradas no manual do programa.
Compilando e instalando
Bom, agora que nosso arquivo dkms.conf está pronto, vamos iniciar a compilação do módulo:
$ dkms add -m r8101 -v 1.032.04
Obs.: Lembrando que estes comandos utilizando -m e -v irão buscar as respectivas informações em /usr/src.
Agora vamos compilar o módulo:
$ dkms build -m r8101 -v 1.032.04
Agora vamos apenas instalar o módulo:
$ dkms install -m r8101 -v 1.032.04
Pronto, nosso módulo está instalado e compilado em todas as versões de Kernel instaladas. Além disso, está sendo gerenciado pelo DKMS para ser instalado em novos Kernels posteriormente.
Vamos verificar se instalou mesmo:
Está lá o nosso módulo compilado.
Outros pontos importantes
Também podemos ver o status de um módulo gerenciado pelo DKMS com o seguinte comando:
$ dkms status
Outra observação que quero fazer é referente ao próprio dkms.conf. Por padrão, ele vai utilizar os comandos normais de compilação (make, make install).
Logo, se o módulo que você baixou utiliza outro modo de compilação como por exemplo cmake, você deve alterar no dkms.conf com a variável MAKE[0].
Então era isso galera. Até a próxima e bons estudos!
Se tiver alguma dúvida ou sugestão de conteúdo, por favor, comente!