KUSONEKOの見る世界

CentOS 7.2 で r8169 のドライバを更新してみた

Realteh社のRTL8169Sを積んでいるNICを使用しているのですが、
最近不調のためドライバを更新してみました。
更新しようとドライバを落として、makeをしたのですがそのままではエラーが出てインストールできませんでした。 原因が分かったため、メモを残しておきたいと思います。

■現在のドライバを確認

まず、現在のドライバを確認すると。

[root@server ~]# modinfo r8169
filename:       /lib/modules/3.10.0-327.13.1.el7.x86_64/kernel/drivers/net/ethernet/realtek/r8169.ko
~省略~
version:        2.3LK-NAPI
license:        GPL
description:    RealTek RTL-8169 Gigabit Ethernet driver
~省略~

[root@server ~]# ethtool -i enp3s2
driver: r8169
version: 2.3LK-NAPI
firmware-version:
bus-info: 0000:03:02.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: yes
supports-priv-flags: no


■そのままコンパイルしてみるが…

ドライバをRealtek社から落としてきて、/rootに入れ、readme通りにコマンドを打つも、失敗する。
[root@server ~]# tar xvf 0003-r8169-6.021.00.tar.bz2
~省略~

[root@server ~]# cd r8169-6.021.00/
[root@server r8169-6.021.00]# make clean modules
~省略~
make[2]: ディレクトリ `/usr/src/kernels/3.10.0-327.13.1.el7.x86_64' に入ります
  CC [M]  /root/r8169-6.021.00/src/r8169_n.o
/root/r8169-6.021.00/src/r8169_n.c: 関数 ‘rtl8169_tx_vlan_tag’ 内:
/root/r8169-6.021.00/src/r8169_n.c:871:9: エラー: 関数 ‘vlan_tx_tag_present’ の暗黙的な宣言です [-Werror=implicit-function-declaration]
         return (vlan_tx_tag_present(skb)) ?
         ^
/root/r8169-6.021.00/src/r8169_n.c:872:16: エラー: 関数 ‘vlan_tx_tag_get’ の暗黙的な宣言です [-Werror=implicit-function-declaration]
                TxVlanTag | swab16(vlan_tx_tag_get(skb)) : 0x00;
~省略~

■ソースを編集してコンパイル

調べてみると、3.10.0-327.3.1(以降?)のカーネルには、'vlan_tx_tag_get()' と 'vlan_tx_tag_present()' の関数が無くなり、'skb_vlan_tag_get()' と 'skb_vlan_tag_present()' の関数に変わったらしく、失敗していたようだ。
なので、ソースを弄ってコンパイルする。

[root@server r8169-6.021.00]# vi src/r8169_n.c
870行目
#elif LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0)
を以下に編集。
#elif LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)

[root@server r8169-6.021.00]# make clean modules
~省略~
[root@server r8169-6.021.00]# make install
~省略~

[root@server r8169-6.021.00]# depmod -a
[root@server r8169-6.021.00]# modprobe r8169


■新しいバージョンの確認

以下は、新しいバージョンになっています。

[root@server r8169-6.021.00]# modinfo r8169
filename:       /lib/modules/3.10.0-327.13.1.el7.x86_64/kernel/drivers/net/ethernet/realtek/r8169.ko
version:        6.021.00-NAPI
~省略~

以下は、古いまま・・・。再起動しても変わらず。

[root@server r8169-6.021.00]# ethtool -i enp3s2
driver: r8169
version: 2.3LK-NAPI


■初期RAMDISKの再作成

NICのドライバは、初期RAMDISK内のドライバを起動時にロードしているようで、初期RAMDISKが古いままだと古いドライバのままのようだ。
なので、初期RAMDISKを作り直す。

まずは現状の物をバックアップしてから作成する。

[root@server ~]# cd /boot/
[root@server boot]# mv initramfs-$(uname -r).img initramfs-$(uname -r).img.bak
[root@server boot]# dracut /boot/initramfs-$(uname -r).img
~省略~


再起動後確認すると、新しくなっていました。
[root@server ~]# ethtool -i enp3s2
driver: r8169
version: 6.021.00-NAPI
firmware-version:
bus-info: 0000:03:02.0
supports-statistics: no
supports-test: no
supports-eeprom-access: no
supports-register-dump: yes
supports-priv-flags: no


■別NICも更新

後日、オンボードNICの r8101 も同様の手順で新しくできました。
[root@server ~]# ethtool -i enp2s0
driver: r8101
version: 1.028.00-NAPI
firmware-version:
bus-info: 0000:02:00.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: yes
supports-priv-flags: no



ちなみに使っている増設側NICはこれです。

BUFFALO LGY-PCI-GT


■2016/05/15追記

Centos7.2のカーネルが、3.10.0-327.18.2.el7.x86_64 に更新されて、
ドライバが古いの物に戻ってしまいました。
もう一度上記の手順を実施して問題なく対応できました。

■2016/06/25追記

Centos7.2のカーネルが、3.10.0-327.22.2.el7.x86_64 になり、
Realtekのドライバも、以下の物が公開されていましたが、
上記の手順で問題ありませんでした。
  • 6.022.00-NAPI
  • 1.029.00-NAPI

■2016/08/04追記

Centos7.2のカーネルが、3.10.0-327.28.2.el7.x86_64 になりましたが、
上記の手順で問題ありません。

■2016/08/21追記

Centos7.2のカーネルが、3.10.0-327.28.3.el7.x86_64 になりましたが、
上記の手順で問題ありません。

■2016/09/22追記

Centos7.2のカーネルが、3.10.0-327.36.1.el7.x86_64 になりましたが、
上記の手順で問題ありません。

■2017/01/29追記

サーバを新しくしましたので、NICが変わりました。
RTL8111H (ドライバはr8168)のインストールはこちら