跳至内容

如何访问无法访问的 Linux 实例的 EC2 串行控制台?

3 分钟阅读
0

我的 Amazon Elastic Compute Cloud (Amazon EC2) Linux 实例无法访问。此外,我没有在操作系统级别配置对 EC2 串行控制台的访问权限。

简短描述

本文适用于以下 Linux 操作系统 (OS):

  • Red Hat 7 - 9
  • Amazon Linux 2, 2023
  • CentOS 7、8
  • Rocky Linux 8、9
  • Ubuntu 16 - 24
  • Debian 9 - 12

**先决条件:**要使用串行控制台,请确保满足所有先决条件。请注意,您必须在访问实例的根卷后完成设置操作系统用户密码步骤。

解决方法

要配置对串行控制台的访问权限,必须完成以下步骤。

**注意:**如果您的 EC2 串行控制台正常运行且您只需为操作系统用户设置密码,请仅完成该解决步骤。要验证 EC2 串行控制台是否正常运行,请参阅连接到 EC2 串行控制台。

访问实例的根卷

要访问实例的根卷,请启动一个临时实例。接下来,将您的 Amazon Elastic Block Store (Amazon EBS) 卷重新挂载到救援实例上。然后,在救援实例中,检查并修改串行控制台的 GRUB 设置。您还可以为根用户或操作系统用户设置密码,并为 SSH 进程守护程序设置允许根访问。

**重要事项:**设置临时实例时,请注意以下几点:

将根磁盘连接到救援实例

完成以下步骤:

  1. 创建新的密钥对,或者使用现有密钥对。

  2. 获取原始实例的根卷的卷 ID 和设备名称。

  3. 停止原始实例。

  4. 从同一可用区内具有相同 Linux 操作系统版本的亚马逊机器映像 (AMI) 中启动临时实例。

  5. 将根卷与原始实例分离,并将其作为辅助卷连接到临时实例。记下卷设备名称。

  6. 使用您的 SSH 密钥对连接到临时实例。

  7. 要更改为根用户,请运行以下命令:

    [ec2-user ~]$ sudo su
  8. 要确定块设备名称和分区,请从临时实例运行以下命令:

    [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

    前面的示例使用带有 blockfront 驱动程序的 XEN 实例。设备名称为 /dev/xvda 和 /dev/xvdf 的卷都是分区卷,而 /dev/xvdg 不是。如果卷已分区,则运行以下命令来挂载分区 (/dev/xvdf1),而不是原始设备 (/dev/xvdf):

    [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 实例上卷的设备名称。

  9. 要在 /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 环境中运行的进程能够访问这些系统目录。

为根用户或任何其他操作系统用户设置密码

在 chroot 中,使用 passwd 命令为操作系统用户设置密码,并在 SSH 配置中设置允许根访问。

在以下示例中,用户是根用户。您可以使用以下命令设置根密码:

[root ~]$ passwd root

要在 Linux 中为 SSH 进程守护程序 (sshd) 设置允许根访问,并将 #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 的波特率发送,不进行奇偶校验,且每个字符大小为 8 位。

检查并更新串行控制台的 GRUB2 设置

将内核参数 console=tty0 and console=ttyS0,115200 添加到 /etc/default/grub文件的 GRUB_CMDLINE_LINUX_DEFAULT 行中

完成以下步骤:

  1. 在 chroot 中使用文本编辑器打开 /etc/default/grub 文件。例如,要使用 nano 或 vi 编辑器,请运行以下命令之一:

    [root ~]$ nano /etc/default/grub
    [root ~]$ vi /etc/default/grub
  2. 找到以 GRUB_CMDLINE_LINUX_DEFAULT 开头的行。行类似于以下:

    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
  3. 将内核参数 console=tty0 和 console=ttyS0,115200 添加到此行。输入空格以将这些内核参数与当前参数分开。更新后的行类似于以下:

    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash console=tty0 console=ttyS0,115200"
  4. 保存更改并退出文本编辑器。

  5. 要更新 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
  6. 要退出 chroot,然后卸载 /dev、/run、/proc 和 /sys,请运行以下命令:

    [root ~]$ exit; umount -fl /mnt/{dev,proc,run,sys,}
  7. 在 Amazon EC2 控制台中,选择 Instances(实例),然后选择救援实例。

  8. 依次选择 Instance State(实例状态)、Stop instance(停止实例),然后选择 Yes, Stop(是,停止)。

  9. 将根卷 id-#####(受损实例的卷)与救援实例分离。

  10. 将该根卷作为根卷 (/dev/sda1) 连接到受损实例,然后启动该实例。

  11. 使用基于浏览器的客户端连接到 EC2 实例的串行控制台。

  12. 使用之前设置的密码以根用户身份登录。

AWS 官方已更新 2 年前