はじめに
概要
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サポートされていないため、その点は留意下さい。
確認環境
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のような一貫性のある命名をします*2。RHELのAMIから起動した場合は従来のeth0のようなデバイス名称を継続利用するために、このデバイス命名の一貫性の機能を無効化します。
(a) Grubのテンプレートファイルに設定を追加
起動オプションに、"net.ifnames=0"を追加します。
- /etc/default/grub
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