2014年1月14日火曜日

Oracle VM Server 3.2.6 への NIC ドライバ導入(Intel NUC D34010WYK)


Haswell の Intel NUC D34010WYK に Oracle VM Server 3.2.6 をインストールしたら
残念ながら NIC のドライバが当たりませんでした。
そこで、Intel のサイトから Intel I218-V のドライバをダウンロードして
インストールしてみました。

Intel NUC Kit D34010WYK
http://ark.intel.com/ja/products/76978/

Intel I218 ファミリー (NIC)
http://www.intel.com/content/www/us/en/ethernet-controllers/ethernet-connection-i218-family.html

NIC ドライバをインストールする OVS
[root@ovs326-6 ~]# dmidecode -s baseboard-product-name
# SMBIOS implementations newer than version 2.6 are not
# fully supported by this version of dmidecode.
D34010WYK
[root@ovs326-6 ~]# cat /etc/redhat-release
Oracle VM server release 3.2.6
[root@ovs326-6 ~]# cat /etc/oracle-release
Oracle VM Server release 5.7
[root@ovs326-6 ~]# uname -a
Linux ovs326-6 2.6.39-300.32.5.el5uek #1 SMP Mon Aug 5 11:19:15 PDT 2013 x86_64 x86_64 x86_64 GNU/Linux

NIC ドライバのソースファイル
I218-V のドライバを下記からダウンロードします。
https://downloadcenter.intel.com/Detail_Desc.aspx?agr=Y&DwnldID=15817&lang=jpn
[root@ovs326-6 ~]# ls -l e1000e-2.5.4.tar.gz
-rw-r--r-- 1 root root 269997 Jan 13 08:25 e1000e-2.5.4.tar.gz

RPM ファイル

OVS には gcc、make、man もインストールします。
依存関係のある RPM も含めて Oracle Linux 5.7 x86_64(64bit)の
インストールメディアから持ってきました。
ORACLE の パブリック YUM リポジトリからも入手できます。
http://public-yum.oracle.com/repo/OracleLinux/OL5/7/base/x86_64/
cpp-4.1.2-51.el5.x86_64.rpm
gcc-4.1.2-51.el5.x86_64.rpm
glibc-2.5-65.i686.rpm
glibc-2.5-65.x86_64.rpm
glibc-common-2.5-65.x86_64.rpm
glibc-devel-2.5-65.x86_64.rpm
glibc-headers-2.5-65.x86_64.rpm
groff-1.18.1.1-11.1.x86_64.rpm
libgcc-4.1.2-51.el5.x86_64.rpm
libgomp-4.4.4-13.el5.x86_64.rpm
make-3.81-3.el5.x86_64.rpm
man-1.6d-2.el5.x86_64.rpm
nscd-2.5-65.x86_64.rpm
kernel-uek-devel と kernel-uek-headers は、
OVS 3.2.6 の UEK カーネルバージョンが一致する RPM が
インストールメディアやパブリック YUM サイトに見当たらなかったので
ソース RPM からビルドしました。
kernel-uek-devel-2.6.39-300.32.5.el5uek.x86_64.rpm
kernel-uek-headers-2.6.39-300.32.5.el5uek.x86_64.rpm

0. OVS のインストール

NIC を認識しないマシンには OVS がインストールできないため、
別のマシンを利用して USB メモリにOVSをインストールしておきます。
そして、 NUC を USB メモリで OVS を起動します。
NUC のローカル SSD に別の OS が入っていなければ、
USB メモリを接続して NUC の電源を入れるだけで起動できます。

NIC ドライバ適用前の状態

Intel の Ethernet controller は認識されていますが、使用できませんでした。
[root@ovs326-6 ~]# lspci
00:00.0 Host bridge: Intel Corporation Device 0a04 (rev 09)
00:02.0 VGA compatible controller: Intel Corporation Device 0a16 (rev 09)
00:03.0 Audio device: Intel Corporation Device 0a0c (rev 09)
00:14.0 USB Controller: Intel Corporation Device 9c31 (rev 04)
00:16.0 Communication controller: Intel Corporation Device 9c3a (rev 04)
00:19.0 Ethernet controller: Intel Corporation Device 1559 (rev 04)
00:1b.0 Audio device: Intel Corporation Device 9c20 (rev 04)
00:1d.0 USB Controller: Intel Corporation Device 9c26 (rev 04)
00:1f.0 ISA bridge: Intel Corporation Device 9c43 (rev 04)
00:1f.3 SMBus: Intel Corporation Device 9c22 (rev 04)

bond0 は作成されていますが、MACアドレスは 00:00:00:00:00:00 で
eth0 は作成されていません。
ちなみに /etc/modprobe.conf で eth0 の エイリアスを e1000e にして
モジュールをロードしてもダメでした。
[root@ovs326-6 ~]# ifconfig -a
bond0     Link encap:Ethernet  HWaddr 00:00:00:00:00:00
          inet addr:192.168.4.26  Bcast:192.168.4.255  Mask:255.255.255.0
          UP BROADCAST MASTER MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:46 errors:0 dropped:0 overruns:0 frame:0
          TX packets:46 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:6905 (6.7 KiB)  TX bytes:6905 (6.7 KiB)

1. RPM のインストール

ドライバのインストールに必要な RPM をインストールしておきます。
[root@ovs326-6 rpm]# ls
cpp-4.1.2-51.el5.x86_64.rpm
gcc-4.1.2-51.el5.x86_64.rpm
glibc-2.5-65.i686.rpm
glibc-2.5-65.x86_64.rpm
glibc-common-2.5-65.x86_64.rpm
glibc-devel-2.5-65.x86_64.rpm
glibc-headers-2.5-65.x86_64.rpm
groff-1.18.1.1-11.1.x86_64.rpm
kernel-uek-devel-2.6.39-300.32.5.el5uek.x86_64.rpm
kernel-uek-headers-2.6.39-300.32.5.el5uek.x86_64.rpm
libgcc-4.1.2-51.el5.x86_64.rpm
libgomp-4.4.4-13.el5.x86_64.rpm
make-3.81-3.el5.x86_64.rpm
man-1.6d-2.el5.x86_64.rpm
nscd-2.5-65.x86_64.rpm
[root@ovs326-6 rpm]# rpm -Uvh *rpm
warning: cpp-4.1.2-51.el5.x86_64.rpm: Header V3 DSA signature: NOKEY, key ID 1e5e0159
Preparing...              #################### [100%]
   1:libgcc               #################### [  7%]
   2:glibc-common         #################### [ 13%]
   3:glibc                #################### [ 20%]
   4:cpp                  #################### [ 27%]
   5:groff                #################### [ 33%]
   6:libgomp              #################### [ 40%]
   7:kernel-uek-headers   #################### [ 47%]
   8:man                  #################### [ 53%]
   9:make                 #################### [ 60%]
  10:nscd                 #################### [ 67%]
  11:glibc-headers        #################### [ 73%]
  12:glibc-devel          #################### [ 80%]
  13:kernel-uek-devel     #################### [ 87%]
  14:glibc                #################### [ 93%]
  15:gcc                  #################### [100%]


2. ソースファイルの編集

ドライバを make install すると、エラーになってしまいました。
[root@ovs326-6 src]# make install
make -C /lib/modules/2.6.39-300.32.5.el5uek/build SUBDIRS=/root/e1000e-2.5.4/src modules
make[1]: Entering directory `/usr/src/kernels/2.6.39-300.32.5.el5uek'
  CC [M]  /root/e1000e-2.5.4/src/netdev.o
In file included from /root/e1000e-2.5.4/src/e1000.h:39,
                 from /root/e1000e-2.5.4/src/netdev.c:55:
/root/e1000e-2.5.4/src/kcompat.h:3446: error: redefinition of typedef ‘netdev_features_t’
include/linux/netdevice.h:985: error: previous declaration of ‘netdev_features_t’ was here
make[2]: *** [/root/e1000e-2.5.4/src/netdev.o] Error 1
make[1]: *** [_module_/root/e1000e-2.5.4/src] Error 2
make[1]: Leaving directory `/usr/src/kernels/2.6.39-300.32.5.el5uek'
make: *** [default] Error 2

そこで、今回は下記のようにファイルを編集してしまいました。
[root@ovs326-6 src]# cp -p /usr/src/kernels/2.6.39-300.32.5.el5uek/include/linux/netdevice.h ~/netdevice.h_orig
[root@ovs326-6 src]# vi /usr/src/kernels/2.6.39-300.32.5.el5uek/include/linux/netdevice.h

/usr/src/kernels/2.6.39-300.32.5.el5uek/include/linux/netdevice.h の編集内容

(編集前)
    985 typedef u32 netdev_features_t;
    986 /*
    987  *      The DEVICE structure.
    988  *      Actually, this whole structure is a big mistake.  It mixes I/O
    989  *      data with strictly "high-level" data, and it has to know about
    990  *      almost every data structure used in the INET module.
    991  *
    992  *      FIXME: cleanup struct net_device such that network protocol info
    993  *      moves out.
    994  */
(編集後)
    985 //typedef u32 netdev_features_t;
    986 /*
    987  *      The DEVICE structure.
    988  *      Actually, this whole structure is a big mistake.  It mixes I/O
    989  *      data with strictly "high-level" data, and it has to know about
    990  *      almost every data structure used in the INET module.
    991  *
    992  *      FIXME: cleanup struct net_device such that network protocol info
    993  *      moves out.
    994  */
(差分)
[root@ovs326-6 src]# diff ~/netdevice.h_orig /usr/src/kernels/2.6.39-300.32.5.el5uek/include/linux/netdevice.h
985c985
< typedef u32 netdev_features_t;
---
> //typedef u32 netdev_features_t;

3. NIC ドライバのインストール

ドライバは、ソースからインストールします。
[root@ovs326-6 ~]# tar zxf e1000e-2.5.4.tar.gz
[root@ovs326-6 ~]# cd e1000e-2.5.4/src/
[root@ovs326-6 src]# make install
make -C /lib/modules/2.6.39-300.32.5.el5uek/build SUBDIRS=/root/e1000e-2.5.4/src modules
make[1]: Entering directory `/usr/src/kernels/2.6.39-300.32.5.el5uek'
  CC [M]  /root/e1000e-2.5.4/src/netdev.o
  CC [M]  /root/e1000e-2.5.4/src/ethtool.o
  CC [M]  /root/e1000e-2.5.4/src/param.o
  CC [M]  /root/e1000e-2.5.4/src/82571.o
  CC [M]  /root/e1000e-2.5.4/src/ich8lan.o
  CC [M]  /root/e1000e-2.5.4/src/80003es2lan.o
  CC [M]  /root/e1000e-2.5.4/src/mac.o
  CC [M]  /root/e1000e-2.5.4/src/nvm.o
  CC [M]  /root/e1000e-2.5.4/src/phy.o
  CC [M]  /root/e1000e-2.5.4/src/manage.o
  CC [M]  /root/e1000e-2.5.4/src/kcompat.o
  LD [M]  /root/e1000e-2.5.4/src/e1000e.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /root/e1000e-2.5.4/src/e1000e.mod.o
  LD [M]  /root/e1000e-2.5.4/src/e1000e.ko.unsigned
  NO SIGN [M] /root/e1000e-2.5.4/src/e1000e.ko
make[1]: Leaving directory `/usr/src/kernels/2.6.39-300.32.5.el5uek'
gzip -c ../e1000e.7 > e1000e.7.gz
# remove all old versions of the driver
find /lib/modules/2.6.39-300.32.5.el5uek -name e1000e.ko -exec rm -f {} \; || true
find /lib/modules/2.6.39-300.32.5.el5uek -name e1000e.ko.gz -exec rm -f {} \; || true
install -D -m 644 e1000e.ko /lib/modules/2.6.39-300.32.5.el5uek/kernel/drivers/net/e1000e/e1000e.ko
/sbin/depmod -a || true
install -D -m 644 e1000e.7.gz /usr/share/man/man7/e1000e.7.gz
man -c -P'cat > /dev/null' e1000e || true
Formatting page, please wait...
[root@ovs326-6 src]#

4. 設定ファイルの編集

インストールした NIC ドライバをロードする前に
モジュールのエイリアスと、インターフェースの設定ファイルを修正しておきます。

modprobe.conf の修正
(修正前)
[root@ovs326-6 ~]# cat /etc/modprobe.conf | grep e1000
alias eth0 e1000

(修正後)
[root@ovs326-6 src]# cat /etc/modprobe.conf | grep e1000
alias eth0 e1000e

/etc/sysconfig/network-scripts/ifcfg-eth0 の編集

OVS は NIC を認識しないマシンにはインストールできないので
この OVS は、別のマシンで USBメモリにインストールしていました。
その時にインストールした時に認識した NIC の名前と
MACアドレス(HWADDR=XX:XX:XX:XX:XX:XX の部分)を削除 か コメントアウトします。

Intel NUC はオンボード のネットワークポート が 1つしかないため
ifcfg-ethX で MAC アドレスを明記しなくてもなんとか使えます…
(修正前)
# Intel Corporation 82540EM Gigabit Ethernet Controller
DEVICE=eth0
BOOTPROTO=none
HWADDR=08:00:27:F3:4E:16
ONBOOT=yes
MASTER=bond0
SLAVE=yes

(修正後)
DEVICE=eth0
BOOTPROTO=none
#HWADDR=08:00:27:F3:4E:16
ONBOOT=yes
MASTER=bond0
SLAVE=yes

5. e1000e モジュールのロード

modprobe コマンドで、e1000e ドライバをロードします。
[root@ovs326-6 ~]# modprobe e1000e
[root@ovs326-6 ~]# lsmod | grep e1000
e1000e                258218  0
e1000                 164944  0

eth0 が認識されるようになります。
[root@ovs326-6 src]# ifconfig -a
bond0     Link encap:Ethernet  HWaddr EC:A8:6B:FD:6F:63
          inet addr:192.168.4.26  Bcast:192.168.4.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
          RX packets:184 errors:0 dropped:0 overruns:0 frame:0
          TX packets:148 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:22686 (22.1 KiB)  TX bytes:80761 (78.8 KiB)

eth0      Link encap:Ethernet  HWaddr EC:A8:6B:FD:6F:63
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:184 errors:0 dropped:0 overruns:0 frame:0
          TX packets:148 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:22686 (22.1 KiB)  TX bytes:80761 (78.8 KiB)
          Interrupt:20 Memory:f7c00000-f7c20000

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:92 errors:0 dropped:0 overruns:0 frame:0
          TX packets:92 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:19928 (19.4 KiB)  TX bytes:19928 (19.4 KiB)
これで OVS がネットワークに接続できるようになります。

おまけ

OVS 3.2.6 がもともと持っている e1000e ドライバの情報
※ これでは NIC が認識しなかった。
[root@ovs326-6 ~]# modinfo e1000e | head
filename:       /lib/modules/2.6.39-300.32.5.el5uek/kernel/drivers/net/e1000e/e1000e.ko
version:        2.0.0.1-NAPI
license:        GPL
description:    Intel(R) PRO/1000 Network Driver
author:         Intel Corporation, <linux.nics@intel.com>
srcversion:     4E1E5D9368E2FAE279A50EE
alias:          pci:v00008086d0000153Bsv*sd*bc*sc*i*
alias:          pci:v00008086d0000153Asv*sd*bc*sc*i*
alias:          pci:v00008086d00001503sv*sd*bc*sc*i*
alias:          pci:v00008086d00001502sv*sd*bc*sc*i*

今回インストール(アップデート)したドライバの情報
[root@ovs326-6 ~]# modinfo e1000e | head
filename:       /lib/modules/2.6.39-300.32.5.el5uek/kernel/drivers/net/e1000e/e1000e.ko
version:        2.5.4-NAPI
license:        GPL
description:    Intel(R) PRO/1000 Network Driver
author:         Intel Corporation, <linux.nics@intel.com>
srcversion:     14FC0D45EE1DAA1B5E0DBBA
alias:          pci:v00008086d000015A3sv*sd*bc*sc*i*
alias:          pci:v00008086d000015A2sv*sd*bc*sc*i*
alias:          pci:v00008086d000015A1sv*sd*bc*sc*i*
alias:          pci:v00008086d000015A0sv*sd*bc*sc*i*

以上、OVS への NIC ドライバのインストールでした。

0 件のコメント:

コメントを投稿