10 June 2019

Ubuntu 16.04でRTL8189FTV (RTL8188FU)ドライバのDKMS化

eBayでRTL8189FTV(RTL8188FU)を用いたWifiアダプタを購入したが、Ubuntu 16.04の標準ドライバでは認識しないようだ。

ドライバの入手とビルドの確認、そののちDKMSに対応させた時のメモ

20130406-rtl8188fu.jpg
eBayでは802.11aの機能もあると書かれているが、実際は5GHzには全く対応していない…

ドライバのビルドとインストール

USBの認識状況をまず調べて、Google検索でドライバのありかを探る

$ lsusb
Bus 002 Device 005: ID 0bda:f179 Realtek Semiconductor Corp. 

Ask Ubuntu 『Can't find wifi drivers for 0bda:f179 Realtek Semiconductor Corp』に、ドライバの入手方法が書かれている。

ドライバはRealtek公式サイトでは配布が終了したようで、現在はGitHubのlutmm/rtl8188fuで配布されているものを使う。

$ git clone https://github.com/lutmm/rtl8188fu.git

ドライバのソースコードを解凍し、Makefileをテキストエディタで編集し、次の1箇所をコメントアウトして有効化する。

# Fix compile error on gcc 4.9 and later
EXTRA_CFLAGS += -Wno-error=date-time	

ドライバをmakeし、インストール

$ make
$ sudo make install
install -p -m 644 8188fu.ko  /lib/modules/4.4.0-140-generic/kernel/drivers/net/wireless/
/sbin/depmod -a 4.4.0-140-generic

※ 青着色部の「4.4.0-140」はLinuxカーネルのバージョンで、uname -aで表示される現在のものに読み替えるとよい

ドライバインストール後の認識状況

$ less /var/log/syslog
〜 略 〜
Jun  9 23:19:39 S5350Ubuntu1604 kernel: [11898.434116] usb 2-1.2: New USB device found, idVendor=0bd
a, idProduct=f179
Jun  9 23:19:39 S5350Ubuntu1604 kernel: [11898.434122] usb 2-1.2: New USB device strings: Mfr=1, Pro
duct=2, SerialNumber=3
Jun  9 23:19:39 S5350Ubuntu1604 kernel: [11898.434126] usb 2-1.2: Product: 802.11n
Jun  9 23:19:39 S5350Ubuntu1604 kernel: [11898.434130] usb 2-1.2: Manufacturer: Realtek
Jun  9 23:19:39 S5350Ubuntu1604 kernel: [11898.434133] usb 2-1.2: SerialNumber: 00E0222DB9BD
Jun  9 23:19:39 S5350Ubuntu1604 mtp-probe: checking bus 2, device 4: "/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2"
Jun  9 23:19:39 S5350Ubuntu1604 mtp-probe: bus: 2, device: 4 was not an MTP device
Jun  9 23:19:40 S5350Ubuntu1604 kernel: [11899.528096] RTL871X: module init start
Jun  9 23:19:40 S5350Ubuntu1604 kernel: [11899.528101] RTL871X: rtl8188fu v4.3.23.6_20964.20170110
Jun  9 23:19:40 S5350Ubuntu1604 kernel: [11899.528103] RTL871X: build time: Jun  9 2019 23:09:47
Jun  9 23:19:40 S5350Ubuntu1604 kernel: [11899.528157] RTL871X: 
Jun  9 23:19:40 S5350Ubuntu1604 kernel: [11899.528157] usb_endpoint_descriptor(0):
Jun  9 23:19:40 S5350Ubuntu1604 kernel: [11899.528161] RTL871X: bLength=7
Jun  9 23:19:40 S5350Ubuntu1604 kernel: [11899.528162] RTL871X: bDescriptorType=5
Jun  9 23:19:40 S5350Ubuntu1604 kernel: [11899.528163] RTL871X: bEndpointAddress=81
Jun  9 23:19:40 S5350Ubuntu1604 kernel: [11899.528165] RTL871X: wMaxPacketSize=512
Jun  9 23:19:40 S5350Ubuntu1604 kernel: [11899.528166] RTL871X: bInterval=0
Jun  9 23:19:40 S5350Ubuntu1604 kernel: [11899.528168] RTL871X: RT_usb_endpoint_is_bulk_in = 1
Jun  9 23:19:40 S5350Ubuntu1604 kernel: [11899.528169] RTL871X: 
Jun  9 23:19:40 S5350Ubuntu1604 kernel: [11899.528169] usb_endpoint_descriptor(1):
〜 略 〜
 
$ lsmod | grep 8188
8188fu               1306624  0
cfg80211              565248  1 8188fu

DKMSに対応させる

事前準備として、この記事前半で行ったドライバのインストール作業を全て元に戻す。

/lib/modules/4.4.0-140-generic/kernel/drivers/net/wireless/にインストールされたドライバ8188fu.koを削除。

ダウンロードしたソースコードや、ビルドしたファイルをディレクトリごと削除。

そのうえで、再びドライバのソースコードを再ダウンロードする

$ git clone https://github.com/lutmm/rtl8188fu.git

ドライバのディレクトリに、次のような内容の dkms.conf ファイルを作成する

dkms.conf
PACKAGE_NAME="rtl8188fu"
PACKAGE_VERSION="lutmm-2012"
CLEAN="make clean"
BUILT_MODULE_NAME[0]="8188fu"   ← Makefileで設定されているビルド結果のカーネル モジュールのファイル名(拡張子の .ko は除く)
DEST_MODULE_NAME[0]="rtl8188fu"   ← システムディレクトリにコピーするときのカーネル モジュールのファイル名(拡張子の .ko は除く)
MAKE[0]="cd ${dkms_tree}/rtl8188fu/lutmm-2012/build; make"   ← Makefileがあるディレクトリに移るところから書き始める
DEST_MODULE_LOCATION[0]="/updates/dkms"   ← モジュール ファイルのインストール先ディレクトリ名(先頭の /lib/modules/{$kernelver} は省略して書く)
AUTOINSTALL="yes"

dkms.confの存在するドライバのディレクトリで、sourceコマンドを用いて環境変数を読み込む

$ source dkms.conf

そして、ソースコードを/usr/src以下にコピー

$ sudo mkdir /usr/src/$PACKAGE_NAME-$PACKAGE_VERSION
$ sudo cp -r ./rtl8188fu/* /usr/src/$PACKAGE_NAME-$PACKAGE_VERSION

コピーされたソースコードの内容は次のようになっているはず

$ ll /usr/src/rtl8188fu-lutmm-2012/
合計 112
drwxr-xr-x 7 root root  4096  6月  9 23:08 ./
drwxr-xr-x 9 root root  4096  6月  9 22:44 ../
-rw-r--r-- 1 root root   110  6月  9 22:45 Kconfig
-rwxr-xr-x 1 root root 52915  6月  9 22:48 Makefile*
-rw-r--r-- 1 root root    64  6月  9 22:45 clean
drwxr-xr-x 3 root root  4096  6月  9 22:45 core/
-rw-r--r-- 1 root root   253  6月  9 23:08 dkms.conf   ← ユーザが作成したdkms設定ファイル
drwxr-xr-x 8 root root  4096  6月  9 22:45 hal/
-rw-r--r-- 1 root root    54  6月  9 22:45 ifcfg-wlan0
drwxr-xr-x 4 root root 12288  6月  9 22:45 include/
drwxr-xr-x 3 root root  4096  6月  9 22:45 os_dep/
drwxr-xr-x 2 root root  4096  6月  9 22:45 platform/
-rw-r--r-- 1 root root   423  6月  9 22:45 runwpa
-rw-r--r-- 1 root root   294  6月  9 22:45 wlan0dhcp

ソースコードを手動でビルド、インストールしてみる

$ sudo dkms add $PACKAGE_NAME/$PACKAGE_VERSION
$ sudo dkms build $PACKAGE_NAME/$PACKAGE_VERSION
$ sudo dkms install $PACKAGE_NAME/$PACKAGE_VERSION

dkmsによるビルドが始まると、ソースコード ディレクトリから、/var/lib/dkms 以下に作成される作業ディレクトリにソースコード一式がコピーされ、そこでmakeが行われる。

make install; make clean 相当のコマンドが実行された後の 作業ディレクトリ内は次のようになっている

$ ll /var/lib/dkms/rtl8188fu/
合計 12
drwxr-xr-x 3 root root 4096 2019-06-09 23:11:38 ./
drwxr-xr-x 7 root root 4096 2019-06-09 23:09:01 ../
lrwxrwxrwx 1 root root   35 2019-06-09 23:11:38 kernel-4.4.0-150-generic-x86_64 -> lutmm-2012/4.4.0-150-generic/x86_64/
drwxr-xr-x 4 root root 4096 2019-06-09 23:10:44 lutmm-2012/
 
$ ll /var/lib/dkms/rtl8188fu/lutmm-2012/
合計 16
drwxr-xr-x 4 root root 4096 2019-06-09 23:10:44 ./
drwxr-xr-x 3 root root 4096 2019-06-09 23:11:38 ../
drwxr-xr-x 3 root root 4096 2019-06-09 23:10:44 4.4.0-150-generic/
drwxr-xr-x 7 root root 4096 2019-06-09 23:10:44 build/
lrwxrwxrwx 1 root root   29 2019-06-09 23:09:01 source -> /usr/src/rtl8188fu-lutmm-2012/
 
$ ll /var/lib/dkms/rtl8188fu/lutmm-2012/build/
合計 112
drwxr-xr-x 7 root root  4096 2019-06-09 23:10:44 ./
drwxr-xr-x 4 root root  4096 2019-06-09 23:10:44 ../
-rw-r--r-- 1 root root   110 2019-06-09 23:09:41 Kconfig
-rwxr-xr-x 1 root root 52915 2019-06-09 23:09:41 Makefile*
-rw-r--r-- 1 root root    64 2019-06-09 23:09:41 clean
drwxr-xr-x 3 root root  4096 2019-06-09 23:10:44 core/
-rw-r--r-- 1 root root   253 2019-06-09 23:09:41 dkms.conf
drwxr-xr-x 8 root root  4096 2019-06-09 23:10:44 hal/
-rw-r--r-- 1 root root    54 2019-06-09 23:09:41 ifcfg-wlan0
drwxr-xr-x 4 root root 12288 2019-06-09 23:09:41 include/
drwxr-xr-x 3 root root  4096 2019-06-09 23:10:44 os_dep/
drwxr-xr-x 2 root root  4096 2019-06-09 23:10:44 platform/
-rw-r--r-- 1 root root   423 2019-06-09 23:09:41 runwpa
-rw-r--r-- 1 root root   294 2019-06-09 23:09:41 wlan0dhcp
 
$ ll /var/lib/dkms/rtl8188fu/lutmm-2012/4.4.0-150-generic/x86_64/module/
合計 2372
drwxr-xr-x 2 root root    4096 2019-06-09 23:10:44 ./
drwxr-xr-x 4 root root    4096 2019-06-09 23:10:44 ../
-rw-r--r-- 1 root root 2418280 2019-06-09 23:10:44 rtl8188fu.ko   ← ビルドされたカーネル・モジュール(ドライバ)本体

カーネル モジュールのインストール先は

$ ll /lib/modules/4.4.0-150-generic/updates/dkms/
合計 6196
drwxr-xr-x 2 root root    4096 2019-06-09 23:11:38 ./
drwxr-xr-x 3 root root    4096 2019-06-05 07:26:34 ../
-rw-r--r-- 1 root root  242064 2019-06-09 15:13:14 drm_kms_helper.ko
-rw-r--r-- 1 root root 2212240 2019-06-09 15:13:14 i915.ko
-rw-r--r-- 1 root root   33744 2019-06-09 15:13:14 intel_ips.ko
-rw-r--r-- 1 root root 2418280 2019-06-09 23:11:38 rtl8188fu.ko   ← 今回インストールされたファイル
-rw-r--r-- 1 root root 1414336 2019-06-05 07:26:34 rtl8723bu.ko