r8168のドライバをdkmsでインストールする方法

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
同じタグの記事: Fedora18
同じタグの記事: Linux
同じタグの記事: r8168
同じカテゴリの記事: Linux