| | 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 | }}} |