対象とする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 ---