#title dkmsによるカーネルモジュールの自動更新方法 * '''対象とするUbuntuのバージョン''' * 10.10 Maverick Meerkat ||<>|| /!\ カーネルモジュールのソースを外部から入手し、インストールして使うことにより、時としてシステムが不安定になる場合もあります。また、ソースに問題があった場合には修正版のソースを入手してビルドしなおす必要がありますが、パッケージ管理システムとは違い自動的に修正版が導入されるということはありません。標準配布のカーネルモジュールやbackportsされたカーネルモジュールなどではサポートされないハードウェアを駆動したい場合や、それらのカーネルモジュールで動作に問題がある場合にのみ、ソースからのビルドを検討して下さい。 本文書ではdkmsによる、カーネルの更新時のカーネルモジュールの自動生成の概略について説明します。本文書ではReaktek Semiconductor Corp.により配布されている、RTL8111/8168B用のカーネルモジュールソース(r8168-8.019.00.tar.bz2)を一例として解説します。 = ソースの入手とテスト = デバイスベンダのウェブサイトなどからカーネルモジュールのソースをダウンロードし、作業用ユーザのホームなどに展開して下さい。展開後、付属のドキュメントやMakefileの内容を確認し、カーネルモジュールの生成手順、および、正常にビルドできることを確認して下さい。同時にビルド時の中間ファイルの消去方法なども確認して下さい。 r8168-8.019.00.tar.bz2の場合、 {{{ make modules }}} でカーネルモジュールが生成されます。 また、 {{{ make clean }}} で中間ファイルの消去ができます。 = ソースツリーのコピーとdkms.confの作成 = ソースツリーを{{{/usr/src}}}にコピーして、ディレクトリ名を'''パッケージ名'''-'''パッケージ版数'''の形式に名前変更して下さい。例えば、r8168-8.019.00などです(ここで決めたパッケージ名、および、パッケージ版数を後で{{{dkms.conf}}}に記述します)。 次にdkmsの動作を定義するためのファイル、{{{dkms.conf}}}を作成します。r8168-8.019.00に対しては、 {{{ sudo touch /usr/src/r8168-8.019.00/dkms.conf }}} などとして下さい。好みのエディタで{{{dkms.conf}}}を以下のように編集します。 {{{ # 先ほど決めたパッケージ名です PACKAGE_NAME="package_name" # 先ほど決めたパッケージ版数 PACKAGE_VERSION="01.23.45" # 中間ファイルの削除コマンド。指定しない場合は、make cleanとみなされます。 CLEAN="make clean" # ビルドするモジュールの生成コマンド。MAKE[0]がデフォルトのビルドコマンドとなります。 MAKE[0]="make module0" # ビルドされたモジュールが作成されるディレクトリまでの相対パス。 # 以下[]内の番号が一致するものが一揃いで動作します。 BUILT_MODULE_LOCATION[0]="path/to/build_dir0" BUILT_MODULE_LOCATION[1]="path/to/build_dir1" BUILT_MODULE_LOCATION[2]="path/to/build_dir2" # ビルドだれたモジュールの名前です。拡張子(.ko)は除きます。 BUILT_MODULE_NAME[0]="module0" BUILT_MODULE_NAME[1]="module1" BUILT_MODULE_NAME[2]="module2" # ビルドしたモジュールをインストールするディレクトリを指定します。 DEST_MODULE_LOCATION[0]="/updates/dkms" DEST_MODULE_LOCATION[1]="/updates/dkms" DEST_MODULE_LOCATION[2]="/updates/dkms" AUTOINSTALL="yes" }}} r8168-8.019.00.tar.bz2の場合は、下記のように設定すれば良いでしょう。 {{{ PACKAGE_NAME="r8168" PACKAGE_VERSION="8.019.00" CLEAN="make clean" BUILT_MODULE_LOCATION[0]="src/" BUILT_MODULE_NAME[0]="r8168" MAKE[0]="cd ${dkms_tree}/r8168/8.019.00/build; make KVER=${kernelver} modules" DEST_MODULE_LOCATION[0]="/updates/dkms" AUTOINSTALL="yes" }}} ここで注意しなければならないのは、r8168-8.019.00.tar.bz2に含まれる{{{Makefile}}}では、カーネルリリース名を取得するために、{{{uname -r}}}を呼び出し、変数{{{KVER}}}に代入している点です。この方法だとdkms実行時に使用しているカーネル向けにカーネルモジュールがビルドされてしまうため、変数{{{KVER}}}に正しいカーネルリリース名が使われるように{{{dkms.conf}}}内で使用できる変数、{{{$kernelver}}}を与える必要があります。 このような対処はケースバイケースであり、ソースの{{{Makefile}}}などを確認して、適切にカーネルモジュールのビルドが行われるように設定して下さい。 {{{dkms.conf}}}の書式の詳細は、{{{man dkms}}}で確認して下さい。 = dkmsの操作 = == add == 準備が完了したら、ソースツリーをdkmsに追加します。{{{dkms.conf}}}で指定したPACKAGE_NAMEとPACKAGE_VERSIONを使い、 {{{sudo dkms add -m PACKAGE_NAME -v PACKAGE_VERSION}}} を実行します。 (実行例) {{{ sudo dkms add -m r8168 -v 8.019.00 Creating symlink /var/lib/dkms/r8168/8.019.00/source -> /usr/src/r8168-8.019.00 DKMS: add Completed. }}} == build == カーネルモジュールをビルドしてみて下さい。add同様に、 {{{sudo dkms build -m PACKAGE_NAME -v PACKAGE_VERSION}}} を実行します。 (実行例) {{{ sudo dkms build -m r8168 -v 8.019.00 Kernel preparation unnecessary for this kernel. Skipping... Building module: cleaning build area.... cd /var/lib/dkms/r8168/8.019.00/build; make KVER=2.6.35-23-generic modules...... cleaning build area.... DKMS: build Completed. }}} == install == 最後にビルドしたカーネルモジュールをインストールします。 {{{sudo dkms install -m PACKAGE_NAME -v PACKAGE_VERSION}}} を実行します。 (実行例) {{{ sudo dkms install -m r8168 -v 8.019.00 r8168.ko: Running module version sanity check. - Original module - No original module exists within this kernel - Installation - Installing to /lib/modules/2.6.35-23-generic/updates/dkms/ depmod.... DKMS: install Completed. }}} == 動作確認 == 古いカーネルを再インストール、もしくは、インストールすることで、動作確認することができます。 (実行例) {{{ sudo aptitude reinstall linux-image-2.6.35-22-generic 以下のパッケージは『再インストール』されます: linux-image-2.6.35-22-generic --- >8 --- >8 --- >8 --- >8 --- (snip) --- >8 --- >8 --- >8 --- >8 --- Examining /etc/kernel/postinst.d. run-parts: executing /etc/kernel/postinst.d/dkms 2.6.35-22-generic /boot/vmlinuz-2.6.35-22-generic * dkms: running auto installation service for kernel 2.6.35-22-generic * vboxhost (3.2.10)... [ OK ] * r8168 (8.019.00)... [ OK ] * fglrx (8.780)... [ OK ] --- >8 --- >8 --- >8 --- >8 --- (snip) --- >8 --- >8 --- >8 --- >8 --- }}} 正常に動作していれば、上記のようにdkmsによりカーネルモジュールが生成されます。生成されたモジュールに対してmodinfoを実行し、{{{vermagic}}}が適切に設定されているかなどを確認して下さい。 {{{ find /lib/modules -name r8168.ko -exec modinfo {} \; }}} == remove == 不要になった場合は、下記のような手順で削除して下さい。 {{{ sudo dkms remove -m PACKAGE_NAME -v PACKAGE_VERSION --all }}} もしくは、 {{{ sudo dkms remove -m PACKAGE_NAME -v PACKAGE_VERSION -k KERNEL_VERSION }}} (実行例) {{{ sudo dkms remove -m r8168 -v 8.019.00 --all -------- Uninstall Beginning -------- Module: r8168 Version: 8.019.00 Kernel: 2.6.35-23-generic (x86_64) ------------------------------------- Status: Before uninstall, this module version was ACTIVE on this kernel. r8168.ko: - Uninstallation - Deleting from: /lib/modules/2.6.35-23-generic/updates/dkms/ - Original module - No original module was found for this module on this kernel. - Use the dkms install command to reinstall any previous module version. depmod...... DKMS: uninstall Completed. --- >8 --- >8 --- >8 --- >8 --- (snip) --- >8 --- >8 --- >8 --- >8 --- }}} = 関連サイト = * [[http://trac.vinelinux.org/wiki/DKMS|Vine Linux WikiのDKMS (Dynamic Kernel Module Support)]] * [[http://manpages.ubuntu.com/manpages/lucid/man8/dkms.8.html|DKMSのmanページ]]