EC2のENAドライバーのみをバージョンアップさせる（SUSE編）

# 概要
- SUSE OSでENAドライバーのみをバージョンアップさせる

# 背景
- SUSEを使っているEC2インスタンスタイプを変更したい(第5世代→第6世代)
- 第6世代に上げるための前提要件を確認していたところENAドライバーのバージョンが古い。。<br>参考：[ネットワークのパフォーマンスを最大限に引き出すには、EC2 インスタンスを第 6 世代インスタンスに移行する前、何をする必要がありますか?](https://repost.aws/ja/knowledge-center/migrate-to-gen6-ec2-instance)
- バージョンアップについては、公式ナレッジに記載されているが実際にやってみるとうまくいかず・・。<br>[Linux での拡張ネットワーキングの有効化](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/enhanced-networking-ena.html#enhanced-networking-ena-linux)
- AmazonLinuxやRHELなどは同対応の記事などはあったが、SUSEに関してはナレッジが少なかったため記事にしてみました。

# 対象読者
- SUSE でENAドライバーをバージョンアップさせたい。
- 公式ナレッジを見たが、よく分からない。うまく出来ない。

上記のような方への参考になれば幸いです。

# 検証環境

|インスタンスタイプ|c5.large|
|-------|------|
|OS|SUSE Linux Enterprise Server 15 SP2|
|ENAドライバーVer|Ver2.1|
|Kernel Ver.|5.3.18-22-default|
|その他|ビルドに必要な以下パッケージは導入済み <br>※必要パッケージは環境にもよるので注意。検証したOSの場合は以下が不足していたため、事前にインストール<br>git,gcc,make,kernel-devel|

# 手順
１． [Git Hub](https://github.com/amzn/amzn-drivers)からソースファイルをOSにダウンロード<br>※Gitコマンドが使えない場合は、一旦ローカルにダウンロードし、TeraTermやWinSCPなどでOSにアップロードでもOK.
```
# sudo su -  
# mkdir /home/work  ←ダウンロードおよびビルド用にWorkディレクトリを作成。任意で実施
# cd /home/work
# git clone https://github.com/amzn/amzn-drivers
```
２. 事前確認として、現状のENAドライバーやOSのKernel Levelなどを確認<br>→現在のENAドライバーのVer.は2.1であることを確認<br>
```
# modinfo ena
filename:       /lib/modules/5.3.18-22-default/kernel/drivers/net/ethernet/amazon/ena/ena.ko
version:        2.1.0K
license:        GPL
description:    Elastic Network Adapter (ENA)
author:         Amazon.com, Inc. or its affiliates
suserelease:    SLE15-SP2
srcversion:     FF9FA99D76AC3362C5BD705
(中略)
C4:42:E7:20:B3:24:EE:32:E7:51:45:A0:89:7C:AB:B9
parm:           debug:Debug level (0=none,...,16=all) (int)

# ethtool -i eth0
driver: ena
version: 2.1.0K
firmware-version: 
expansion-rom-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

# uname -r
5.3.18-22-default
```

３. システム環境構成ファイルを修正<br>→デフォルトだとサポート対象外のモジュールは無効になっているため、有効にする。<br>補足：ENAドライバー自体はサポートされている（でなければAWS上では動かないので・・）はずですが、同設定を入れないと失敗しました。
```
# cp -p /etc/modprobe.d/10-unsupported-modules.conf /home/work/10-unsupported-modules.confBK ←事前バックアップ。任意で実施
# vi /etc/modprobe.d/10-unsupported-modules.conf
(中略)
allow_unsupported_modules 0 
↓ 「0]を1に変更する。
allow_unsupported_modules 1
```
４. 手順1でダウンロードした新しいENAドライバーのソースファイルをビルド<br>→成功すると、[ena.ko]というKernelモジュールが生成されます。
```
# cd /home/work
# cd amzn-drivers/kernel/linux/ena ←ENAドライバーのソースファイルは左記階層にある。
# make
make -C /lib/modules/4.12.14-150100.197.117-default/build M=/usr/src/amzn-drivers/kernel/linux/ena modules
(中略)
LD [M]  /usr/src/amzn-drivers/kernel/linux/ena/ena.ko
make[1]: Leaving directory '/usr/src/linux-4.12.14-150100.197.117-obj/x86_64/default'
# ll ena.ko
-rw-r--r-- 1 root root 6482016 Nov 12 05:12 ena.ko
```
５. 新しいENAドライバーのKernelモジュールのロード<br>→既存のENAドライバーのKernelモジュールへ上書きコピーをした後にKernelモジュールの再ロードを実施<br>補足：再ロードは本来はdepmodで出来るのですが、私の検証環境だと上手く反映されなかったため、[rmmod ena && insmod ena.ko]を実施しています。
```
# ll /lib/modules/5.3.18-22-default/kernel/drivers/net/ethernett/amazon/ena/ena.ko
-rw-r--r-- 1 root root 207968 Jun  6  2020 /lib/modules/5.3.18-22-default/kernel/drivers/net/ethernet/amazon/ena/ena.ko
# cp -p /lib/modules/5.3.18-22-default/kernel/drivers/net/etherrnet/amazon/ena/ena.ko /home/work/ena.koBK ※バックアップ。任意で実施
# pwd
/home/work/amzn-drivers/kernel/linux/ena
# cp -p ena.ko /lib/modules/5.3.18-22-default/kernel/drivers/neet/ethernet/amazon/ena/ena.ko
# ll /lib/modules/5.3.18-22-default/kernel/drivers/net/ethernett/amazon/ena/ena.ko
-rw-r--r-- 1 root root 6482016 Nov 12 05:12 /lib/modules/5.3.18-22-default/kernel/drivers/net/ethernet/amazon/ena/ena.ko
# rmmod ena && insmod ena.ko
# depmod
# dracut -f -v
dracut: Executing: /usr/bin/dracut -f -v
(中略)
dracut: -rw-r--r-- 1 root root 6482016 Nov 12 05:12 /lib/modules/5.3.18-22-default/kernel/drivers/net/ethernet/amazon/ena/ena.ko
(中略)
dracut: ========================================================================
dracut: *** Creating initramfs image file '/boot/initrd-5.3.18-22-default' done ***
```
６. ブートローダの更新<br>→"net.ifnames=0"を追加し、デバイス名を予測可能なものに変更させる。※既に記述されている場合は不要です。
```
# cp -p /etc/default/grub /etc/default/grubBK ←事前バックアップ。任意で実施
# cat /etc/default/grub | grep GRUB_CMDLINE_LINUX=
GRUB_CMDLINE_LINUX=""
# sed -i '/^GRUB\_CMDLINE\_LINUX/s/\"$/\ net\.ifnames\=0\"/' /eetc/default/grub
# cat /etc/default/grub | grep GRUB_CMDLINE_LINUX=
GRUB_CMDLINE_LINUX=" net.ifnames=0"
# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.3.18-22-default
Found initrd image: /boot/initrd-5.3.18-22-default
done
```
７. 手順2と同様にENAドライバーのバージョンなどを確認してみる<br>→ENAドライバーのバージョンが[2.8.0]に上がっていることが確認できます。※OS自体のKernelのバージョンは上がらないのでそのままです。
```
# modinfo ena
filename:       /lib/modules/5.3.18-22-default/kernel/drivers/net/ethernet/amazon/ena/ena.ko
version:        2.8.0g
license:        GPL
description:    Elastic Network Adapter (ENA)
author:         Amazon.com, Inc. or its affiliates
suserelease:    SLE15-SP2
srcversion:     C690406A7AFCFAE711E45D6
（中略）
parm:           lpc_size:Each local page cache (lpc) holds N * 1024 pages. This parameter sets N which is rounded up to a multiplier of 2. If zero, the page cache is disabled. Max: 32

# ethtool -i eth0
driver: ena
version: 2.8.0g
firmware-version: 
expansion-rom-version: 
bus-info: 0000:00:05.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: no
supports-priv-flags: yes
 (uint)

 # uname -r
5.3.18-22-default
```
８. OS再起動を実施。起動後にログイン出来るか、ENAドライバーのバージョンが上がっているかを再度確認<br>→OS再起動後も正しく更新したENAドライバーのバージョンが適用されているかの確認のために実施
９. インスタンスタイプを変更<br>→第6世代インスタンスに変更できれば、成功です。

# 諸注意
- 事前にAMIなどバックアップを取得する事を推奨いたします。<br>KenrelモジュールやGrubファイルの修正とセンシティブな内容なので、必ず事前にバックアップを取得したほうが良いです。<br>補足：ENAドライバーの再ロードに失敗すると、sshなど通信が出来なくなります。（オンプレでいうとところのBIOSの状態で止まっているイメージです）
- 今回はENAドライバーのバージョンだけが第6世代インスタンスの要件を満たしていないというケースでしたが、それ以外のドライバーやKernelのバージョンも要件にあるため、要注意。