2021年04月03日

dkms。そんなにも難しくない感じ? linuxデバイスドライバーの反映等

以下は、archlinuxの場合です。
(ほかでもやりましたが、ほぼ同じ)

作業をやる場所は、伝統的に/usr/srcということを
受け入れて、、、先般買ったWI-U2-433DHPなる
usb2.0の11.ac対応のwifiアダブターに、
rtl8812auというlinux用ドライバーがgitにありまして、
そこからcloneして(落としてきて)、/usr/srcにmvし、
名前をdkmsが納得する名前に変更。中に入って、
(ここまでのコマンドは、
http://fedoranize.seesaa.net/archives/20210322-1.htmlに)

$ sudo dkms add -m rtl8812au -v 4.2.2
$ sudo dkms build -m rtl8812au -v 4.2.2
$ sudo dkms install -m rtl8812au -v 4.2.2


add ⇒ build ⇒ install の3段論法するだけ。

-m = module名 (表札?)
 ※モジュールの実態名は、dkms.confにある如く8812au
-v = version

システム内に存在するが、起動していない
カーネルに入れる場合は、
$ sudo dkms --no-depmod add -m rtl8812au -v 4.2.2 -k 5.11.11-arch1-1
$ sudo dkms --no-depmod build -m rtl8812au -v 4.2.2 -k 5.11.11-arch1-1
$ sudo dkms --no-depmod install -m rtl8812au -v 4.2.2 -k 5.11.11-arch1-1

$ sudo reboot
5.11.11-arch1-1で、起動。仕上げに、
$ sudo depmod
をすれば、network-manager-applet等で、アクセスポイントが
見えるようになり、アダプターを
選んぶと小窓が出て、パスワード入力。

-k = 入れたいkernelのversion名

という感じを覚えておけば、難しくないです。

rtl8812auドライバーには、dkms.confというファイルがあり、
PACKAGE_NAME=8812au
PACKAGE_VERSION=4.2.2

DEST_MODULE_LOCATION=/kernel/drivers/net/wireless
BUILT_MODULE_NAME=8812au

MAKE="'make' all KVER=$kernelver"
CLEAN="'make' clean"
AUTOINSTALL="yes"


至ってシンプルで、
真似れば、じぶんでも書けそうです。

カーネルが変わったことをどうやって探知し、
モジュールを引き継ぐか、については、
まだ勉強不足でわかりません。
カーネルのモジュールディレクトリ
/usr/lib/modules/に、前のバージョンのフォルダが残って
いない、ということは、dkmsは後始末もするみたいです。
dkmsでなくモジュール単体インストールしていると、
それだけ入った以前のカーネルバージョン名の
付いたフォルダが、一人ぼっちになってしまった
モジュールを入れたまま遺ります。

以下は、ご参考までです。

$ sudo find / -name "dkms"
find: ‘/run/user/1000/gvfs’: 許可がありません
/etc/dkms
/var/lib/dkms
/usr/bin/dkms
/usr/share/bash-completion/completions/dkms
/usr/lib/dkms


$ ls /etc/dkms
framework.conf   kernel_install.d_dkms  sign_helper.sh

$ cat /etc/dkms/framework.conf
## This configuration file modifies the behavior of
## DKMS (Dynamic Kernel Module Support) and is sourced
## in by DKMS every time it is run.

## Source Tree Location (default: /usr/src)
# source_tree="/usr/src"

## DKMS Tree Location (default: /var/lib/dkms)
# dkms_tree="/var/lib/dkms"

## Install Tree Location (default: /usr/lib/modules)
# install_tree="/usr/lib/modules"

## tmp Location (default: /tmp)
# tmp_location="/tmp"

## verbosity setting (verbose will be active if you set it to a non-null value)
# verbose=""

## symlink kernel modules (will be active if you set it to a non-null value)
## This creates symlinks from the install_tree into the dkms_tree instead of
## copying the modules. This preserves some space on the costs of being less
## safe.
# symlink_modules=""

## Automatic installation and upgrade for all installed kernels (if set to a
## non-null value)
# autoinstall_all_kernels=""

## Script to sign modules during build, script is called with kernel version
## and module name
# sign_tool="/etc/dkms/sign_helper.sh"


$ cat /etc/dkms/kernel_install.d_dkms
#!/usr/bin/bash

if [[ "$1" == "add" ]]; then
/etc/kernel/postinst.d/dkms $2
fi

if [[ "$1" == "remove" ]]; then
/etc/kernel/prerm.d/dkms $2
fi


$ cat /etc/dkms/kernel_install.d_dkms
#!/usr/bin/bash

if [[ "$1" == "add" ]]; then
/etc/kernel/postinst.d/dkms $2
fi

if [[ "$1" == "remove" ]]; then
/etc/kernel/prerm.d/dkms $2
fi


$ cat /etc/dkms/sign_helper.sh
#!/bin/sh
/lib/modules/"$1"/build/scripts/sign-file sha512 /root/mok.priv /root/mok.der "$2"


講釈を垂れているつもりではありません。
じぶん程度の人と知識を共有することが
できたら幸いです。


posted by ブログ開設者 at 10:09| Comment(0) | linux | このブログの読者になる | 更新情報をチェックする