如何配置对不可到达或无法访问的 Linux 实例的 EC2 串行控制台的访问权限?

4 分钟阅读
0

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

简短描述

要配置对串行控制台的访问权限,请执行以下操作:

1.    访问实例的根卷。

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

3.    检查并更新串行控制台的 GRUB 设置。

**注意:**如果 EC2 Serial Console 在受影响的实例上运行正常,并且您只需要为操作系统用户设置密码即可,则可以跳过步骤 3。

先决条件

要使用串行控制台,请确保满足先决条件,除设置操作系统用户密码之外。以下解决方法讨论了设置密码的问题。

解决方法

使用救援实例访问实例的根卷

创建一个临时救援实例,然后将您的 Amazon Elastic Block Store(Amazon EBS)卷重新挂载到该救援实例上。在救援实例中,您可以检查和修改串行控制台的 GRUB 设置。您也可以为根用户或任何其他操作系统用户设置密码。

**重要事项:**请勿在实例存储支持的实例上执行此过程。由于恢复过程需要停止和启动您的实例,因此该实例上的所有数据均将丢失。有关详细信息,请参阅确定实例的根设备类型

1.    创建根卷的 EBS 快照。有关详细信息,请参阅创建 Amazon EBS 快照

2.    打开 Amazon EC2 控制台

**注意:**请确保您位于正确的区域。

3.    从导航窗格中选择实例,然后选择受损实例。

4.    选择实例状态停止实例,然后选择停止

5.    在存储选项卡的块设备下,选择 /dev/sda1/dev/xvda卷 ID

**注意:**根设备因 AMI 而异,但是 /dev/xvda/dev/sda1 是为根设备保留的。例如,Amazon Linux 1 和 2 使用 /dev/xvda。其他发行版(如 Ubuntu 16、18、CentOS 7 和 RHEL 7.5)使用 /dev/sda1

6.    选择操作分离卷,然后选择是,分离。请注意可用区。

**注意:**您可以在分离 EBS 卷之前对其进行标记,以帮助在后续步骤中对其进行识别。

7.    在同一可用区启动救援 EC2 实例。

**注意:**根据产品代码,您可能需要启动相同操作系统类型的 EC2 实例。例如,如果受损的 EC2 实例是付费 RHEL AMI,则必须启动具有相同产品代码的 AMI。有关详细信息,请参阅获取您的实例的产品代码

如果原始实例正在运行 SELinux(例如 RHEL、CentOS 7 或 8),请从使用 SELinux 的 AMI 启动救援实例。如果您选择运行其他操作系统的 AMI(例如 Amazon Linux 2),则原始实例上任何修改过的文件均会有损坏的 SELinux 标签。

8.    救援实例启动后,从导航窗格中选择,然后选择受损实例的分离根卷。

9.    选择操作连接卷

10.    选择救援实例 ID(id-xxxxx),然后设置未使用的设备。在此示例中,为 /dev/sdf

11.     使用 SSH 连接到您的救援实例。

12.    运行 lsblk 命令查看可用的磁盘设备:

lsblk

以下是输出示例:

NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
xvda    202:0     0   15G  0 disk
└─xvda1 202:1     0   15G  0 part /
xvdf    202:0     0   15G  0 disk
    └─xvdf1 202:1 0   15G  0 part

**注意:**基于 Nitro 的实例会将 EBS 卷作为 NVMe 块设备公开。基于 Nitro 的实例上 lsblk 命令生成的输出将磁盘名称显示为 nvme[0-26]n1。有关详细信息,请参阅 Linux 实例上的 Amazon EBS 和 NVMe。以下是基于 Nitro 的实例上的 lsblk 命令输出示例:

NAME           MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
nvme0n1        259:0    0    8G  0 disk
└─nvme0n1p1    259:1    0    8G  0 part /
└─nvme0n1p128  259:2    0    1M  0 part
nvme1n1        259:3    0  100G  0 disk
└─nvme1n1p1    259:4    0  100G  0 part /

13.    运行以下命令成为根用户:

sudo -i

14.    将已挂载卷的根分区挂载到 /mnt。在前面的示例中,/dev/xvdf1/dev/nvme2n1p2 是已挂载卷的根分区。有关详细信息,请参阅使 Amazon EBS 卷可在 Linux 上使用

**注意:**在以下示例中,将 /dev/xvdf1 替换为适合您的卷的正确根分区。

mount -o nouuid /dev/xvdf1 /mnt

**注意:**如果您的配置中不存在 /mnt,请创建一个挂载目录,然后将已挂载卷的根分区挂载到这个新目录。

mkdir /mnt
mount -o nouuid /dev/xvdf1 /mnt

现在,您可以通过挂载目录访问受损实例的数据。

15.    将救援实例的 /dev/run/proc/sys 挂载到与新挂载的卷相同的路径上:

for m in dev proc run sys; do mount -o bind {,/mnt}/$m; done

调用 chroot 函数以切换到挂载目录。

**注意:**如果您有单独的 /boot/etc 分区,请在运行以下命令之前将它们挂载到 /mnt/boot/mnt/etc

chroot /mnt

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

使用 passwd 命令为您的操作系统用户设置密码。在以下示例中,用户是根用户:

passwd root

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

**注意:**如果 EC2 Serial Console 在受影响的实例上运行正常,并且您只需要为操作系统用户设置密码即可,则可以跳过此步骤。

Linux 支持的串行控制台端口是 ttyS0。如果在连接到 EC2 Serial Console 时屏幕保持黑屏,未提供任何输出,则应确保在 GRUB 设置中正确配置了 console 条目。下面提供的示例取自串行控制台正常运行的不同发行版的 AWS Marketplace AMI:

适用于 Amazon Linux 2、RHEL 和 CentOS 7 的 GRUB2

1.    确认 /etc/default/grub 文件的 GRUB_CMDLINE_LINUX_DEFAULT 行中是否正确设置了 ttyS0console 条目:

Amazon Linux 2

GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0,115200n8 net.ifnames=0 biosdevname=0 nvme_core.io_timeout=4294967295 rd.emergency=poweroff rd.shell=0"

RHEL 7

GRUB_CMDLINE_LINUX="console=ttyS0,115200n8 console=tty0 net.ifnames=0 rd.blacklist=nouveau crashkernel=auto"

CentOS 7

GRUB_CMDLINE_LINUX="console=tty0 crashkernel=auto net.ifnames=0 console=ttyS0"

2.    如果未设置 ttyS0 的控制台条目,请将其添加到 GRUB_CMDLINE_LINUX_DEFAULT 行中。然后更新 GRUB 以重新生成 /boot/grub2/grub.cfg 文件:

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

适用于 Red Hat 6 和 Amazon Linux 1 的 GRUB1(旧版 GRUB)

1.    确认在 /boot/grub/grub.conf 文件的 kernel 行中正确设置了 ttyS0console 条目:

Amazon Linux 1

kernel /boot/vmlinuz-4.14.252-131.483.amzn1.x86_64 root=LABEL=/ console=tty1 console=ttyS0 selinux=0 nvme_core.io_timeout=4294967295

Red Hat 6

kernel /boot/vmlinuz-2.6.32-573.el6.x86_64 console=ttyS0 console=ttyS0,115200n8 ro root=UUID=0e6b1614-7bbe-4d6e-bc78-a5556a123ba8 rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us LANG=en_US.UTF-8 xen_blkfront.sda_is_xvda=1 console=tty0 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_NO_LVM rd_NO_DM

2.    如果未设置 ttyS0 的控制台条目,请根据前面的示例将其添加到 /boot/grub/grub.conf 文件中。

适用于 Ubuntu 16.04、18.04 和 20.04 的 GRUB2

1.    确认 /etc/default/grub.d/50-cloudimg-settings.cfg 文件的 GRUB_CMDLINE_LINUX_DEFAULT 行中是否正确设置了 ttyS0console 条目:

GRUB_CMDLINE_LINUX_DEFAULT="console=tty1 console=ttyS0 nvme_core.io_timeout=4294967295"

2.    如果控制台条目 console=ttyS0 条目不存在**,**请将其添加到 GRUB\ _CMDLINE\ _LINUX\ _DEFAULT 行中。然后使用以下命令更新 GRUB 配置:

update-grub

**适用于 RHEL 8、CentOS 8 和 Amazon Linux 2023 的 GRUB2
**

1.    运行 grubby--default-kernel 命令查看当前的默认内核:

grubby --default-kernel

2.    运行 grubby --info=ALL 命令查看所有可用的内核、它们的索引和参数:

grubby --info=ALL

3.    确认步骤 1 中列出的默认内核的 args 行中是否正确设置了 ttyS0console 条目。

RHEL 8

index=0
kernel="/boot/vmlinuz-4.18.0-305.el8.x86_64"
args="ro console=ttyS0,115200n8 console=tty0 net.ifnames=0 rd.blacklist=nouveau nvme_core.io_timeout=4294967295 crashkernel=auto $tuned_params"
root="UUID=d35fe619-1d06-4ace-9fe3-169baad3e421"
initrd="/boot/initramfs-4.18.0-305.el8.x86_64.img $tuned_initrd"
title="Red Hat Enterprise Linux (4.18.0-305.el8.x86_64) 8.4 (Ootpa)"
id="0c75beb2b6ca4d78b335e92f0002b619-4.18.0-305.el8.x86_64"

CentOS 8

index=2
kernel="/boot/vmlinuz-4.18.0-193.19.1.el8_2.x86_64"
args="ro console=ttyS0,115200n8 no_timer_check net.ifnames=0 nvme_core.io_timeout=4294967295 nvme_core.max_retries=10 crashkernel=auto $tuned_params"
root="UUID=b437cbaa-8fe5-49e4-8537-0895c219037a"
initrd="/boot/initramfs-4.18.0-193.19.1.el8_2.x86_64.img $tuned_initrd"
title="CentOS Linux (4.18.0-193.19.1.el8_2.x86_64) 8 (Core)"
id="dc49529e359897df0b9664481b009b1f-4.18.0-193.19.1.el8_2.x86_64"

Amazon Linux 2023

[root@ip-172-31-92-173 ~]# grubby --info DEFAULTindex=0
kernel="/boot/vmlinuz-6.1.15-28.43.amzn2023.x86_64"
Acessing serial console on Amazon Linux 2023
root="UUID=7efef47b-a4f8-4b90-9504-8196067a31b6"
initrd="/boot/initramfs-6.1.15-28.43.amzn2023.x86_64.img"
title="Amazon Linux (6.1.15-28.43.amzn2023.x86_64) 2023"
id="02c860b8daad4861b87f9b3603834c8f-6.1.15-28.43.amzn2023.x86_64"

4.    如果未设置 ttyS0 的 console 条目,则使用以下 grubby 命令将其附加到默认内核的 args 中:

grubby --args "console=tty0 console=ttyS0,115200n8" --update-kernel DEFAULT

从救援实例上卸载并分离根卷,然后将该卷连接到受损实例

1.    退出 chroot,然后卸载 /dev/run/proc/sys

exit
umount /mnt/{dev,proc,run,sys,}

2.    在 Amazon EC2 控制台中,选择实例,然后选择救援实例。

3.    选择实例状态停止实例,然后选择是,停止

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

5.    将您在步骤 4 中分离的根卷作为根卷(/dev/sda1)连接到受损实例,然后启动该实例。

**注意:**根设备因 AMI 而异。名称 /dev/xvda/dev/sda1 是为根设备保留的。例如,Amazon Linux 1 和 2 使用 /dev/xvda。其他发行版(如 Ubuntu 16、18、CentOS 7 和 RHEL 7.5)使用 /dev/sda1。

现在,您可以使用上一个步骤中为根用户或任何其他操作系统用户定义的密码,通过 EC2 Serial Console 访问受损实例的操作系统。

相关信息

使用 GRUB 对 Linux 实例进行故障排除

AWS 官方
AWS 官方已更新 2 年前