のぴぴのメモ

自分用のLinuxとかの技術メモ

RHEL7.1でENA(Elastic Network Adapter)を利用する手順

はじめに

概要

ENA(Elastic Network Adapter)は、シングルルート I/O 仮想化 (SR-IOV) を使用したAWSの拡張ネットワーキングです。RHEL7.1にはこのENAのドライバが含まれていないため、RHEL7.1環境でENAを利用する場合は個別にインストールする必要があります。この記事は、RHEL7.1環境にENAドライバをインストールして利用可能にする手順をまとめたものです。

留意事項

RHEL7でENAがサポートしているのは、RHEL7.4以降になります。RHEL7.1ではENAサポートされていないため、その点は留意下さい。

確認環境

  • リージョン: 東京リージョン
  • 利用AMI: RHEL-7.1_HVM_GA-20150225-x86_64-1-Hourly2-GP2 (ami-b1b458b1)
  • 利用インスタンス: m4.16xlarge

ENAドライバインストール手順

RHEL7.1をm4インスタンスで起動してenaをインストールします。

RHEL7.1の初期状態の確認

(1)RHELカーネルバージョン、AMI/インスタンスタイプ確認

$ cat /proc/version 
Linux version 3.10.0-229.el7.x86_64 (mockbuild@x86-035.build.eng.bos.redhat.com) (gcc version 4.8.3 20140911 (Red Hat 4.8.3-7) (GCC) ) #1 SMP Thu Jan 29 18:37:38 EST 2015

$  curl http://169.254.169.254/latest/meta-data/ami-id;echo
ami-b1b458b1

$ curl http://169.254.169.254/latest/meta-data/instance-type;echo
m4.16xlarge

(2) enaドライバの確認
RHEL7.1でAMIからインスタンスを起動した状態では、enaドライバがないことを確認します。

$ sudo modinfo ena
modinfo: ERROR: Module ena not found.

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

(1)必要なrpmパッケージのインストール

git、 makeコマンド、gccコマンドなど必要なrpmパッケージをインストールします。また、gitが内部で利用するcurlのバージョンが古くgitが動作しないので、curlだけrpmをアップデートします。

$ sudo yum -y update curl
$ sudo yum -y install git make gcc
$ sudo yum -y install kernel-devel-$(uname -r)
(2)enaドライバのソースをgitから取得

マニュアル*1の内容に従いgitからコードをダウンロードします。

$ git clone https://github.com/amzn/amzn-drivers
(3)ビルド
$ cd amzn-drivers/kernel/linux/ena
$ make
(4)動作確認
$ sudo insmod ena.ko
$ lsmod |grep ena
ena                    98319  0  <==ドライバが組み込まれていることを確認
$ sudo rmmod ena
$ lsmod |grep ena
(5)インストール

(a) modprobeのカーネルモジュールロード設定追加

$ sudo sh -c 'cat >  /etc/modules-load.d/ena.conf'
ena

(b) モジュールのコピー・依存関係の更新・dracutの更新

$ sudo cp ena.ko /lib/modules/$(uname -r)/
$ sudo depmod
$ sudo dracut -f -v
(6)動作確認
$ sudo shutdown -r 0
<SSHログイン後>
$ cat /proc/version 
Linux version 3.10.0-229.el7.x86_64 (mockbuild@x86-035.build.eng.bos.redhat.com) (gcc version 4.8.3 20140911 (Red Hat 4.8.3-7) (GCC) ) #1 SMP Thu Jan 29 18:37:38 EST 2015
$ lsmod|grep ena
ena                    98319  0 
(7)起動オプションの追加

最近のsystemdやudevでのデバイス命名は、enp5s0のような一貫性のある命名をします*2RHELのAMIから起動した場合は従来のeth0のようなデバイス名称を継続利用するために、このデバイス命名の一貫性の機能を無効化します。
(a) Grubのテンプレートファイルに設定を追加
起動オプションに、"net.ifnames=0"を追加します。

GRUB_TIMEOUT=1
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto console=ttyS0,115200n8 console=tty0 net.ifnames=0"
GRUB_DISABLE_RECOVERY="true"

(b)grub2設定更新

$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg
$ sudo shutdown -r 0

インスタンスのENA有効化

インスタンスがstopの状態で、modify-instance-attributeでENAを有効化します。そして有効化後にインスタンスを起動します。

$ aws ec2 modify-instance-attribute --instance-id i-0180f9795f32bf2c1 --ena-support
$ aws --profile dev1 ec2 start-instances  --instance-ids i-0180f9795f32bf2c1

確認

dmesgやmessagesで状態を確認します。

(1)dmesg
[   22.879003] ena: module verification failed: signature and/or required key missing - tainting kernel
[   22.883928] ena: Elastic Network Adapter (ENA) v2.0.2g
[   22.884033] ena 0000:00:03.0: Elastic Network Adapter (ENA) v2.0.2g
[   22.890297] ena: ena device version: 0.10
[   22.890299] ena: ena controller version: 0.0.1 implementation version 1
[   22.938296] ena 0000:00:03.0: LLQ is not supported Fallback to host mode policy.
[   22.938397] ena 0000:00:03.0: creating 8 io queues. rx queue size: 1024 tx queue size. 1024 LLQ is DISABLED
[   22.943929] ena 0000:00:03.0: Elastic Network Adapter (ENA) found at mem f3000000, mac addr 06:b9:68:b9:70:b2 Queues 8, Placement policy: Regular

"ena: Elastic Network Adapter (ENA) v2.0.2g"以下の行で、enaがロードされ初期化されているのがわかります。

(2)/var/log/messages
Dec 10 01:13:54 ip-10-0-0-136 NetworkManager[1190]: <info>  (eth0): carrier is OFF (but ignored)
Dec 10 01:13:54 ip-10-0-0-136 NetworkManager[1190]: <info>  (eth0): new Ethernet device (driver: 'ena' ifindex: 2)
Dec 10 01:13:54 ip-10-0-0-136 NetworkManager[1190]: <info>  (eth0): exported as /org/freedesktop/NetworkManager/Devices/0
Dec 10 01:13:54 ip-10-0-0-136 NetworkManager[1190]: <info>  (eth0): device state change: unmanaged -> unavailable (reason 'managed') [10 20 2]
(3) sysfs
$ ll /sys/class/net/eth0/
total 0
-r--r--r--.  1 root root 4096 Dec 10 02:23 addr_assign_type
-r--r--r--.  1 root root 4096 Dec 10 02:23 address
-r--r--r--.  1 root root 4096 Dec 10 02:28 addr_len
-r--r--r--.  1 root root 4096 Dec 10 02:28 broadcast
-rw-r--r--.  1 root root 4096 Dec 10 02:28 carrier
lrwxrwxrwx.  1 root root    0 Dec 10 02:23 device -> ../../../0000:00:03.0
-r--r--r--.  1 root root 4096 Dec 10 02:23 dev_id
-r--r--r--.  1 root root 4096 Dec 10 02:23 dev_port
-r--r--r--.  1 root root 4096 Dec 10 02:28 dormant
-r--r--r--.  1 root root 4096 Dec 10 02:28 duplex
-rw-r--r--.  1 root root 4096 Dec 10 02:28 flags
-rw-r--r--.  1 root root 4096 Dec 10 02:28 ifalias
-r--r--r--.  1 root root 4096 Dec 10 02:23 ifindex
-r--r--r--.  1 root root 4096 Dec 10 02:23 iflink
-r--r--r--.  1 root root 4096 Dec 10 02:28 link_mode
-rw-r--r--.  1 root root 4096 Dec 10 02:28 mtu
-rw-r--r--.  1 root root 4096 Dec 10 02:28 netdev_group
-r--r--r--.  1 root root 4096 Dec 10 02:28 operstate
-r--r--r--.  1 root root 4096 Dec 10 02:23 phys_port_id
drwxr-xr-x.  2 root root    0 Dec 10 02:28 power
drwxr-xr-x. 18 root root    0 Dec 10 02:23 queues
-r--r--r--.  1 root root 4096 Dec 10 02:28 speed
drwxr-xr-x.  2 root root    0 Dec 10 02:28 statistics
lrwxrwxrwx.  1 root root    0 Dec 10 02:23 subsystem -> ../../../../../class/net
-rw-r--r--.  1 root root 4096 Dec 10 02:28 tx_queue_len
-r--r--r--.  1 root root 4096 Dec 10 02:23 type
-rw-r--r--.  1 root root 4096 Dec 10 02:23 uevent

eth0に対応するハードウェアが、PCIの"0000:00:03.0”であることを確認し、次じそのデバイス情報を参照します。すると下記の通り、”driver -> ../../../bus/pci/drivers/ena”をドライバとして利用していることがわかり、結果eht0はenaであることが確認できます。

$ ll /sys/devices/pci0000\:00/0000\:00\:03.0/
total 0
-rw-r--r--. 1 root root  4096 Dec 10 02:26 broken_parity_status
-r--r--r--. 1 root root  4096 Dec 10 02:23 class
-rw-r--r--. 1 root root   256 Dec 10 02:23 config
-r--r--r--. 1 root root  4096 Dec 10 02:26 consistent_dma_mask_bits
-rw-r--r--. 1 root root  4096 Dec 10 02:26 d3cold_allowed
-r--r--r--. 1 root root  4096 Dec 10 02:23 device
-r--r--r--. 1 root root  4096 Dec 10 02:26 dma_mask_bits
lrwxrwxrwx. 1 root root     0 Dec 10 02:23 driver -> ../../../bus/pci/drivers/ena
-rw-r--r--. 1 root root  4096 Dec 10 02:26 enable
lrwxrwxrwx. 1 root root     0 Dec 10 02:26 firmware_node -> ../../LNXSYSTM:00/device:00/PNP0A03:00/device:1b
-r--r--r--. 1 root root  4096 Dec 10 02:26 irq
-r--r--r--. 1 root root  4096 Dec 10 02:26 local_cpulist
-r--r--r--. 1 root root  4096 Dec 10 02:23 local_cpus
-r--r--r--. 1 root root  4096 Dec 10 02:26 modalias
-rw-r--r--. 1 root root  4096 Dec 10 02:26 msi_bus
drwxr-xr-x. 2 root root     0 Dec 10 02:23 msi_irqs
drwxr-xr-x. 3 root root     0 Dec 10 02:23 net
-r--r--r--. 1 root root  4096 Dec 10 02:23 numa_node
drwxr-xr-x. 2 root root     0 Dec 10 02:26 power
--w--w----. 1 root root  4096 Dec 10 02:26 remove
--w--w----. 1 root root  4096 Dec 10 02:26 rescan
-r--r--r--. 1 root root  4096 Dec 10 02:26 resource
-rw-------. 1 root root 16384 Dec 10 02:26 resource0
-rw-r--r--. 1 root root  4096 Dec 10 02:26 rx_copybreak
lrwxrwxrwx. 1 root root     0 Dec 10 02:23 subsystem -> ../../../bus/pci
-r--r--r--. 1 root root  4096 Dec 10 02:26 subsystem_device
-r--r--r--. 1 root root  4096 Dec 10 02:26 subsystem_vendor
-rw-r--r--. 1 root root  4096 Dec 10 02:23 uevent
-r--r--r--. 1 root root  4096 Dec 10 02:23 vendor