フレームワーク
-
DKMS
ざっくりどんなフレームワークかを説明する。
dnf updateやapt update時にカーネルのバージョンアップが入った際、
dkmsに登録しておいたドライバをバージョンアップするカーネル用に再コンパイルする。
dkmsを用いず手動でコンパイルした際にはカーネルのバージョンアップ時に
再度、手動でコンパイルする必要があるためその手間を省ける。
手順
- 冒頭記事の手順通りに進め、その環境で問題なくコンパイルとドライバを使用できることを確認する。
- ソースコードを移動させる。
# mv r8125-9.003.05 /usr/src
- src/Makefileの編集
--- before_Makefile
+++ after_Makefile
@@ -83,7 +83,7 @@
EXTRA_CFLAGS += -DENABLE_TX_NO_CLOSE
endif
else
- BASEDIR := /lib/modules/$(shell uname -r)
+ BASEDIR := /lib/modules/$(KVER)
KERNELDIR ?= $(BASEDIR)/build
PWD :=$(shell pwd)
DRIVERDIR := $(shell find $(BASEDIR)/kernel/drivers/net/ethernet -name realtek -type d)
- dkms.confの作成
# vim /usr/src/r8168-8.019.00/dkms.conf
PACKAGE_NAME="r8125"
PACKAGE_VERSION="9.003.05"
BUILT_MODULE_LOCATION[0]="src"
BUILT_MODULE_NAME[0]="r8125"
MAKE[0]="'make' KVER=${kernelver} modules"
CLEAN="make clean"
DEST_MODULE_LOCATION[0]="/updates/dkms"
AUTOINSTALL="yes"
各パラメータについて少しだけ解説
BUILT_MODULE_LOCATION
make実行によってモジュールが生成されるディレクトリを指す。
BUILT_MODULE_NAME
生成されるモジュール名を指す。なお.ko拡張子を除いた名前です。
MAKE
実際にコンパイルする際に実行するコマンドを記述します。
makeコマンドをシングルクォートで囲っている理由は
「KERNELRELEASE will be automatically appended to MAKE[#]. If you want to suppress this behavior, you can quote the make command: 'make'.」
の一文がman内にあり、本ドライバのMakefileはKERNELRELEASEが定義されている場合ビルドに失敗するからです。
何故そういうMakefileを作ったのかはカーネルモジュール周りに疎いのでわかりません。
KERNELRELEASEが定義されている場合にmodulesレシピが定義されないように書かれてます。謎。
DEST_MODULE_LOCATION
書かないとDKMSの実行に失敗するけど、書いても無視されてしまう意味不明な変数。
「This is a required directive」って書いてるくせに
「DEST_MODULE_LOCATION is ignored on Fedora Core 6 and higher, Red Hat Enterprise Linux 5 and higher, Novell SuSE Linux Enterprise Server 10 and higher, Novell SuSE Linux 10.0 and higher, and Ubuntu. Instead, the proper distribution-specific directory is used.」
ってほとんどやないか〜〜〜〜〜い。
自分の環境はUbuntuで、/updates/dkms配下にインストールされるのでそれに準拠して上記のconfにはそのパスを記載してます。一応。
RHELとほぼ同義なんで無視される気はしますけど、CentOSだとちゃんと読み込んでくれるんですかね。どうなんだろ。
- DKMSへの追加、ビルド、インストール
# dkms add -m r8125 -v 9.003.05
# dkms build -m r8125 -v 9.003.05
# dkms install -m r8125 -v 9.003.05
- 実際にカーネルアップデート時に動作するか
適当な過去バージョンのカーネルをインストールしてみる。
インストール後に想定された/updates/dkms配下にインストールされてればOK
# apt install --reinstall linux-image-4.15.0-112-generic
# ls /lib/modules/4.15.0-112-generic/updates/dkms/r8125.ko