Amazon Elastic Compute Cloud (Amazon EC2) Linux インスタンスへの到達またはアクセスが失敗します。なお、EC2 シリアルコンソールへのアクセスは、OS レベルで設定しませんでした。
簡単な説明
この記事は、次の Linux オペレーティングシステム (OS) に適用されます。
- Red Hat 7 - 9
- Amazon Linux 2, 2023
- CentOS 7、8
- Rocky Linux 8、9
- Ubuntu 16 - 24
- Debian 9 - 12
前提条件 シリアルコンソールを使用するには、すべての前提条件が満たされている必要があります。OS ユーザーパスワードの設定ステップは、インスタンスのルートボリュームにアクセスした後に完了する必要があることに注意してください。
解決策
シリアルコンソールへのアクセスを設定するには、次の手順を実行する必要があります。
注: EC2 シリアルコンソールが正常に動作しており、OS ユーザーのパスワードを設定するだけで済む場合は、その解決ステップのみを実行してください。EC2 シリアルコンソールが機能することを確認する方法については、「EC2 シリアルコンソールに接続する」を参照してください。
インスタンスのルートボリュームにアクセスします。
インスタンスのルートボリュームにアクセスするには、一時インスタンスを起動します。次に、Amazon Elastic Block Store (Amazon EBS) ボリュームをレスキューインスタンスに再マウントします。次に、レスキューインスタンスから、シリアルコンソールの GRUB 設定を確認し、変更します。root ユーザーまたは OS ユーザーのパスワードを設定し、SSH デーモンに root アクセスを許可することもできます。
重要: 一時インスタンスを設定するときは、次の点に注意してください。
ルートディスクをレスキューインスタンスにアタッチする
次の手順を実行します。
-
新しいキーペアを作成するか、既存のキーペアを使用します。
-
元のインスタンスとそのルートボリュームに関する情報を取得します。
-
元のインスタンスを停止します。
-
同じアベイラビリティーゾーン内の同じ Linux OS バージョンの Amazon マシンイメージ (AMI) を使用して一時インスタンスを起動します。
-
元のインスタンスからルートボリュームをデタッチし、セカンダリボリュームとして一時インスタンスにアタッチします。ボリュームのデバイス名を書き留めておきます。
-
SSH キーペアを使用して一時インスタンスに接続します。
-
root ユーザーに切り替えるために、次のコマンドを実行します。
[ec2-user ~]$ sudo su
-
ブロックデバイス名とパーティションを識別するために、一時インスタンスで次のコマンドを実行します。
[root ~]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 8G 0 disk
└─xvda1 202:1 0 8G 0 part /
xvdf 202:80 0 101G 0 disk
└─xvdf1 202:81 0 101G 0 part
上記の例では、ブロックフロントドライバーを含む XEN インスタンスを使用しています。ボリュームデバイス名 /dev/xvda と /dev/xvdf はパーティション化されたボリュームであり、/dev/xvdg はパーティションボリュームではありません。ボリュームがパーティション化されている場合は、次のコマンドを実行し、raw デバイス (/dev/xvdf) ではなく、パーティション (/dev/xvdf1) をマウントします。
[root ~]$ mount -o nouuid /dev/xvdf1 /mnt
Nitro ベースのインスタンスを使用する場合、ボリュームデバイス名は /dev/nvme[0-26]n1 のような形式となります。インスタンスが NVMe を搭載した Nitro に構築されている場合は、/mnt ディレクトリにパーティションをマウントします。前に特定したデバイス名を使用して、次のコマンドを実行します。
[root ~]$ mount -o nouuid /dev/nvme1n1p1 /mnt
詳細については、「Amazon EC2 インスタンス上のボリュームのデバイス名」を参照してください。
-
/mnt ディレクトリに chroot 環境を作成するために、次のコマンドを実行します。
[root ~]$ for i in dev proc sys run; do mount -o bind /$i /mnt/$i; done; chroot /mnt
上記の例では、/dev、/proc、/sys、/run ディレクトリが元のルートファイルシステムからバインドマウントされています。この設定により、chroot 環境内で実行されるプロセスがこれらのシステムディレクトリにアクセスできるようになります。
root ユーザーまたはその他の OS ユーザーのパスワードを設定します。
chroot で** passwd** コマンドを使用して OS ユーザーのパスワードを設定し、SSH 設定で root アクセスを許可します。
次の例では、ユーザーは root です。root パスワードは次のコマンドで設定できます。
[root ~]$ passwd root
Linux で SSH デーモン (sshd) に root アクセスを許可するように設定するには、#PermitRootLogin yes を PermitRootLogin yes に変更し、次のコードを実行します。
[root ~]$ sed -i 's/#\?PermitRootLogin .*/PermitRootLogin yes/' /etc/ssh/sshd_config
カーネルパラメータをブートローダー GRUB に渡す
すべてのコンソール出力をシリアルポートに送信するには、次のカーネルパラメータ console=tty0 console=ttyS0,115200 をブートローダー GRUB に渡す必要があります。
注: tty0 と ttyS0 に含まれているのはゼロであり、アルファベット文字 O は含まれていません。
次のリストは、この例で選択したオプションを示しています。
- console= は、カーネルメッセージ用の優先コンソールデバイスを指定するカーネルパラメータです。
- tty0 は、システム上の最初の仮想コンソール (テキストモード) を指します。
- ttyS0 は、最初のシリアルポートを指します。
- 115200 は、シリアルポートのボーレート (ビット/秒) です。これはシリアル通信によく使われるボーレートです。
- n8 はシリアルポートの文字サイズとパリティ設定を指定しています。n はパリティなしを表します。8 は、文字サイズが 8 ビットであることを示しています。
- tty0 パラメータは、カーネルを起動してコンソールメッセージを最初の仮想コンソール (tty0) に送信します。これは通常、Linux システムでのプライマリテキストモードコンソールです。
- ttyS0 パラメータは、コンソールメッセージを最初のシリアルポート (ttyS0) に送信するようにカーネルを設定します。メッセージは、パリティなし、115200 のボーレートで、1 文字あたり 8 ビットで送信されます。
シリアルコンソールの GRUB2 設定を確認して更新します。
カーネルパラメータ console=tty0 と console=ttyS0,115200 を /etc/default/grub ファイルの GRUB_CMDLINE_LINUX_DEFAULT 行に追加する
次の手順を実行します。
-
chroot のテキストエディタで /etc/default/grub ファイルを開きます。例として、nano または vi エディタを使用するには、次のコマンドのいずれかを実行します。
[root ~]$ nano /etc/default/grub
[root ~]$ vi /etc/default/grub
-
GRUB_CMDLINE_LINUX_DEFAULT で始まる行を探します。たとえば、次のような行です。
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
-
カーネルパラメータ console=tty0 と console=ttyS0,115200 をこの行に追加します。スペースを入力して、これらのカーネルパラメータと現在のパラメータを区切ります。更新された行は次のようになります。
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash console=tty0 console=ttyS0,115200"
-
変更を保存し、テキストエディタを終了します。
-
次のコマンドを実行して GRUB 設定を更新します。
Red Hat、CentOS、Amazon Linux、Rocky Linux の場合
BIOS ベースのマシンの場合:
[root ~]$ grub2-mkconfig -o /boot/grub2/grub.cfg
UEFI ベースのマシンの場合:
[root ~]$ grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
Ubuntu と Debianの場合
次のコマンドでは、新しいカーネルパラメータを使用して GRUB 構成ファイルを再生成します。
[root ~]$ update-grub
-
次のコマンドを実行して chroot を終了し、/dev、/run、/proc、/sys をアンマウントします。
[root ~]$ exit; umount -fl /mnt/{dev,proc,run,sys,}
-
Amazon EC2 コンソールで [インスタンス] を選択し、レスキューインスタンスを選択します。
-
[インスタンスの状態]、[インスタンスの停止] を順に選択してから、[停止する] を選択します。
-
ルートボリューム id-##### (障害が発生したインスタンスのボリューム) をレスキューインスタンスからデタッチします。
-
ルートボリュームを、障害が発生したインスタンスにルートボリューム (/dev/sda1) としてアタッチしてから、インスタンスを起動します。
-
ブラウザベースのクライアントを使用して EC2 インスタンスのシリアルコンソールに接続します。
-
root ユーザーと、先ほど設定したパスワードを使用してログインします。