Ubuntu 14.04の不安定なWi-Fi接続を直した

### 要約

ThinkPad X230にインストールしたばかりのLinux Ubuntu 14.04(Kernel 3.13.0)のワイヤレスネットワーク接続が不安定で困っていました。X230の内蔵無線LANカードRealtek RTL8188CEのドライバをアップデートしたら接続が安定しました。[Realtek公式ドライバ](http://www.realtek.com.tw/downloads/)はエラーでmakeできませんでしたので、[非公式ドライバ](https://github.com/FreedomBen/rtl8188ce-linux-driver)をインストールしました。


### Ubuntuのワイヤレスネットワーク接続が不安定

ウェブサービス開発を始めたくてLinux Ubuntu 14.04をThinkPad X230にインストールして使っています。Ubuntuを新規インストールして1ヶ月くらいですが、やたらネットが遅いです。X230の内蔵無線LANでワイヤレスネットワーク接続していて、数分間隔で接続が切れたり戻ったりします。デュアルブート環境のWindows 7やスマートフォンでは問題ないので、原因はUbuntu上の何かです。

``ping``を自宅ルーターに通すと、確かにパケットロスがあります。

```
$ ping -c 100 -i 0.5 192.168.1.1(無線LANルーターのローカルIPアドレス)
--- 192.168.1.1 ping statistics ---
100 packets transmitted, 32 received, 68% packet loss, time 50083ms
rtt min/avg/max/mdev = 1.340/2.081/11.570/1.713 ms
```


### ネットワーク接続安定化までの試み

#### 試み1 Wi-Fi設定

この不安定な無線LANを直したくて色々試しました。Ubuntuのどこかに原因があるのだろうけど、どうしたら直るのかわかりません。とりあえず、Wi-Fi設定の不具合を疑って、IPv6を無効にしましたが直りません。もしかしてと思い、IPv4のDHCPをマニュアル設定にしましたが直りませんでした。

#### 試み2 パワーマネジメント機能

そこで、似たような問題の記事 [Ubuntu 11.04 無線遅い・・・だが治す！（追記）](http://fecot.blog.fc2.com/blog-entry-10.html) を探しました。

この記事の著者は、[Ubuntu - Fix for Slow Wireless Internet Connection Speed (weaker than Windows) after upgrading to 11.04 Natty Narwhal](http://www.hitxp.com/articles/software/ubuntu-fix-slow-wireless-internet-connection-speed-upgrading-11-04-natty-narwhal/)を参考にしていて、無線LANのパワーマネジメント機能を切れば電力が安定供給されて直ったとのことです。

上の記事と同様にワイヤレスネットワーク情報を調べてみます。

```
$ iwconfig
wlan0     IEEE 802.11bgn  ESSID:"xxx"  
          Mode:Managed  Frequency:2.432 GHz  Access Point: 1C:B1:7F:XX:XX:XX   
          Bit Rate=150 Mb/s   Tx-Power=20 dBm   
          Retry  long limit:7   RTS thr=2347 B   Fragment thr:off
          Power Management:off (あれ？すでにパワーマネジメント機能切れてるじゃん)
          Link Quality=48/70  Signal level=-62 dBm  
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:3   Missed beacon:0
```

すでに Power Management:off になっているので、おかしいなと思いつつも

```
$ sudo iwconfig wlan0 power off
Error for wireless request "Set Power Management" (8B2C) :
    SET failed on device wlan0 ; Operation not supported.
```

と一応パワーマネジメントを切ろうとしましたが、エラーで出来ない。Operation not supported.と出ているけど、すでにoffだからエラーなのかと思い、

```
$ sudo iwconfig wlan0 power on
Error for wireless request "Set Power Management" (8B2C) :
    SET failed on device wlan0 ; Operation not supported.
```

power onでも同じエラーがでます。このエラーに関して、[ThinkPad X61 無線LANの省電力モード](http://tmtms.hatenablog.com/entry/20100523/ubuntu_iwlagn)によると、Thinkpad X61だとiwconfig wlan0 power onはiwlagnの省電力機構に問題があるようで無効にされているとのことです。ちなみに、この記事の著者は無線LANカードの発熱を抑えるために Power Management:on にしたいので、``linux-backports-modules-wireless``のソースをダウンロードしてコードを改変後にdebパッケージにしてインストールしています。私のX230でも同じことが言えるか定かではありませんが、私のネットワーク接続が不安定な問題とは関係無いように思えます。


#### 試み3 ドライバのアップデート

Power Management:on/offが不安定な接続に関係しているのか判断つきませんが、引き続き調べていると、

> RTL8188CUS,RT8192CU あたりのチップを使った無線LAN子機はそのまま使っても不安定だったはずです。  
> [ubuntu 12.04で無線が不安定なのですが、解決方法は… - Yahoo!知恵袋](http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1491829164)より引用

そういうことがあるんだと知り、私の無線LANカードの型番を調べました。

```
$ lspci
...
03:00.0 Network controller: Realtek Semiconductor Co., Ltd. RTL8188CE 802.11b/g/n WiFi Adapter (rev 01)
...
```

Realtek RTL8188CEなので、引用したチップの型番と似ています。もしかしたらこのチップもUbuntu 14.04搭載のドライバーでは不安定なのかもしれないと思い、ドライバのアップデートを試みました。

[http://www.realtek.com.tw/downloads/](http://www.realtek.com.tw/downloads/)でRTL8188CEのドライバを探すと、``Linux driver for kernel 2.6.24 (and later)``と``kernel 2.6.23 (and earlier)``の2種類があります。

```
$ uname -a
Linux X230UBU 3.13.0-85-generic #129-Ubuntu SMP Thu Mar 17 20:50:15 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
```

私のUbuntuのカーネルVer.は3.13だから``kernel 2.6.24 (and later)``をダウンロードしてファイルを /tmp/ に解凍しました。ソースファイルだったので、コンパイルするとエラーが出てコンパイルできません。

```
$ sudo su
# make
...
/tmp/rtl_92ce_92se_92de_8723ae_88ee_linux_mac80211_0012.0207.2013/base.c:885:32: error: ‘struct ieee80211_conf’ has no member named ‘channel’
       rx_status.freq = hw-&gt;conf.channel-&gt;center_freq;
                                ^
/tmp/rtl_92ce_92se_92de_8723ae_88ee_linux_mac80211_0012.0207.2013/base.c:886:32: error: ‘struct ieee80211_conf’ has no member named ‘channel’
       rx_status.band = hw-&gt;conf.channel-&gt;band;
                                ^
/tmp/rtl_92ce_92se_92de_8723ae_88ee_linux_mac80211_0012.0207.2013/base.c: In function ‘rtl_send_smps_action’:
/tmp/rtl_92ce_92se_92de_8723ae_88ee_linux_mac80211_0012.0207.2013/base.c:1451:24: error: ‘struct ieee80211_conf’ has no member named ‘channel’
   info-&gt;band = hw-&gt;conf.channel-&gt;band;
                        ^
make[2]: *** [/tmp/rtl_92ce_92se_92de_8723ae_88ee_linux_mac80211_0012.0207.2013/base.o] Error 1
make[1]: *** [/rmp/rtl_92ce_92se_92de_8723ae_88ee_linux_mac80211_0012.0207.2013] Error 2
make[1]: Leaving directory `/usr/src/linux-headers-3.13.0-85-generic'
make: *** [all] Error 2
```

エラーコードを読むと、base.c内の構造体のメンバの定義に問題があるようです。

このソースコードを直すのは私には無理だから、新しいLANカードを買おうかなと考えていました。

でも、ダメ元でもう一度調べると、[wireless - step by step Ubuntu 12.04 install of Realtek RTL8188CE driver - Ask Ubuntu](http://askubuntu.com/questions/342076/step-by-step-ubuntu-12-04-install-of-realtek-rtl8188ce-driver)を見つけました。この質問・回答に習って非公式のドライバを

[https://github.com/FreedomBen/rtl8188ce-linux-driver](https://github.com/FreedomBen/rtl8188ce-linux-driver)からダウンロードしました。ファイルを解凍して、``README.md``を読むとちゃんと私のケースと合ってます。

> Well supported RealTek cards:  
       RTL8188CE  
       ...  
Well supported kernel releases:  
       ...  
       3.13.x  
       ...  
Well supported Ubuntu (and Ubuntu-based) releases:  
       ...  
       Ubuntu 14.04 (LTS)  
       ...  

早速インストールを始めます。

```
$ sudo su
# sh install.sh
[*] So you want to live on the wild side and try a different driver for your RealTek wireless card eh?  Awesome!  I'll help you do it.
-e 
[*] We are going to build and install the driver from source code, compiled specifically for your machine.

-e [*] If you want to do the build/install manually, there are instructions in the "README.md" file.
-e 
[*] Please report any bugs/problems at https://github.com/FreedomBen/rtl8188ce-linux-driver
```

このようにメッセージが表示され、Enterを押して続けると最後に

```
[*] OK, ready for a reboot. (only necessary if your wifi is not working)
```

どうやらインストールが無事に終わったらしく、念のためリブートしました。

リブート後、pingでパケットロスがあるか確かめてみると、

```
$ ping -c 100 -i 0.5 192.168.1.1(無線LANルーターのローカルIPアドレス)
--- 192.168.1.1 ping statistics ---
100 packets transmitted, 100 received, 0% packet loss, time 19885ms
rtt min/avg/max/mdev = 1.172/6.352/133.374/19.672 ms
```

パケットロスがなくなりました！以降、安定してネットが使えています。


### 結論

ThinkPad X230にインストールしたLinux Ubuntu 14.04(Kernel 3.13.0)のワイヤレスネットワーク接続が不安定な問題を解決したくて色々試しました。その結果、X230の内蔵無線LANカードRealtek RTL8188CEのドライバに問題がありそうなことがわかりました。[有志の方が作った非公式のドライバ](https://github.com/FreedomBen/rtl8188ce-linux-driver)をインストールしたら接続が安定しました。


### おわりに

Ubuntuを使い始めてネットがやたら遅いのに耐えられず、いろいろ試行錯誤しても直らず、諦めかけていたところで[https://github.com/FreedomBen](https://github.com/FreedomBen)を見つけました。``sh install.sh``を実行した後に現れるドライバの作者のメッセージ

```
So you want to live on the wild side and try a different driver for your RealTek wireless card eh?  Awesome!  I'll help you do it.
```

には頼もしくて感激しました。Linuxを使い始めて日が浅いですけど、こういうことがあるんですね。助かりました。ありがとう！


### 2016-04-29 追記

2日連続で作業終了時にサスペンドにしたら、突然Wi-Fiがオンラインにならなくなりました。スマートフォンは接続できるので、無線LANカード関係のハードウェアかソフトウェアが壊れたと思いました。一応、ルーターの電源プラグを抜いて、少し待ってまた挿して再起動したら、無事オンラインになりました。何ですかね…。


### 2016-05-27 追記

サスペンドするとパケットロスが発生するようになります。PCを再起動してもロスがあるままで直りません。無線LANルーターを再起動すると直ります。あと、原因不明でまたパケットロスが出るようになって、githubのドライバを再インストールすると直りました。


### 2017-09-09 追記

私のサイト[KOSUKE MAEDA](http://www.kosukemaeda.com)にあったこの記事をQiitaに移動しました。