使用 GRUB 对 Linux 实例进行故障排查 - Amazon Elastic Compute Cloud
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

GNU GRUB(GNU GRand Unified Bootloader [统一引导加载程序] 的缩写,通常称为 GRUB)是大多数 Linux 操作系统的默认引导加载程序。从 GRUB 菜单中,您可以选择要引导到哪个内核,或修改菜单项以更改内核的启动方式。这在对失败的实例进行故障排查时非常有用。

在引导流程中将显示 GRUB 菜单。该菜单无法通过普通 SSH 访问,但您可以通过 EC2 串行控制台访问。

Prerequisites

您必须先授予串行控制台访问权限,然后才能配置和使用 GRUB。有关更多信息,请参阅配置对 EC2 串行控制台的访问

配置 GRUB

在通过串行控制台使用 GRUB 之前,您必须将实例配置为通过串行控制台使用 GRUB。

要配置 GRUB,请根据用于启动实例的 AMI 选择以下程序之一。

Amazon Linux 2

在 Amazon Linux 2 实例上配置 GRUB

  1. 连接到您的实例

  2. /etc/default/grub 中添加或更改以下选项:

    • 设置 GRUB_TIMEOUT=1

    • 添加 GRUB_TERMINAL="console serial".

    • 添加 GRUB_SERIAL_COMMAND="serial --speed=115200".

    以下是 /etc/default/grub 的示例。

    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" GRUB_TIMEOUT=1 GRUB_DISABLE_RECOVERY="true" GRUB_TERMINAL="console serial" GRUB_SERIAL_COMMAND="serial --speed=115200"
  3. 运行以下命令以应用更新后的配置。

    [ec2-user ~]$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg
Ubuntu

在 Ubuntu 实例上配置 GRUB

  1. 连接到您的实例

  2. /etc/default/grub.d/50-cloudimg-settings.cfg 中添加或更改以下选项:

    • 设置 GRUB_TIMEOUT=1

    • 添加 GRUB_TIMEOUT_STYLE=menu.

    • 添加 GRUB_TERMINAL="console serial".

    • 删除 GRUB_HIDDEN_TIMEOUT.

    • 添加 GRUB_SERIAL_COMMAND="serial --speed=115200".

    以下是 /etc/default/grub.d/50-cloudimg-settings.cfg 的示例。

    # Cloud Image specific Grub settings for Generic Cloud Images # CLOUD_IMG: This file was created/modified by the Cloud Image build process # Set the recordfail timeout GRUB_RECORDFAIL_TIMEOUT=0 # Do not wait on grub prompt GRUB_TIMEOUT=1 GRUB_TIMEOUT_STYLE=menu # Set the default commandline GRUB_CMDLINE_LINUX_DEFAULT="console=tty1 console=ttyS0 nvme_core.io_timeout=4294967295" # Set the grub console type GRUB_TERMINAL="console serial" GRUB_SERIAL_COMMAND="serial --speed 115200"
  3. 运行以下命令以应用更新后的配置。

    [ec2-user ~]$ sudo update-grub
RHEL

在 RHEL 实例上配置 GRUB

  1. 连接到您的实例

  2. /etc/default/grub 中添加或更改以下选项:

    • 删除 GRUB_TERMINAL_OUTPUT.

    • 添加 GRUB_TERMINAL="console serial".

    • 添加 GRUB_SERIAL_COMMAND="serial --speed=115200".

    以下是 /etc/default/grub 的示例。

    GRUB_TIMEOUT=1 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_CMDLINE_LINUX="console=ttyS0,115200n8 console=tty0 net.ifnames=0 rd.blacklist=nouveau nvme_core.io_timeout=4294967295 crashkernel=auto" GRUB_DISABLE_RECOVERY="true" GRUB_ENABLE_BLSCFG=true GRUB_TERMINAL="console serial" GRUB_SERIAL_COMMAND="serial --speed=115200"
  3. 运行以下命令以应用更新后的配置。

    [ec2-user ~]$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg
CentOS

对于使用 CentOS AMI 启动的实例,默认情况下为串行控制台配置了 GRUB。

以下是 /etc/default/grub 的示例。

GRUB_TIMEOUT=1 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL="serial console" GRUB_SERIAL_COMMAND="serial --speed=115200" GRUB_CMDLINE_LINUX="console=tty0 crashkernel=auto console=ttyS0,115200" GRUB_DISABLE_RECOVERY="true"

使用 GRUB

配置 GRUB 后,连接到串行控制台并使用重启命令重启实例。在重新启动过程中,您会看到 GRUB 菜单。出现 GRUB 菜单时按任意键可停止启动流程,从而使您可以与 GRUB 菜单进行交互。

单用户模式

单用户模式将在较低的运行级别启动内核。例如,它可能会挂载文件系统,但不会激活网络,从而使您有机会执行修复实例所需的维护。

启动到单用户模式

  1. 连接到实例的串行控制台。

  2. 使用以下命令重新引导实例。

    [ec2-user ~]$ sudo reboot
  3. 在重新启动期间,当 GRUB 菜单出现时,按任意键停止引导流程。

  4. 在 GRUB 菜单中,使用箭头键选择要引导的内核,然后按键盘上的 e

  5. 使用箭头键将光标定位在包含内核的行上。该行以 linuxlinux16 开头,取决于启动实例所使用的 AMI。对于 Ubuntu,有两行开头为 linux,必须在下一步中修改。

  6. 在行末添加 single 一词。

    以下是 Amazon Linux 2 的示例。

    linux /boot/vmlinuz-4.14.193-149.317.amzn2.aarch64 root=UUID=d33f9c9a-\ dadd-4499-938d-ebbf42c3e499 ro console=tty0 console=ttyS0,115200n8 net.ifname\ s=0 biosdevname=0 nvme_core.io_timeout=4294967295 rd.emergency=poweroff rd.she\ ll=0 single
  7. Ctrl+X 可启动到单用户模式。

  8. login 提示符下,输入您之前设置的基于密码的用户的用户名,然后按 Enter 键。

  9. Password 提示符下,输入密码,然后按 Enter 键。

紧急模式

紧急模式与单用户模式类似,只是内核在可达到的最低运行级别运行。

要启动到紧急模式,请按照上一节的 单用户模式 中的步骤操作,但在第 6 步中添加的词是 emergency 而非 single