wiki:DKMS

Version 3 (modified by shaolin, 15 years ago) (diff)

--

DKMS (Dynamic Kernel Module Support)

マシンにインストールされている個々のカーネル (バージョン/リリース) ごとに、カーネルモジュールパッケージをビルドして用意するのではなく、自動的にモジュールをインストールして配置・管理するための仕組み。

 Dell の DKMS プロジェクトページ

参考資料

現時点での最新バージョンは 2.0.21.1

Vine Linux 的には、現在の kernel-module-* のスタイルから、この dkms-* へと移行する予定。

動作の仕組みの概要

  • dkms 対応モジュールのソースは /usr/src/%{name}-%{version}-%{release}/ 以下に配置される
  • 一連の dkms コマンド
    • dkms add コマンドにより、モジュールのソースを追加する
      • ソースへのシンボリックリンクなどが /var/lib/dkms/%{name}/%{version}-%{release} 以下にセットされる
    • dkms build コマンドにより、add されたソースをコンパイルする
      • /var/lib/dkms/%{name}/%{version}-%{release}/build 以下でコンパイルされる
      • できあがったモジュールは /var/lib/dkms/%{name}/%{version}-%{release}/%{kverrel} 以下に (コンパイル時のログと共に) 置かれる
    • dkms install コマンドにより、build されたモジュールをインストールする
      • /usr/src/%{name}-%{version}-%{release}/dkms.conf で指定されたパスへモジュールを配置する (/lib/modules/%{kverrel}/.../.../...)
      • もし、配置しようとしているモジュールと同じファイル名のモジュールがあったら、退避しておく
  • dkms uninstall: dkms install の逆 (/lib/modules/... から削除)
  • dkms remove: dkms add の逆 (uninstall されてなければ行い、その後 /var/lib/dkms 以下を掃除)
  • dkms status: add / build / install されている dkms 対応モジュールの状況を表示する
  • /etc/init.d/dkms_autoinstaller スクリプト
    • システムブート時に実行される
    • すでに dkms add されている (dkms に登録されている) カーネルモジュールのうち、 現在のカーネル用に dkms install されていないものがあれば、 このタイミングで dkms build; dkms install が実行される

実行例

実際にインストールした際のイメージとして。。。

$ rpm -q dkms
dkms-2.0.21.1-1vl5

$ dkms status
madwifi, 0.10.5.6-1.3992vl5, 2.6.27-18vl5, i686: installed 
ndiswrapper, 1.54-2vl5, 2.6.27-18vl5, i686: installed 

$ sudo apt-get install dkms-iscsitarget
.... (中略) ...
   1:dkms-iscsitarget       ########################################### [100%]

Creating symlink /var/lib/dkms/iscsitarget/0.4.17.211-1vl5/source ->
                 /usr/src/iscsitarget-0.4.17.211-1vl5

DKMS: add Completed.

Kernel preparation unnecessary for this kernel.  Skipping...
applying patch compat-2.6.28.patch...patching file kernel/conn.c

applying patch compat-2.6.25-2.6.27.patch...patching file kernel/block-io.c


Building module:
cleaning build area....
make KERNELRELEASE=2.6.27-18vl5 -C /lib/modules/2.6.27-18vl5/build SUBDIRS=/var/lib/dkms/iscsitarget/0.4.17.211-1vl5/build/kernel modules......
cleaning build area....

DKMS: build Completed.

iscsi_trgt.ko:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/2.6.27-18vl5/kernel/iscsi/
Adding any weak-modules

depmod....

DKMS: install Completed.

$ dkms status
madwifi, 0.10.5.6-1.3992vl5, 2.6.27-18vl5, i686: installed 
iscsitarget, 0.4.17.211-1vl5, 2.6.27-18vl5, i686: installed 
ndiswrapper, 1.54-2vl5, 2.6.27-18vl5, i686: installed

DKMS 対応パッケージを作る

基本的な作業は以下の2点のみ。

  1. カーネルモジュール用の dkms.conf を用意する
  2. カーネルモジュールのソースと dkms.conf/usr/src/%{name}-%{version}-%{release} に収録した dkms-%{name} サブパッケージを作成する

dkms.conf は比較的簡単なフォーマットの設定ファイルである。以下サンプル。

# パッケージ名
PACKAGE_NAME="iscsitarget"
# バージョン
PACKAGE_VERSION="0.4.17.211-1vl5"

## 「dkms install」時に参照されるパラメータ
##
# インストールしたいモジュール名 (末尾の .ko は除く)
BUILT_MODULE_NAME="iscsi_trgt"
# そのモジュールの存在するサブディレクトリ
BUILT_MODULE_LOCATION="kernel"
# インストール先
DEST_MODULE_LOCATION="/kernel/iscsi"

## モジュールが複数ある場合は
## BUILT_MODULE_NAME[0] BUILT_MODULE_NAME[1] ... と指定していく
## BUILT_MODULE_LOCATION, DEST_MODULE_LOCATION についても同じ


## 「dkms build」時に実行されるコマンド
##
MAKE="make -C ${kernel_source_dir} SUBDIRS=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build/kernel modules"
CLEAN="make -C ${kernel_source_dir} SUBDIRS=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build/kernel clean"

# インストール後に initrd を自動再生成するかどうか
REMAKE_INITRD="yes"
# 
AUTOINSTALL="yes"


## カーネルのバージョンごとに特定のパッチをあてる場合は、このように指定する
## パッチのありかは /usr/src/(モジュールのソースディレクトリ)/patches/
PATCH[0]="compat-2.6.28.patch"
PATCH_MATCH[0]="2\.6\.(9|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28)"

PATCH[1]="compat-2.6.25-2.6.27.patch"
PATCH_MATCH[1]="2\.6\.(9|14|15|16|17|18|19|20|21|22|23|24|25|26|27)"

PATCH[2]="compat-2.6.24.patch"
PATCH_MATCH[2]="2\.6\.(9|14|15|16|17|18|19|20|21|22|23|24)"

PATCH[3]="compat-2.6.23.patch"
PATCH_MATCH[3]="2\.6\.(9|14|15|16|17|18|19|20|21|22|23)"

PATCH[4]="compat-2.6.22.patch"
PATCH_MATCH[4]="2\.6\.(9|14|15|16|17|18|19|20|21|22)"

PATCH[5]="compat-2.6.19-2.6.21.patch"
PATCH_MATCH[5]="2\.6\.(9|14|15|16|17|18|19|20|21)"

PATCH[6]="compat-2.6.14-2.6.18.patch"
PATCH_MATCH[6]="2\.6\.(9|14|15|16|17|18)"

その他、詳しい説明については、冒頭のドキュメント (LinuxJournal? 記事や Ottawa Linux Symposium Paper) 参照のこと。