| 1 | = DKMS (Dynamic Kernel Module Support) = |
| 2 | |
| 3 | マシンにインストールされている個々のカーネル (バージョン/リリース) ごとに、カーネルモジュールパッケージをビルドして用意するのではなく、自動的にモジュールをインストールして配置・管理するための仕組み。 |
| 4 | |
| 5 | [http://linux.dell.com/dkms/ Dell の DKMS プロジェクトページ] |
| 6 | |
| 7 | 現時点での最新バージョンは `2.0.21.1` |
| 8 | |
| 9 | Vine Linux 的には、現在の `kernel-module-*` のスタイルから、この `dkms-*` へと移行する予定。 |
| 10 | |
| 11 | |
| 12 | == 動作の仕組みの概要 == |
| 13 | |
| 14 | * `dkms` 対応モジュールのソースは `/usr/src/%{name}-%{version}-%{release}/` 以下に配置される |
| 15 | |
| 16 | * 一連の `dkms` コマンド |
| 17 | - `dkms add` コマンドにより、モジュールのソースを追加する |
| 18 | - ソースへのシンボリックリンクなどが `/var/lib/dkms/%{name}/%{version}-%{release}` 以下にセットされる |
| 19 | - `dkms build` コマンドにより、`add` されたソースをコンパイルする |
| 20 | - `/var/lib/dkms/%{name}/%{version}-%{release}/build` 以下でコンパイルされる |
| 21 | - できあがったモジュールは `/var/lib/dkms/%{name}/%{version}-%{release}/%{kverrel}` 以下に |
| 22 | (コンパイル時のログと共に) 置かれる |
| 23 | - `dkms install` コマンドにより、`build` されたモジュールをインストールする |
| 24 | - `/usr/src/%{name}-%{version}-%{release}/dkms.conf` で指定されたパスへモジュールを配置する |
| 25 | (`/lib/modules/%{kverrel}/.../.../...`) |
| 26 | - もし、配置しようとしているモジュールと同じファイル名のモジュールがあったら、退避しておく |
| 27 | |
| 28 | - `dkms uninstall`: `dkms install` の逆 (`/lib/modules/...` から削除) |
| 29 | - `dkms remove`: `dkms add` の逆 (`uninstall` されてなければ行い、その後 `/var/lib/dkms` 以下を掃除 |
| 30 | |
| 31 | - `dkms status`: `add` / `build` / `install` されている dkms 対応モジュールの状況を表示する |
| 32 | |
| 33 | * `/etc/init.d/dkms_autoinstaller` スクリプト |
| 34 | - システムブート時に実行される |
| 35 | - すでに `dkms add` されている (dkms に登録されている) カーネルモジュールのうち、 |
| 36 | 現在のカーネル用に `dkms install` されていないものがあれば、 |
| 37 | このタイミングで `dkms build; dkms install` が実行される |
| 38 | |
| 39 | |
| 40 | == 実行例 == |
| 41 | |
| 42 | 実際にインストールした際のイメージとして。。。 |
| 43 | |
| 44 | {{{ |
| 45 | $ rpm -q dkms |
| 46 | dkms-2.0.21.1-1vl5 |
| 47 | |
| 48 | $ dkms status |
| 49 | madwifi, 0.10.5.6-1.3992vl5, 2.6.27-18vl5, i686: installed |
| 50 | ndiswrapper, 1.54-2vl5, 2.6.27-18vl5, i686: installed |
| 51 | |
| 52 | $ sudo apt-get install dkms-iscsitarget |
| 53 | .... (中略) ... |
| 54 | 1:dkms-iscsitarget ########################################### [100%] |
| 55 | |
| 56 | Creating symlink /var/lib/dkms/iscsitarget/0.4.17.211-1vl5/source -> |
| 57 | /usr/src/iscsitarget-0.4.17.211-1vl5 |
| 58 | |
| 59 | DKMS: add Completed. |
| 60 | |
| 61 | Kernel preparation unnecessary for this kernel. Skipping... |
| 62 | applying patch compat-2.6.28.patch...patching file kernel/conn.c |
| 63 | |
| 64 | applying patch compat-2.6.25-2.6.27.patch...patching file kernel/block-io.c |
| 65 | |
| 66 | |
| 67 | Building module: |
| 68 | cleaning build area.... |
| 69 | 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...... |
| 70 | cleaning build area.... |
| 71 | |
| 72 | DKMS: build Completed. |
| 73 | |
| 74 | iscsi_trgt.ko: |
| 75 | Running module version sanity check. |
| 76 | - Original module |
| 77 | - No original module exists within this kernel |
| 78 | - Installation |
| 79 | - Installing to /lib/modules/2.6.27-18vl5/kernel/iscsi/ |
| 80 | Adding any weak-modules |
| 81 | |
| 82 | depmod.... |
| 83 | |
| 84 | DKMS: install Completed. |
| 85 | |
| 86 | $ dkms status |
| 87 | madwifi, 0.10.5.6-1.3992vl5, 2.6.27-18vl5, i686: installed |
| 88 | iscsitarget, 0.4.17.211-1vl5, 2.6.27-18vl5, i686: installed |
| 89 | ndiswrapper, 1.54-2vl5, 2.6.27-18vl5, i686: installed |
| 90 | }}} |
| 91 | |
| 92 | |
| 93 | == DKMS 対応パッケージを作る == |
| 94 | |
| 95 | 基本的な作業は以下の2点のみ。 |
| 96 | |
| 97 | 1. カーネルモジュール用の `dkms.conf` を用意する |
| 98 | 1. カーネルモジュールのソースと `dkms.conf` を `/usr/src/%{name}-%{version}-%{release}` に収録した |
| 99 | `dkms-%{name}` サブパッケージを作成する |
| 100 | |
| 101 | `dkms.conf` は比較的簡単なフォーマットの設定ファイルである。以下サンプル。 |
| 102 | |
| 103 | {{{ |
| 104 | # パッケージ名 |
| 105 | PACKAGE_NAME="iscsitarget" |
| 106 | # バージョン |
| 107 | PACKAGE_VERSION="0.4.17.211-1vl5" |
| 108 | |
| 109 | ## 「dkms install」時に参照されるパラメータ |
| 110 | ## |
| 111 | # インストールしたいモジュール名 (末尾の .ko は除く) |
| 112 | BUILT_MODULE_NAME="iscsi_trgt" |
| 113 | # そのモジュールの存在するサブディレクトリ |
| 114 | BUILT_MODULE_LOCATION="kernel" |
| 115 | # インストール先 |
| 116 | DEST_MODULE_LOCATION="/kernel/iscsi" |
| 117 | |
| 118 | ## モジュールが複数ある場合は |
| 119 | ## BUILT_MODULE_NAME[0] BUILT_MODULE_NAME[1] ... と指定していく |
| 120 | ## BUILT_MODULE_LOCATION, DEST_MODULE_LOCATION についても同じ |
| 121 | |
| 122 | |
| 123 | ## 「dkms build」時に実行されるコマンド |
| 124 | ## |
| 125 | MAKE="make -C ${kernel_source_dir} SUBDIRS=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build/kernel modules" |
| 126 | CLEAN="make -C ${kernel_source_dir} SUBDIRS=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build/kernel clean" |
| 127 | |
| 128 | # インストール後に initrd を自動再生成するかどうか |
| 129 | REMAKE_INITRD="yes" |
| 130 | # |
| 131 | AUTOINSTALL="yes" |
| 132 | |
| 133 | |
| 134 | ## カーネルのバージョンごとに特定のパッチをあてる場合は、このように指定する |
| 135 | ## パッチのありかは /usr/src/(モジュールのソースディレクトリ)/patches/ |
| 136 | PATCH[0]="compat-2.6.28.patch" |
| 137 | PATCH_MATCH[0]="2\.6\.(9|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28)" |
| 138 | |
| 139 | PATCH[1]="compat-2.6.25-2.6.27.patch" |
| 140 | PATCH_MATCH[1]="2\.6\.(9|14|15|16|17|18|19|20|21|22|23|24|25|26|27)" |
| 141 | |
| 142 | PATCH[2]="compat-2.6.24.patch" |
| 143 | PATCH_MATCH[2]="2\.6\.(9|14|15|16|17|18|19|20|21|22|23|24)" |
| 144 | |
| 145 | PATCH[3]="compat-2.6.23.patch" |
| 146 | PATCH_MATCH[3]="2\.6\.(9|14|15|16|17|18|19|20|21|22|23)" |
| 147 | |
| 148 | PATCH[4]="compat-2.6.22.patch" |
| 149 | PATCH_MATCH[4]="2\.6\.(9|14|15|16|17|18|19|20|21|22)" |
| 150 | |
| 151 | PATCH[5]="compat-2.6.19-2.6.21.patch" |
| 152 | PATCH_MATCH[5]="2\.6\.(9|14|15|16|17|18|19|20|21)" |
| 153 | |
| 154 | PATCH[6]="compat-2.6.14-2.6.18.patch" |
| 155 | PATCH_MATCH[6]="2\.6\.(9|14|15|16|17|18)" |
| 156 | }}} |