- 2020/06/11 [修正] Makefileのカーネル指定がDKMSから受け取れるよう書き換え
久しぶりにMax M4をLinuxで使ったら、カーネルアップデートでドライバが消えて録画失敗して悲しい気持ちになったのでDKMSで自動的にインストールされるようにするためのメモ。
どなたかが手順を検証してもっと包括的なDTV環境の構築手順を作ったりして頂けると嬉しいです。
参考
- AUR (en) – dddvb-dkms
- モジュールの指定方法はこのパッケージの内容から丸パクリさせて頂きました
確認環境
- Ubuntu 20.04
- dddvb v0.9.37
手順
バージョンが変わっても大幅な変更がなければ、バージョン番号だけ適宜書き替えて同じ手順が使えるかもしれない。
必要パッケージのインストール
$ sudo apt install dkms build-essential git unzip
ソースとdkms.confの準備
作業用ディレクトリを作成。
$ mkdir -p ~/work/dddvb
$ cd ~/work/dddvb
ドライバのソースファイルを展開。
$ wget https://github.com/DigitalDevices/dddvb/archive/0.9.37.zip
$ unzip 0.9.37.zip
$ cd dddvb-0.9.37
dkms.confで指定するモジュールを確認するため、いったんmakeで生成する。
$ make
dkms.confを生成する。
$ cat <<'EOF' | tee dkms.conf
PACKAGE_NAME=dddvb
PACKAGE_VERSION=0.9.37
AUTOINSTALL="yes"
CHECK_MODULE_VERSION="no"
MAKE="'make' all KVER=${kernelver}"
CLEAN="make clean"
EOF
$ let "module_number=0" || true
$ for file in $(find ./ -type f -name "*.ko"); do
MODULE_LOCATION=$(dirname $file | cut -d\/ -f 2-)
echo "BUILT_MODULE_NAME[$module_number]=\"$(basename $file .ko)\"" >> dkms.conf
echo "BUILT_MODULE_LOCATION[$module_number]=\"$MODULE_LOCATION\"" >> dkms.conf
echo "DEST_MODULE_LOCATION[$module_number]=\"/extramodules/$pkgname\"" >> dkms.conf
let "module_number=${module_number}+1" || true
done
確認用に生成したモジュールなどを削除する。
$ make clean
この時点で生成されたdkms.confを確認すると以下のようになっているはず。
$ cat dkms.conf
PACKAGE_NAME=dddvb
PACKAGE_VERSION=0.9.37
AUTOINSTALL="yes"
CHECK_MODULE_VERSION="no"
MAKE="'make' all KVER=${kernelver}"
CLEAN="make clean"
BUILT_MODULE_NAME[0]="ddbridge"
BUILT_MODULE_LOCATION[0]="ddbridge"
DEST_MODULE_LOCATION[0]="/extramodules/"
BUILT_MODULE_NAME[1]="octonet"
BUILT_MODULE_LOCATION[1]="ddbridge"
DEST_MODULE_LOCATION[1]="/extramodules/"
BUILT_MODULE_NAME[2]="lnbp21"
BUILT_MODULE_LOCATION[2]="frontends"
DEST_MODULE_LOCATION[2]="/extramodules/"
BUILT_MODULE_NAME[3]="cxd2099"
BUILT_MODULE_LOCATION[3]="frontends"
DEST_MODULE_LOCATION[3]="/extramodules/"
BUILT_MODULE_NAME[4]="tda18271c2dd"
BUILT_MODULE_LOCATION[4]="frontends"
DEST_MODULE_LOCATION[4]="/extramodules/"
BUILT_MODULE_NAME[5]="stv6111"
BUILT_MODULE_LOCATION[5]="frontends"
DEST_MODULE_LOCATION[5]="/extramodules/"
BUILT_MODULE_NAME[6]="stv6110x"
BUILT_MODULE_LOCATION[6]="frontends"
DEST_MODULE_LOCATION[6]="/extramodules/"
BUILT_MODULE_NAME[7]="cxd2843"
BUILT_MODULE_LOCATION[7]="frontends"
DEST_MODULE_LOCATION[7]="/extramodules/"
BUILT_MODULE_NAME[8]="drxk"
BUILT_MODULE_LOCATION[8]="frontends"
DEST_MODULE_LOCATION[8]="/extramodules/"
BUILT_MODULE_NAME[9]="lnbh25"
BUILT_MODULE_LOCATION[9]="frontends"
DEST_MODULE_LOCATION[9]="/extramodules/"
BUILT_MODULE_NAME[10]="mxl5xx"
BUILT_MODULE_LOCATION[10]="frontends"
DEST_MODULE_LOCATION[10]="/extramodules/"
BUILT_MODULE_NAME[11]="tda18212dd"
BUILT_MODULE_LOCATION[11]="frontends"
DEST_MODULE_LOCATION[11]="/extramodules/"
BUILT_MODULE_NAME[12]="stv0910"
BUILT_MODULE_LOCATION[12]="frontends"
DEST_MODULE_LOCATION[12]="/extramodules/"
BUILT_MODULE_NAME[13]="stv0367dd"
BUILT_MODULE_LOCATION[13]="frontends"
DEST_MODULE_LOCATION[13]="/extramodules/"
BUILT_MODULE_NAME[14]="stv090x"
BUILT_MODULE_LOCATION[14]="frontends"
DEST_MODULE_LOCATION[14]="/extramodules/"
BUILT_MODULE_NAME[15]="dvb-core"
BUILT_MODULE_LOCATION[15]="dvb-core"
DEST_MODULE_LOCATION[15]="/extramodules/"
Makefile内のカーネル指定部分を書き換えて、ビルド時のカーネルでなくDKMSから指定されたカーネルが使用されるよう変更。
$ sed -i -e 's/shell uname -r/KVER/g' Makefile
ソースなどをDKMSで使用するディレクトリへコピー。
ディレクトリ名を 「[パッケージ名]-[バージョン番号]」 のようにする必要がある。
$ cd ..
$ sudo cp -r dddvb-0.9.37 /usr/src/
インストールとドライバの設定
DKMSへの登録とインストール。
# DKMSに登録
$ sudo dkms add -m dddvb -v 0.9.37
# 現在のカーネルへドライバをインストール
$ sudo dkms install -m dddvb -v 0.9.37
# DKMSによるインストール状態を確認
$ dkms status
dddvb, 0.9.37, 5.4.0-33-generic, x86_64: installed
まだ実施していなければ、OS標準のドライバでなく追加したものを使うよう設定。
$ sudo mkdir -p /etc/depmod.d
$ echo 'search extra updates built-in' | sudo tee /etc/depmod.d/extra.conf
$ sudo depmod -a
以降は新しいカーネル(とカーネルヘッダ)がインストールされた際にドライバもインストールされるはず。
dkms.confはドライバが同じバージョンであれば動的に生成せずとも同じものを使いまわせそう。
(おまけ) ドライバのアンインストール
allオプションで全てのカーネルからアンインストールされる。
$ sudo dkms remove -m dddvb -v 0.9.37 --all
コメント