(Red Hat編)Nitro世代へのEC2インスタンスタイプ変更を試してみた
更新:2020/06/09
Nitro対応をチェックするスクリプト名(c5_m5_checks_script.sh
からnitro_check_script.sh
へ)、ナレッジベースURLの変更を反映しました。
re:Invent 2017で発表された Nitro システムでは AWS が構築したハードウェアとソフトウェアのコンポーネントが一体化され、この上で動作する各インスタンスは、 高パフォーマンス、高可用性、優れたセキュリティを実現し、ベアメタル機能を備えることで仮想化オーバーヘッドを排除します。
C5/C5d, M5/M5d に続き、8月からは T3 のインスタンスタイプも提供されています。
旧世代のインスタンスタイプ(C3系)で動作する Red Hat を Nitro 世代のインスタンスタイプに変換する機会がありましたので、手順を紹介します。
他のプラットフォームでの対応方法は以下の記事を参照ください。
- 既存 Windows インスタンスを Nitro 世代(m5,c5,t3 …)に移行する手順まとめ ※’18/12 update対応版 | DevelopersIO
- 2012年当時のWindows2008R2環境をNITRO世代のインスタンスに変更してみた | DevelopersIO
- NITRO世代(C5、M5)へのEC2インスタンスタイプ変更を試してみた(Amazon Linux編) #reinvent | DevelopersIO
- 最新世代のインスタンスタイプへの移行 - Amazon Elastic Compute Cloud
検証環境
RHEL 6系の最新公式AMIを利用します。
RHEL-6.10_HVM_GA-20180810-x86_64-0-Hourly2-GP2 (ami-06e361057b216c8de)
作業の流れ
インスタンスを Nitro システムに移行する場合、以下の流れで作業します。
- nitro_checks_script.sh を実行してシステム要件を満たしているかチェック
- NVMe ドライバーをインストール
- ENA ドライバーをインストール && インスタンスの
enaSupport
属性を有効 - インスタンスタイプを変更
Nitro システム要件のチェック
Nitro システムを利用する上では
- NVMe モジュール
- Elastic Network Adapter(ENA) モジュール
がインストールされている必要があります。
AWS が提供するスクリプト nitro_checks_script.sh を実行することで、要件を満たしているか簡単にチェックできます。
nitro_checks_script.sh の実行方法
このスクリプトは GitHub の次のレポジトリで提供されています。
aws-support-tools/EC2/NitroInstanceChecks at master · awslabs/aws-support-tools · GitHub
Nitro に変換したいインスタンス内にダウンロードし、ルート権限で実行するだけです。
$ curl -L -o nitro_checks_script.sh https://raw.githubusercontent.com/awslabs/aws-support-tools/master/EC2/NitroInstanceChecks/nitro_check_script.sh $ chmod +x nitro_checks_script.sh $ sudo ./nitro_checks_script.sh ------------------------------------------------ OK NVMe Module is installed and available on your instance cat: /etc/os-release: No such file or directory ERROR ENA Module is not available on your instance. - Please install ENA module before changing your instance type to M5/C5. Look at the following link for further guidance: > https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/enhanced-networking-ena.html#enhanced-networking-ena-linux OK fstab file looks fine and does not contain any device names. ------------------------------------------------ $
NVMe モジュールはインストールされているが、ENA モジュールはインストールされていないことがわかりました。
Red Hat 6 に ENA モジュールをインストール
RHEL 6.10 に ENA をインストールします。
Linux 向け ENA ドライバーは GitHub の次のレポジトリで提供されています。 今回は最新バージョンの 1.6.0 をインストールします。
https://github.com/amzn/amzn-drivers
リリース済みバージョン一覧は次の URL から確認できます。
https://github.com/amzn/amzn-drivers/releases
インストールに必要なパッケージをインストール
$ sudo yum update -y $ sudo yum install -y gcc kernel-devel $ sudo reboot
カーネルアップデート後も $ uname -r
が最新のカーネルバージョンを指すように、リブートしています。
ソースコードの取得
GitHub から ENA ドライバーのソースコードを取得します。
$ VERSION=1.6.0 $ curl -L -o ena_linux_${VERSION}.tar.gz https://github.com/amzn/amzn-drivers/archive/ena_linux_${VERSION}.tar.gz $ tar zxfv ena_linux_${VERSION}.tar.gz $ cd amzn-drivers-ena_linux_${VERSION}
バージョンは適宜読み替えてください。
ENA モジュールのコンパイル
$ cd kernel/linux/ena/ $ make make -C /lib/modules/2.6.32-754.6.3.el6.x86_64/build M=/home/ec2-user/amzn-drivers-ena_linux_1.6.0/kernel/linux/ena modules make[1]: Entering directory `/usr/src/kernels/2.6.32-754.6.3.el6.x86_64' CC [M] /home/ec2-user/amzn-drivers-ena_linux_1.6.0/kernel/linux/ena/ena_netdev.o CC [M] /home/ec2-user/amzn-drivers-ena_linux_1.6.0/kernel/linux/ena/ena_ethtool.o CC [M] /home/ec2-user/amzn-drivers-ena_linux_1.6.0/kernel/linux/ena/../common/ena_com//ena_com.o /home/ec2-user/amzn-drivers-ena_linux_1.6.0/kernel/linux/ena/../common/ena_com//ena_com.c: In function ‘ena_com_reg_bar_read32’: /home/ec2-user/amzn-drivers-ena_linux_1.6.0/kernel/linux/ena/../common/ena_com//ena_com.c:635: warning: passing argument 2 of ‘__read_once_size’ discards qualifiers from pointer target type include/linux/compiler.h:173: note: expected ‘void *’ but argument is of type ‘volatile short unsigned int *’ CC [M] /home/ec2-user/amzn-drivers-ena_linux_1.6.0/kernel/linux/ena/../common/ena_com//ena_eth_com.o CC [M] /home/ec2-user/amzn-drivers-ena_linux_1.6.0/kernel/linux/ena/ena_sysfs.o LD [M] /home/ec2-user/amzn-drivers-ena_linux_1.6.0/kernel/linux/ena/ena.o Building modules, stage 2. MODPOST 1 modules CC /home/ec2-user/amzn-drivers-ena_linux_1.6.0/kernel/linux/ena/ena.mod.o LD [M] /home/ec2-user/amzn-drivers-ena_linux_1.6.0/kernel/linux/ena/ena.ko.unsigned NO SIGN [M] /home/ec2-user/amzn-drivers-ena_linux_1.6.0/kernel/linux/ena/ena.ko make[1]: Leaving directory `/usr/src/kernels/2.6.32-754.6.3.el6.x86_64'
カレントディレクトリに ena.ko
が作成されます。
これをインストールします。
$ sudo cp -v ena.ko /lib/modules/$(uname -r)/ `ena.ko' -> `/lib/modules/2.6.32-754.6.3.el6.x86_64/ena.ko' $ sudo depmod # カーネルモジュールの依存関係情報を更新 $ modinfo ena ilename: /lib/modules/2.6.32-754.6.3.el6.x86_64/ena.ko version: 1.6.0g license: GPL description: Elastic Network Adapter (ENA) author: Amazon.com, Inc. or its affiliates retpoline: Y srcversion: E69DD4FD80D67736CAFC212 alias: pci:v00001D0Fd0000EC21sv*sd*bc*sc*i* alias: pci:v00001D0Fd0000EC20sv*sd*bc*sc*i* alias: pci:v00001D0Fd00001EC2sv*sd*bc*sc*i* alias: pci:v00001D0Fd00000EC2sv*sd*bc*sc*i* depends: vermagic: 2.6.32-754.6.3.el6.x86_64 SMP mod_unload modversions parm: debug:Debug level (0=none,...,16=all) (int) parm: rx_queue_size:Rx queue size. The size should be a power of 2. Max value is 8K
ブート時に新規モジュール ena を読み込むように、dracut
コマンドを実行して initramfs を更新します。
$ sudo dracut -f -v --add-drivers ena
nitro_checks_script.sh を再実行
Nitro のシステム要件をチェックする nitro_checks_script.sh
を再実行します。
$ sudo ./nitro_checks_script.sh ------------------------------------------------ OK NVMe Module is installed and available on your instance cat: /etc/os-release: No such file or directory OK ENA Module with version 1.6.0g is installed and available on your instance OK fstab file looks fine and does not contain any device names. ------------------------------------------------
すべて OK となっています。
以上で EC2 インスタンス内の作業は完了です。
EC2 インスタンスに対する操作
インスタンスに拡張ネットワーキング用の enaSupport
属性を有効にし、Nitro系インスタンスに変更します。
enaSupport 属性を有効化
変更前の enaSupport
属性は false
となっています。
$ IID=i-1234 # インスタンスID $ aws ec2 describe-instances \ --instance-ids $IID \ --query 'Reservations[].Instances[].EnaSupport' [ false ]
インスタンスを stopped
状態にして、この属性を有効にします。
$ aws ec2 modify-instance-attribute \ --instance-id $IID \ --ena-support $ aws ec2 describe-instances \ --instance-ids $IID \ --query 'Reservations[].Instances[].EnaSupport' [ true ]
インスタンスタイプを変更
Nitro系の t3.micro に変更します。
$ INSTANCE_TYPE=t3.micro $ aws ec2 modify-instance-attribute \ --attribute instanceType \ --instance-id $IID \ --value $INSTANCE_TYPE
インスタンスタイプは管理コンソールからも変更可能です
変更可能なインスタンス一覧に、Nitro 系の T3 ファミリーを確認できます。
ネットワークインターフェイスドライバーの違い
EC2 インスタンスを起動後、NIC ドライバーを確認すると、 vif
から ena
に変わっていることがわかります。
ena モジュールロード前
$ ethtool -i eth0 driver: vif version: firmware-version: bus-info: vif-0 supports-statistics: no supports-test: no supports-eeprom-access: no supports-register-dump: no supports-priv-flags: no
ena モジュールロード後
$ ethtool -i eth0 driver: ena version: 1.6.0g firmware-version: bus-info: 0000:00:05.0 supports-statistics: yes supports-test: no supports-eeprom-access: no supports-register-dump: no supports-priv-flags: no
Red Hat の ドライバー対応状況について
NVMe 対応状況について
6 系の場合、2013年11月にリリースされた 6.5 以降で対応しています。
Red Hat Launches Latest Version of Red Hat Enterprise Linux 6
ENA 対応状況について
6系の場合、最新(6.10)のAMIでも未対応です。
7系の場合、7.4以降で対応しています。
まとめ
インスタンスを Nitro システムに移行する場合、以下の流れで作業します。
- nitro_checks_script.sh を実行してシステム要件を満たしているかチェック
- NVMe ドライバーをインストール
- ENA ドライバーをインストール && インスタンスの
enaSupport
属性を有効 - インスタンスタイプを変更
RHEL 6 系の最新公式 AMI では ENA が有効になっていなかったため、ENA カーネルドライバーのインストールと ENA 属性の有効化を行いました。
DKMS を使ってカーネルモジュールを管理したい場合、次の gist を参考にしてください。
https://gist.github.com/kwilczynski/36914ee29e31f7dbd27b4f6742dc96b3
それでは。
参考
- Linux Nitro ベースの EC2 インスタンスの起動エラーを解決する
- Amazon EC2 インスタンス用の Red Hat 6/7 に ENA ドライバーをインストールして有効にする
- Enabling enhanced networking with the Elastic Network Adapter (ENA) on Linux instances - Amazon Elastic Compute Cloud
- aws-support-tools/EC2/NitroInstanceChecks at master · awslabs/aws-support-tools · GitHub
- https://github.com/amzn/amzn-drivers/tree/master/kernel/linux/ena