我的 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 进程守护程序设置允许根访问。
**重要事项:**设置临时实例时,请注意以下几点:
将根磁盘连接到救援实例
完成以下步骤:
-
创建新的密钥对,或者使用现有密钥对。
-
获取原始实例的根卷的卷 ID 和设备名称。
-
停止原始实例。
-
从同一可用区内具有相同 Linux 操作系统版本的亚马逊机器映像 (AMI) 中启动临时实例。
-
将根卷与原始实例分离,并将其作为辅助卷连接到临时实例。记下卷设备名称。
-
使用您的 SSH 密钥对连接到临时实例。
-
要更改为根用户,请运行以下命令:
[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
前面的示例使用带有 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 实例上卷的设备名称。
-
要在 /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 行中
完成以下步骤:
-
在 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 控制台中,选择 Instances(实例),然后选择救援实例。
-
依次选择 Instance State(实例状态)、Stop instance(停止实例),然后选择 Yes, Stop(是,停止)。
-
将根卷 id-#####(受损实例的卷)与救援实例分离。
-
将该根卷作为根卷 (/dev/sda1) 连接到受损实例,然后启动该实例。
-
使用基于浏览器的客户端连接到 EC2 实例的串行控制台。
-
使用之前设置的密码以根用户身份登录。