最近不調のためドライバを更新してみました。
更新しようとドライバを落として、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
~省略~
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)のインストールはこちら。