Jump to content
From ArchWiki
Status de tradução: Esse artigo é uma tradução de Dynamic Kernel Module Support. Data da última tradução: 2020-03-20. Você pode ajudar a sincronizar a tradução, se houver alterações na versão em inglês.

Da Wikipédia:

  Dynamic Kernel Module Support (DKMS) (em Português: Suporte Dinâmico de Módulo de Kernel) é um programa/framework que permite gerar módulos do kernel do Linux cujos fontes residam fora da árvore de fontes. O conceito é poder ter os módulos automaticamente reconstruídos quando uma nova versão do kernel é instalada.

Isto significa que o usuário não precisa esperar que uma companhia, projeto ou mantenedor de pacotes lancem uma nova versão do módulo. Desde a introdução dos hooks do pacman, a recompilação de módulos do kernel é automaticamente providenciada quando um kernel é atualizado.

## Instalação

Instale o pacote dkms e o header para o kernel (ou kernels, se mais de um estiver instalado). Por exemplo, para o kernel padrão linux este deverá ser linux-headers. Outros kernels têm seus respectivos headers.

Um bom número de módulos que residem fora da árvore do kernel tem sua variante para DKMS; alguns deles estão em repositórios oficiais, outros são encontrados no AUR.

## Atualizações

Apesar da recompilação de módulos DKMS ser comumente discreta durante uma atualização de kernel, pode ocorrer da recompilação falhar. Você deve prestar uma atenção extra nas saídas do pacman. Isto se aplica em particular se o sistema depende do módulo DKMS para inicializar e/ou se você usar um kernel personalizado que não esteja nos repositórios oficiais.

Para lidar com alterações no kernel, correções de bugs ou adicionar recursos necessários extra, considere atualizar o pacote DKMS antes de reinicializar o sistema.

## Uso

Utilização para invocar DKMS manualmente.

É possível usar autocompletar fazendo:

    # source /usr/share/bash-completion/completions/dkms

### Listar módulos

Para listar a situação atual dos módulos, versões e kernels em árvore:

    # dkms status

### Recompilar módulos

Recompilar todos os módulos para o kernel atualmente em execução:

    # dkms autoinstall

ou para um kernel específico:

    # dkms autoinstall -k 3.16.4-1-ARCH

Para compilar um módulo específico para o kernel atualmente em execução:

    # dkms install -m nvidia -v 334.21

ou simplesmente:

    # dkms install nvidia/334.21

Para compilar um módulo para todos os kernels:

    # dkms install nvidia/334.21 --all

### Remover módulos

Para remover um módulo (antigos que não foram automaticamente removidos):

    # dkms remove -m nvidia -v 331.49 --all

ou simplesmente:

    # dkms remove nvidia/331.49 --all

Se o pacote dkms é removido, a informação pertinente a arquivos de compilação de módulos anteriores é perdida. Se é este o caso, navegue por `/usr/lib/modules/KERNELVERSION-ARCH` e remova todos os arquivos e diretórios que não estiverem mais em uso.

## Criação de pacote DKMS

Aqui há alguns guias a serem seguidos durante a criação de um pacote DKMS.

### Nome do pacote

Pacotes DKMS são nomeados acrescentando "-dkms" ao nome do pacote original.

A variável `$_pkgname` é comumente usada abaixo de `$pkgname` para descrever o nome do pacote menos o sufixo "-dkms" (por exemplo, `_pkgname=${pkgname%-*}`). Isto é útil para ajudar a manter as similaridades entre o pacote PKGBUILD original e sua variante DKMS.

### Dependências

Dependências devem ser herdadas da versão original com dkms adicionado e linux-headers removido (listado pelo pacote DKMS como opcional).

### Local da fonte de compilação

Fontes de compilação devem ir para dentro de (este é o diretório padrão de compilação para DKMS):

    /usr/src/NOME_PACOTE-VERSÃO_PACOTE

No diretório do pacote, uma configuração DKMS diz ao DKMS como compilar o módulo (`dkms.conf`), incluindo as variáveis `NOME_PACOTE` e `VERSÃO_PACOTE`.

- `NOME_PACOTE` - o nome do projeto atual (geralmente `$_pkgname` ou `$_pkgbase`).
- `VERSÃO_PACOTE` - por convenção, também este deve ser `$pkgver`.

### Aplicação de correções (patching)

As fontes (sources) podem ser corrigidas tanto diretamente no PKGBUILD como através do `dkms.conf`.

### Carregamento automático do módulo em .install

O carregamento e descarregamento dos módulos deve caber ao usuário. Considere a possibilidade de um módulo falhar ao ser carregado.

Também perceba que você não deve chamar `depmod` explicitamente para atualizar as dependências de seu módulo do kernel. Pacman chama as funções do DKMS `dkms install` e `dkms remove` automaticamente como hooks. `dkms install` garante que `depmod` seja chamado ao final do processo. `dkms install` depende de `dkms build` (para compilar a fonte para o kernel atual), que por sua vez depende de `dkms add` (para adicionar um link simbólico de `/var/lib/dkms/<pacote>/<versão>/source` para `/usr/src/<pacote>`).

### Exemplo

Aqui um exemplo de um pacote que edita `dkms.conf` de acordo com seu nome de pacote e versão.

#### PKGBUILD

    PKGBUILD

    # Maintainer: foo <foo(at)example(dot)org>
    # Contributor: bar <bar(at)example(dot)org>

    _pkgbase=example
    pkgname=example-dkms
    pkgver=1
    pkgrel=1
    pkgdesc="The Example kernel modules (DKMS)"
    arch=('i686' 'x86_64')
    url="https://www.example.org/"
    license=('GPL2')
    depends=('dkms')
    conflicts=("${_pkgbase}")
    install=${pkgname}.install
    source=("${url}/files/tarball.tar.gz"
            'dkms.conf'
            'linux-3.14.patch')
    md5sums=(use 'updpkgsums')

    prepare() {
      cd ${_pkgbase}-${pkgver}

      # Patch
      patch -p1 -i "${srcdir}"/linux-3.14.patch

    }

    package() {
      # Install
      make DESTDIR="${pkgdir}" install

      # Copy dkms.conf
      install -Dm644 dkms.conf "${pkgdir}"/usr/src/${_pkgbase}-${pkgver}/dkms.conf

      # Set name and version
      sed -e "s/@_PKGBASE@/${_pkgbase}/" \
          -e "s/@PKGVER@/${pkgver}/" \
          -i "${pkgdir}"/usr/src/${_pkgbase}-${pkgver}/dkms.conf

      # Copy sources (including Makefile)
      cp -r ${_pkgbase}/* "${pkgdir}"/usr/src/${_pkgbase}-${pkgver}/
    }

#### dkms.conf

    dkms.conf

    PACKAGE_NAME="@_PKGBASE@"
    PACKAGE_VERSION="@PKGVER@"
    MAKE[0]="make --uname_r=$kernelver"
    CLEAN="make clean"
    BUILT_MODULE_NAME[0]="@_PKGBASE@"
    DEST_MODULE_LOCATION[0]="/kernel/drivers/misc"
    AUTOINSTALL="yes"

#### .install

Uma vez que pacman possui hooks DKMS implementados, você não deve especificar uma configuração estrita para DKMS em seu arquivo .install. Chamadas a `dkms install` e `dkms remove` serão automáticas.

## Veja também

- Linux Journal: Exploring Dynamic Kernel Module Support

Category:

- Kernel (Português)