カスタムして作った CentOS7.4 をAWSの M5, C5 で動かすときに落ちた沼について書いておく
今回もそこそこの不幸があった。普通にセットアップする分には簡単な案件だけど、ちょっと面倒なオプションがついて、カスタムしてダレカの作ったAMIをいい感じに新しいタイプのインスタンスで動かしたいというのがきた。やれやれ。
前知識
新しい世代のEC2インスタンスタイプ M5/C5 が東京リージョンで利用可能になりました
NITRO世代(C5、M5)へのEC2インスタンスタイプ変更を試してみた(Amazon Linux編)
- https://dev.classmethod.jp/cloud/aws/change-type-to-m5-nitro-generation/
- 元々 M5 タイプに対応していないAMIをアップグレードで対応する場合のことがちょっとだけ書いてある。
- 記事を読むと、ENAを有効にし、NVMeドライバが使えるようにすれば起動するように見える。
- AmazonLinuxの例だが、CentOSでも同じようにできるはず。
EC2で稼働中のCentOS 7を新しいインスタンス M5/C5 で起動させる準備をする
- http://info.m-up.com/news/?category=staffdiary&id=2000001333
- もうちょっと泥臭い感じの内容
- AWSのドキュメント通りにコマンドを流してだいたいうまく起動できた、と書いてある
- 後半kernelを4系にあげてあるが、単に動かしたいだけなら3系でも問題はない
- 新しいkernelを使うメリットは例えばnvmeドライバの改善、まあ気にしなくてもいいかもしれない
VPC 内の Linux インスタンスにおける Elastic Network Adapter (ENA) を使用した拡張ネットワーキングの有効化
- https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/enhanced-networking-ena.html#enhanced-networking-ena-linux
AWSの公式ドキュメント
- 拡張ネットワーク (ENA) が有効になっているか調べる手順
- 同じように modinfo でnvmeドライバも調べておく。CentOS7.4以降のkernelは標準でnvmeドライバをサポートしている
amzn-drivers
から dkms を使ってenaモジュールをビルドする設定を入れておく- この手順で少し足りない箇所があり沼に落ちた。具体的には
dracut
での追加ドライバの指定。詳細は後述
- この手順で少し足りない箇所があり沼に落ちた。具体的には
- 予測可能なネットワークインターフェイス名を無効にする (Disable predictable network interface names)
/etc/udev/rules.d/70-persistent-net.rules
を消す
起動しないM5インスタンス
ena supportのオプションはインスタンスで有効にした状態でスナップショットを取るとAMIにも引き継がれ、AMIから起動したEC2インスタンスもENAが有効になります。
OSの起動前に問題が発生した場合、システムログの出力がないため調査が難しいのですが、インスタンスを停止するとシステムログの出力が得られることがあるので、起動してしばらくしてもSSHができない場合は、インスタンスを停止してシステムログを確認する。
今回の場合、 dracut-initqueue timeout
で停止しており、 switch_root でEBSに切り替えようとしているところでパーティションが見つけられずエラーになっていた。
ログを見た感じ、疑われたポイントは、fstab、grub、initramfs、nvmeドライバ。
EC2 HVMの仕組み
仮想化方式(HVM と PV)についてまとめ
HVMインスタンスの仕組みは、物理マシンに近く、ルートデバイスにあるブートローダーからkernelを起動する。裏側はXenだけど。
なのでシステムログをよく見ると
- ブートローダ (grub) から grub2 を起動
- /boot/grub2/grub.conf を読んで、
kernel vmlinuz
、initrd initramfs.img
みたいなことが行われて - initramfsから起動した小さなOSがルートデバイスの
/
へ switch_root - / からOSを起動
という流れになっているのがわかる。
dracut-initqueue timeout
は initramfs のところで起きているのでその辺りを調べていく。
dracut
RHEL系のディストリビューションで使われているinitramfs生成ツール。
結論を書くと、dracutの設定にnvmeドライバの追記をしていなかったため、/
を見つけられず起動に失敗していただけだった。
dracutにドライバを含めるには、 /etc/dracut.conf.d
以下にファイルを置く。例えば /etc/dracut.conf.d/nvme.conf
として以下のファイルを作成する。
add_drivers+=" nvme "
その後、 dracut
を実行する。
dracut -v -f
これで initramfs が再生成され、中に nvme ドライバが含まれるようになる。確認したい場合は、cpioとかを使って生成されたinitramfsを展開すれば確認できる。
終わりに
疲れた。勘弁してくれ。
まあ、この辺は以前にinitramfsとかブートローダとかnvmeドライバとかその辺を調べてあったから比較的早く解決できた気はする。
どっちかというとPXEBOOT周りを触ってる際に覚えたことだけど、事前知識がなかったらこの問題は相当難しい問題だったと思う。難of難。
AWS触るときにもこの辺りの知識が必要になるってのは意外だけどそんなもんかな。いや、普通にやってたらハマらないしこの辺触らないんだよな...