= DKMS (Dynamic Kernel Module Support) = マシンにインストールされている個々のカーネル (バージョン/リリース) ごとに、カーネルモジュールパッケージをビルドして用意するのではなく、自動的にモジュールをインストールして配置・管理するための仕組み。 [http://linux.dell.com/dkms/ Dell の DKMS プロジェクトページ] 参考資料 - [http://www.linuxjournal.com/article/6896 Kernel Korner - Exploring Dynamic Kernel Module Support (DKMS)] (LinuxJournal, Sept 2003) - [http://linux.dell.com/dkms/dkms-ols2004.pdf Ottawa Linux Symposium Paper] (PDF, July 2004) 現時点での最新バージョンは `2.0.21.1` Vine Linux 的には、現在の `kernel-module-*` のスタイルから、この `dkms-*` へと移行する予定。 - ただし、ビルドに長時間かかる大きめのパッケージ (`compat-wireless` や `alsa-driver` など) は dkms 化することによるデメリットが大きくなるため、引き続き `kernel-module-*` で提供するか、 kernel に組み込む方向で考えることに == 動作の仕組みの概要 == * `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` を用意する 1. カーネルモジュールのソースと `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) 参照のこと。