テストステ論

高テス協会会長が, テストステロンに関する情報をお届けします.

DKMSが素晴らしい

Dynamic Kernel Module Support(DKMS)は, アウトオブツリーモジュールを公開する上での強力な味方である.

Linuxカーネルは, モジュールを動的にインストールすることが出来る. この用途は主にドライバだが, ファイルシステムやDMターゲットの開発にもこの機構を使うことが出来る. ここでインストールとは, システムのどの場所からでもそのモジュールをmodprobe可能になってることと定義する(それ以降はmodprobe.confの仕事である).

モジュールを, 現在のカーネル向けにコンパイルして, インストールして, モジュールを修正した時にはまた新しいものをインストールするというのは, 作業量的には大したことないのだが, 果たしてあなたはモジュールをインストールする仕組みを"完全に"理解していて, あなたの理解が全ディストリビューションに通用するものであることを保証出来るだろうか?出来ると答えられたあなたは努力の方向が何か間違ってる.

DKMSはここらへんを吸収してくれる. DKMSの使い方は簡単である. ソースコードと, そのビルドの方法を記述してリポジトリに登録する方式を採用したパッケージシステムが, 最近の言語では一般的である(例: nim-lang/packages)が, 考え方は同じである(従って, 世界グローバルなDKMSシステムを作ることも出来ると思う).

  • dkms.confにモジュールのインストール方法を書く.
  • dkms.conf, ビルドするためのMakefile, ソース一式を/usr/src/module_name-module_versionに置く. このように配置するとdkmsは対象のdkms.confを見つけることが出来る.
  • addしてモジュールを管理対象に入れる. そうすると, build/install/uninstall/removeという操作が出来るようになる. removeは管理対象から外すコマンドである.

DKMSを使うと, 以下のMakefileのinstall/uninstallを使ってライトブーストを管理することが出来る.

MODULE_VERSION ?= 1.0.0
DKMS_DIR := /usr/src/dm-writeboost-$(MODULE_VERSION)
DKMS_KEY := -m dm-writeboost -v $(MODULE_VERSION)

install:
    cp -r src $(DKMS_DIR)
    dkms add $(DKMS_KEY)
    dkms build $(DKMS_KEY)
    dkms install $(DKMS_KEY)

uninstall:
    dkms remove --all $(DKMS_KEY)
    rm -rf $(DKMS_DIR)

dkms.confは以下のように書いた. 詳しくはmanpageを読むしかない Manpage of DKMS

PACKAGE_NAME="dm-writeboost"
PACKAGE_VERSION="1.0.0"
BUILD_MODULE_NAME="dm-writeboost"
DEST_MODULE_LOCATION="/kernel/drivers/md"
MAKE="make all KERNEL_TREE=$kernel_source_dir"
CLEAN="make clean"
AUTOINSTALL="yes"
REMAKE_INITRD="yes"

その他のメリットとして, DKMSを使うと, 本体のカーネルを入れ替えた場合にも, 起動時に自動的にモジュールのリビルドが行われる(それが動くかは保証されないが).

そもそも論として, ソースコードという独自の発想が要求される部分の他は, なるべく標準的に行うのが良い. その意味でも, モジュールをDKMSで管理するのは良い. DKMSはまともなディストリではサポートされているはずだ.