r8168のドライバをdkmsでインストールする方法は次のようになります。OSによって dkms.conf の内容が違うようです。ここではFedora18の場合を紹介します。
参考になったのは、「UbuntuTips/Others/DkmsHowTo – Ubuntu Japanese Wiki」です。これによると、下記のようなdkms.confになるそうです。MAKE[0]の指定方法がcdコマンドを組み合わせている点が気になりました。
PACKAGE_NAME="r8168" PACKAGE_VERSION="8.035.00" CLEAN="make clean" BUILT_MODULE_LOCATION[0]="src/" BUILT_MODULE_NAME[0]="r8168" MAKE[0]="cd ${dkms_tree}/r8168/8.035.00/build; make KVER=${kernelver} modules" DEST_MODULE_LOCATION[0]="/updates/dkms" AUTOINSTALL="yes"
まず、ダウンロードしたr8168-8.035.00.tar.bz2を展開し、 /usr/src/r8168-8.035.00/ へ用意します。dkms.conf を追加します。結果として下記のようなディレクトリ構成になります。
/usr/src/r8168-8.035.00 ├── Makefile ├── README ├── autorun.sh ├── dkms.conf └── src ├── Makefile ├── Makefile_linux24x ├── r8168.h ├── r8168_asf.c ├── r8168_asf.h ├── r8168_n.c ├── rtl_eeprom.c ├── rtl_eeprom.h ├── rtltool.c └── rtltool.h
dkms.conf の内容は下記のとおりです。
PACKAGE_NAME="r8168" PACKAGE_VERSION="8.035.00" CLEAN="make clean" MAKE[0]="cd ${dkms_tree}/r8168/8.035.00/build; make modules" BUILT_MODULE_LOCATION[0]="src/" BUILT_MODULE_NAME[0]="r8168" DEST_MODULE_LOCATION[0]="/kernel/drivers/net" AUTOINSTALL="YES"
dkmsだと、自動で$KERNELRELEASEがつきます。これだとうまくMakefileが動作しないので、「音宮志久のプログラム日記」を参考にしつつ、下記のように修正しました。
CONFIG_DOWN_SPEED_100 = n CONFIG_ASPM = y #ifneq ($(KERNELRELEASE),) obj-m := r8168.o r8168-objs := r8168_n.o r8168_asf.o rtl_eeprom.o rtltool.o EXTRA_CFLAGS += -DCONFIG_R8168_NAPI EXTRA_CFLAGS += -DCONFIG_R8168_VLAN ifeq ($(CONFIG_DOWN_SPEED_100), y) EXTRA_CFLAGS += -DCONFIG_DOWN_SPEED_100 endif ifeq ($(CONFIG_ASPM), y) EXTRA_CFLAGS += -DCONFIG_ASPM endif #else # BASEDIR := /lib/modules/$(shell uname -r) ifeq ($(KERNELRELEASE),) BASEDIR := /lib/modules/$(shell uname -r) else BASEDIR := /lib/modules/$(KERNELRELEASE) endif KERNELDIR ?= $(BASEDIR)/build PWD :=$(shell pwd) DRIVERDIR := $(shell find $(BASEDIR)/kernel/drivers/net -name realtek -type d) ifeq ($(DRIVERDIR),) DRIVERDIR := $(BASEDIR)/kernel/drivers/net endif RTKDIR := $(subst $(BASEDIR)/,,$(DRIVERDIR)) .PHONY: all all: clean modules install .PHONY:modules modules: $(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) modules .PHONY:clean clean: $(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) clean .PHONY:install install: $(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) INSTALL_MOD_DIR=$(RTKDIR) modules_install #endif
修正点について説明します。$KERNELRELEASE が空文字でないときの条件文指定に関する記述をコメントにしています(3カ所)。これを修正しないと、「modules」や「clean」といったターゲットが存在しないというエラーになってしまいます。また「BASEDIR := /lib/modules/$(shell uname -r)」だとDKMSを実行するシェルのカーネルが使われてしまうので、「BASEDIR := /lib/modules/$(KERNELRELEASE)」として、指定されたKERNELRELEASEを使うように修正します。ただし、$(KERNELRELEASE)が指定していない場合は従来の指定としたいので、ifeqを使った分岐処理をいれています。結果として、「ifeq」から「endif」までの5行分に置き換えた形になっています。
dkmsでの自動更新の設定を追加するには下記のようにします。LANG=Cをつけているのはメッセージなどを英語にしたかったからです。
# LANG=C dkms add -m r8168 -v 8.035.00 # LANG=C dkms build -m r8168 -v 8.035.00 # LANG=C dkms install -m r8168 -v 8.035.00
エラーが発生しなければ、次回からカーネルがアップデートされたときは自動でネットワークドライバのコンパイルもされるはずです(手元ではカーネルアップデート時の自動追随について確認できました)。
ちなみに、うまくいかなくて解除したいときは、下記のようにすれば良いでしょう。
# LANG=C dkms uninstall -m r8168 -v 8.035.00 # LANG=C dkms remove -m r8168/8.035.00 --all