はじめに

こんにちは。たなべです。年度末の忙しい時期かと思いますがみなさんいかがお過ごしでしょうか。自分は毎年のことですが好き勝手に飛び回る花粉と毎日格闘しております。さて今回のブログですがEC2インスタンスで利用可能なシリアルコンソール接続について書きたいと思います。少し前にPVモードのAMIをHVMモードに移行する際のトラブルシューティングといった話が話題にあがり、そういえば EC2にもシリアルコンソールが利用できるんだよなというのを思い出しました。EC2インスタンスへのシリアルコンソール接続については機能としてあることは知っていたんですが実際に使ったことが無く、せっかくなら試してみたいと思ったのがきっかけです。自分はオンプレのシステムを長く扱ってきたのでシリアルコンソールとか聞くとちょっとワクワクします。さらに Amazon Linux 2023 をベースに シングルユーザーモード緊急モード といったGRUBからの起動モードについても試してみようと思います。利用シーンはあまり無いかもしれませんが困った人のお役に立てれば幸いです。では少々お付き合いください。

なぜEC2へのシリアルコンソール接続を試してみようと思ったのか

  • PVからHVMなど仮想化方式を変更したりカーネルアップデートなどを実施した際のトラブルシューティングでシリアルコンソール接続を使用する可能性もあるかなと考えたので試しておきたいと思った。
  • 主にオンプレ時代に活用していたシリアルコンソール接続をAWSの環境で使用してみたかった。
  • GRUB2の設定や環境などを把握しておきたかった。
  • ちょっと昔の作業を懐かしく思ったので。

このブログで書く事

  • AWSのEC2インスタンスでシリアルコンソール接続するために必要な設定
  • GRUB2の起動メニューを表示させるために必要な設定
  • シングルユーザーモード緊急モードでの起動方法
  • Amazon Linux 2023 を対象とした話

このブログでは書いていない事

  • GRUB2の細かい設定
  • ブートローダーやブートシーケンスに関する詳細
  • Amazon Linux や Amazon Linux2 に関する事

1. シリアルコンソール接続について

シリアルコンソール接続とは

シリアルコンソール接続とはキーボードやマウス、モニターを直接サーバなどの接続するのでは無く、シリアルポートを使用して接続する方式。シリアルコンソール接続を使用するとノートPCなどを直接ネットワーク機器やサーバなどに接続して操作することができるようになります。

AWSのEC2でもこのシリアルコンソール接続を行うことができます。もちろん実際はノートPCなどを直接シリアルポートに接続できるわけでは無く、マネージメントコンソールなどに用意された管理画面を通じ、EC2インスタンス側のシリアルポートに接続する形となります。

シリアルコンソール接続のいいところ

通常EC2インスタンスに接続する場合は、自分の端末からsshで接続するか、Systems Manager Session Manager、もしくは EC2 Instance Connect などを使用してログインすることが多いと思います。これら接続方法は前提としてOSが正常に起動し、パブリックIPアドレスやVPC内のプライベートIPアドレスなどのネットワークに接続されている必要があります。そのため、OSが起動処理の途中で何らかの理由で止まってしまった場合やネットワーク上に問題が発生していた場合は使用することができません。

AWS Systems Manager Session Manager – AWS Systems Manager
EC2 Instance Connect を使用して Linux インスタンスに接続する – Amazon Elastic Compute Cloud

このように正常に起動できていない状態のOSやネットワークの接続性が確保されていない状態のOSにログインしたいようなケースではシリアルコンソール接続が活用できる場合があります。シリアルコンソール接続はシリアルポートを使用して入出力を行うためOSの起動処理から確認することができます。また対象のOSがVPC内のネットワークに繋がっていなくても利用可能なので、例えばネットワークインターフェースの設定を変更するような作業を行う際はシリアルコンソール接続を使用してログインできる状態にしておくと少し安心できます。

(補足)
実際はAWSのシリアルコンソール用APIエンドポイントを経由して接続されます。また後述するOSユーザのパスワード認証では無く、ssh鍵ペアを使用したシリアルコンソール接続も可能ですが今回は割愛しています。OSユーザのrootパスワードを設定することは管理の手間やセキュリティ的なリスクもあったりするので、シリアルコンソール接続を商用環境などの運用に採用する場合は認証方法など十分注意してください。
EC2 シリアルコンソールに接続する / 独自のキーと SSH クライアントを使用して接続する

AWSをはじめとするクラウドサービスを使用したシステムではハードウェアに近い設定の変更などを行う機会はあまり無いかもしれませんが、何か問題が発生した際にシリアルコンソール接続みたいな接続方法も使えるんだというのを知っていれば、障害の調査や問題解決のアプローチが変わってくるかもしれないです。なのでssh接続や Systems Manager Session Manager、EC2 Instance Connect といった通常時に使用する接続方法以外にもシリアルコンソール接続とった選択肢があるということだけでも頭の片隅に残してもらえるとよいのかなと思います。

シリアルコンソール接続を行うために必要なこと

EC2のシリアルコンソール接続をおこなうためにはいくつか必要な条件や設定があります。

  1. Nitoroシステム上で稼働するインスタンスタイプを選択する
  2. EC2インスタンスへのシリアルコンソール接続を許可(AWSアカウント単位)
  3. シリアルコンソールでログインする際の認証方法を決める。今回はOS内のrootユーザのパスワードを設定してログインしています。

前提条件 – Amazon Elastic Compute Cloud

まず大前提としてインスタンスタイプはNitoroシステム上で稼働するインスタンスタイプを選択する必要があります。Nitroシステム以外で稼働するインスタンスタイプはシリアルコンソール接続を利用できないので注意してください。
Nitro System 上に構築されたインスタンス

またAWSアカウントのデフォルトの設定ではEC2インスタンスへのシリアルコンソール接続は許可されていないません。そのため、最初にEC2インスタンスへのシリアルコンソール接続を許可する設定を行う必要があります。こちらはAWSアカウトレベルでの設定になるので、もし AWS Organizations でSCP(サービスコントロールポリシー)による制限を導入している環境では注意してください。

EC2 シリアルコンソールへのアクセスを設定する – Amazon Elastic Compute Cloud

1.EC2シリアルコンソールのタブを開いた際の注意書きにある Manage access をクリックする

2.許可のチェックボックスにチェックを入れて更新する。

2. GRUB2の起動メニューを表示させるための設定

前提条件にも記載がありましたが、シリアルコンソール接続を行う場合、GRUBのパラメータとしてシリアルコンソール接続に関する設定を行う必要があります。Amazon Linux 2023では /etc/default/grub ファイルに最低限必要なパラメータは登録されていますが、今回はGRUB2の起動メニューをわかりやすく表示させたかったので GRUB_TIMEOUT を10秒とやや長めに設定しています。ここで指定するGRUB_TIMEOUTの値は、OSが起動するたびに処理が発動されるのでEC2インスタンスを素早く起動したい場合は短め、もしくは0にした方がよいと思います。またGRUBの設定ファイルを変更した後には必ず grub2-mkconfig を使用して設定ファイルの更新を行ってください。Amazon Linux 2023の場合は更新するファイルは /boot/grub2/grub.cfg です。これ忘れがちです。

/etc/default/grubの中身(例)

GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0,115200n8 nvme_core.io_timeout=4294967295 rd.emergency=poweroff rd.shell=0 selinux=1 security=selinux "
GRUB_TIMEOUT=10
GRUB_DISABLE_RECOVERY="true"
GRUB_ENABLE_BLSCFG="true"
GRUB_X86_USE_32BIT="true"
GRUB_DEFAULT=countdown
GRUB_UPDATE_DEFAULT_KERNEL=true
GRUB_TERMINAL="console serial"
GRUB_SERIAL_COMMAND="serial --speed=115200"

grub2-mkconfigによるgrub.cfgファイルの更新

$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg

grub.cfgの更新についてはこちらの記事を参考にしました。

RHEL 7 または RHEL 8 の実行時に EC2 Linux ユーザーデータをログに記録し、コンソールログに送信する | AWS re:Post

passwdコマンドでrootパスワードを設定しておきます。

$ sudo passwd root

GRUBの設定ファイル更新が済んだら設定を反映させるため、一度OSを再起動します。

シリアルコンソール接続

AWS側の設定とOS側の設定が済んだら実際にシリアルコンソール接続を試してみます。

  1. 接続するEC2インスタンスを選択して接続を押す
  2. シリアルコンソールタブを表示し接続を押す
  3. シリアルコンソール用の画面が表示される(最初は真っ黒)
  4. 真っ黒な画面にフォーカスをあてキーボードが利用できる状態にした上でEnterキーを入力するとログインが面が表示されるのでユーザ名とパスワードを入力する
  5. シェルが利用可能な状態になりログインに成功

無事シリアルコンソール接続でOSにログインすることができました。

EC2 シリアルコンソールに接続する

3. シングルユーザーモードと緊急モード

何か問題が発生してOSが正常に起動しない場合、GRUBメニューからシングルユーザーモード緊急モードで起動しトラブルシューティングを行うことが可能です。シングルユーザーモード緊急モードの違いはざっくりとこんな感じです。

シングルユーザーモード
– カーネルを低めの実行モードで起動する
– ファイルシステムが読み書き可能な状態でマウントされている
– ネットワークは無効の状態

緊急モード
– カーネルを可能な限り低い実行レベルで起動する(シングルユーザーモードよりも低いレベル)
– ファイルシステムが読み取り専用でマウントされている
– ネットワークは無効の状態

GRUB を使用して Linux インスタンスをトラブルシューティングする

シングルユーザーモードで起動する場合

  1. シリアルコンソールが利用可能GRUBメニューが表示される状態でOSを起動
    • Nitroシステム上で稼働するインスタンスタイプを選択
    • シリアルコンソールの使用を許可
    • GRUBの設定でGRUB_TIMEOUTをある程度の秒数に設定
  2. シリアルコンソールに繋いでGRUBメニューが表示されたらESCキーを押してGRUBメニューを表示しているカウントダウンを止める
  3. 起動するOSが選択されている状態で e を押して編集モードにする
  4. linux のパラメータの最後に single を追記し Ctrl+x で起動する
  5. rootのパスワードを入力するとログインができる。

シングルユーザーモードで起動している状態での確認

  • runlevelやsystemdのターゲット
  • ファイルシステムの状態を確認するためにファイルを作成してみる
    • ファイルシステムは読み書き可能な状態でマウントされているため問題なく作成できる

緊急モードで起動する場合

シングルユーザーモードとほとんど同じで linux のパラメータの最後を emergency にして起動するだけです。
1. シリアルコンソールが利用可能GRUBメニューが表示される状態 でOSを起動
– Nitroシステム上で稼働するインスタンスタイプを選択
– シリアルコンソールの使用を許可
– GRUBの設定でGRUB_TIMEOUTをある程度の秒数に設定
2. シリアルコンソールに繋いでGRUBメニューが表示されたらESCキーを押してGRUBメニューを表示しているカウントダウンを止める

3. 起動するOSが選択されている状態で e を押して編集モードにする

4. linux のパラメータの最後に emergency を追記し Ctrl+x で起動する

5. rootのパスワードを入力するとログインができる。

緊急モードで起動している状態での確認

  • runlevelやsystemdのターゲット
  • ファイルシステムの状態を確認するためにファイルを作成してみる
    • ファイルシステムは読み取り専用モードでマウントされているためそのままではファイルを作成することはできない

今回の検証で確認できたこと

  1. Amazon Linux 2023 を対象にしたシリアルコンソール接続
  2. OS起動時にGRUBメニューを表示させ起動するKernelの選択やパラメータの追加、変更ができること
  3. シングルユーザーモード、緊急モードそれぞれの起動方法と起動後のOSの状態がどうなっているか

もうちょっと勉強したいなと思ったこと

  1. SSH鍵ペアを使ったシリアルコンソール接続の認証
    そもそもこの記事を書くまでSSH鍵ペアを使った認証ができることを知らなかった。パスワードを設定するよりも使いやすそう。是非試してみたいです。
  2. レガシーBIOSとUEFIの違い(特にUEFI)
    今回GRUBやシリアルコンソールの設定を調べている中でレガシーBIOSとUEFIという話しがでてきました。レガシーBIOSもそこまで詳しいわけではないけど、現在はUEFIが主流のようなので最低限どういうものでレガシーBIOSとの違いやUEFIで起動する場合のOS側の設定など確認しておきたいと思いました。
  3. GRUB2の設定周り
    だいぶ前に主流はGRUB2になっているようですがあまり追いつけていないです。GRUBの設定を変更するような機会も減ってきてはいますが。どういったファイル構成になっていて、何をするにはどうしたらいいのか、といった基本的な所は確認しておきたいと思いました。

所感

  1. GRUBや起動処理などLinuxの基本的な動作、仕様についてのキャッチアップが必要
    最近はほとんど触る機会が無くなったGRUBやシングルユーザーモードや緊急モードといった少しハードウェアに近い部分を触ってみてやっぱり楽しいなと思いました。クラウドサービスが多くなっている昨今、こういった情報というのはやっぱ少なくなってきているのかなとも思いました。普段高いレイヤーで仕事をする機会が多いのですが、こういった足回りについてはしっかりと勉強した方がいいなと再認識しました。
  2. Amazon Linux 2023について
    Amazon Linux 2023はFedra(Red Hat)をベースにしたディストリビューションだとは思いますが、Amazon Linux2よりも独自実装が多いようなのでOS自体の仕様や設定というのもしっかりと確認する必要があるなと思いました。
    Fedora との関係 – Amazon Linux 2023
    AL2 と Amazon Linux 2023 の比較 – Amazon Linux 2023
  3. とりあえず楽しかった
    シングルユーザーモードや緊急モードの利用シーンはそんなに多くないのかなと思いつつ、昔を思い出しながら検証、確認ができたので楽しかった。

あまり細かい所まで確認や検証はできていないですが何かの参考になればありがたいです。最後までお付き合い頂きありがとうございました。