主动确保你能够访问 GRUB 和 sysrq,可以节省大量停机时间

适用于:✔️ Linux VM

注释

新功能! 尝试使用 VM 辅助功能进行更快的诊断

建议您运行 适用于 Windows 的 VM 助手适用于 Linux 的 VM 助手。 这些基于脚本的诊断工具可帮助你识别影响 Azure VM 来宾代理和整体 VM 运行状况的常见问题。

在大多数情况下,访问串行控制台和 GRUB 将缩短 IaaS Linux 虚拟机的恢复时间。 GRUB 提供恢复选项,否则恢复 VM 需要更长时间。

执行 VM 恢复的原因很多,可以归因于以下情况:

  • 损坏的文件系统/内核/MBR(主启动记录)
  • 失败的内核升级
  • 错误的 GRUB 内核参数
  • 错误的 fstab 配置
  • 防火墙配置
  • 密码丢失
  • 损坏的 sshd 配置文件
  • 网络配置

此处详细介绍了许多其他情况

验证是否可以访问 Azure 中部署的 VM 上的 GRUB 和串行控制台。

如果不熟悉串行控制台,请参阅此链接

提示

确保在进行更改之前对文件进行备份

观看下面的视频,了解如何在获得 GRUB 访问权限后快速恢复 Linux VM

恢复 Linux VM 视频

有许多方法可以帮助恢复 Linux VM。 在云环境中,此过程具有挑战性。 在工具和功能方面不断取得进展,以确保服务得到快速恢复。

使用 Azure 串行控制台,你可以像在系统控制台中一样与 Linux VM 进行交互。

可以操作许多配置文件,包括内核的启动方式。

经验较丰富的 Linux/Unix sys 管理员会喜欢通过 Azure 串行控制台访问的“单一用户”和“紧急模式”,使许多恢复场景的磁盘交换和 VM 删除变得冗余

恢复方法取决于遇到的问题,例如,可以通过Azure 门户选项 ->Reset Password 重置丢失或错放的密码。 “重置密码”功能是一种扩展,该功能与 Linux 来宾代理通信

其他扩展(如自定义脚本)可用,但这些选项要求 Linux waagent 处于正常状态,这种情况并非总是如此。

Azure 门户“属性”页中代理状态的屏幕截图。

确保你有权访问 Azure 串行控制台和 GRUB 意味着密码更改或不正确的配置可以在几分钟(而不是几小时)内得到纠正。 如果磁盘上有多个内核并且主内核损坏,你甚至可以强制 VM 从备用内核启动。

GRUB 中启动所选 OS 屏幕的屏幕截图,其中显示了可以选择多个内核。

建议的恢复方法顺序

磁盘交换视频

如果无法访问 GRUB 观看 视频,了解如何轻松自动执行磁盘交换过程以恢复 VM

挑战

并非所有 Linux Azure VM 在默认情况下都配置为可访问 GRUB,它们也没有配置为使用 sysrq 命令中断。 某些较旧的发行版(如 SLES 11)未配置为在 Azure 串行控制台中显示登录提示

在本文中,我们将回顾各种 Linux 发行版和文档配置,了解如何使 GRUB 可用。

如何配置 Linux VM 以接受 SysRq 密钥

默认情况下,sysrq 密钥在某些较新的 Linux 发行版上启用,尽管在另一些版本上,它可能配置为仅接受特定 SysRq 函数的值。 在较旧的发行版上,它可能被完全禁用。

SysRq 功能可用于直接从 Azure 串行控制台重新启动崩溃或未响应的 VM,也可用于获得对 GRUB 菜单的访问权限,或者从其他门户窗口重新启动 VM 或 ssh 会话可能会放弃当前控制台连接,从而使显示 GRUB 菜单的 GRUB 超时过期。 必须将 VM 配置为接受内核参数值 1,这会启用 sysrq 或 128 的所有函数,从而允许重新启动/关闭电源

启用 sysrq 视频

要将 VM 配置为通过 Azure 门户上的 SysRq 命令接受重新启动,需要为内核参数 kernel.sysrq 设置值 1

要使此配置保留重新启动,请向文件 sysctl.conf 添加条目

sudo echo kernel.sysrq = 1 >> /etc/sysctl.conf

动态配置内核参数

sudo sysctl -w kernel.sysrq=1

如果没有 root 访问权限或 sudo 被破坏,则无法在命令行提示符下配置 sysrq。

在这种情况下,可以使用 Azure 门户启用 sysrq。 如果 sudoers.d/waagent 文件已损坏或已被删除,此方法可能会很有用

使用Azure 门户操作 -> 运行命令 -> RunShellScript 功能,要求 waagent 进程正常运行,然后可以注入此命令以启用 sysrq

sudo sysctl -w kernel.sysrq=1 ; sudo echo kernel.sysrq = 1 >> /etc/sysctl.conf

如下所示:

注入命令时 RunShellScript 窗口的屏幕截图。

完成后,可以尝试访问 sysrq,应该可以看到可以重新启动

按钮栏中键盘图标下的“发送 SysRq 命令”选项的屏幕截图。

选择“重新启动”和“发送 SysRq”命令

“将 SysRq 命令发送到来宾”对话框中“重新启动”选项的屏幕截图。

系统应记录如下重置消息

命令行界面中重置消息日志的屏幕截图。

Ubuntu GRUB 配置

默认情况下,在 VM 启动时,应能够按住 Esc 键来访问 GRUB,如果未显示 GRUB 菜单,则可以使用下列选项之一在 Azure 串行控制台中强制和保留 GRUB 菜单。

选项 1 - 强制 GRUB 显示在屏幕上

更新文件 /etc/default/grub.d/50-cloudimg-settings.cfg,使 GRUB 菜单针对指定的 TIMEOUT 保留在屏幕上。 无需点击 Esc ,因为 GRUB 将立即显示。

GRUB_TIMEOUT=5
GRUB_TIMEOUT_STYLE=menu

选项 2 - 允许在启动前按下 Esc

通过更改文件 /etc/default/grub 可能会发生类似行为,观察 3 秒超时以按 Esc

注释禁止以下两行:

#GRUB_HIDDEN_TIMEOUT=0
#GRUB_HIDDEN_TIMEOUT_QUIET=true

然后添加以下行:

GRUB_TIMEOUT_STYLE=countdown

请确保启用serial-getty@ttyS0.service,以便 systemd 能在该控制台提供登录提示:

sudo systemctl enable serial-getty@ttyS0.service
sudo systemctl start serial-getty@ttyS0.service

Ubuntu 恢复模式

可通过 GRUB 为 Ubuntu 提供其他恢复和清理选项,但仅在相应地配置内核参数时才能访问这些设置。 如果未能配置此内核启动参数,系统会强制将恢复菜单发送到 Azure 诊断,而不是发送到 Azure 串行控制台。 可以按照以下步骤访问 Ubuntu 恢复菜单:

中断 BOOT 过程并访问 GRUB 菜单

选择 Ubuntu 的高级选项,然后按 Enter

屏幕截图显示了“串行控制台”,其中选择了“高级”选项,其中选择了“Ubuntu”。

选择显示 (恢复模式) 的行,不要按 Enter,而是按“e”键

屏幕截图显示了选择了恢复模式版本的串行控制台。

找到将加载内核的行,并将目标 console=ttyS0 替换为最后一个参数 nomodeset

linux /boot/vmlinuz-4.15.0-1023-azure root=UUID=21b294f1-25bd-4265-9c4e-d6e4aeb57e97 ro recovery nomodeset

change to

linux /boot/vmlinuz-4.15.0-1023-azure root=UUID=21b294f1-25bd-4265-9c4e-d6e4aeb57e97 ro recovery console=ttyS0

屏幕截图显示了具有已更改值的串行控制台。

按“Ctrl-x”以启动并加载内核。 如果一切顺利,你将看到这些附加选项,这可以帮助执行其他恢复选项

屏幕截图显示恢复菜单中的串行控制台,该菜单提供其他恢复选项。

Red Hat GRUB 配置

Red Hat 8.6+ GRUB 配置

这些版本上的默认 /etc/default/grub 配置已充分配置。

GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto console=tty1 console=ttyS0 earlyprintk=ttyS0 rootdelay=300"
GRUB_DISABLE_RECOVERY="true"
GRUB_ENABLE_BLSCFG=true

GRUB_TIMEOUT_STYLE=countdown
GRUB_TERMINAL="serial console"
GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"

请确保启用serial-getty@ttyS0.service,以便 systemd 能在该控制台提供登录提示:

sudo systemctl enable serial-getty@ttyS0.service
sudo systemctl start serial-getty@ttyS0.service

SuSE

SLES 15 sp5

这些版本上的默认 /etc/default/grub 配置已充分配置。

GRUB_DEFAULT=0
GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=1
GRUB_CMDLINE_LINUX_DEFAULT="console=ttyS0 net.ifnames=0 dis_ucode_ldr earlyprintk=ttyS0 multipath=off nvme_core.io_timeout=240 rootdelay=300 scsi_mod.use_blk_mq=1 USE_BY_UUID_DEVICE_NAMES=1 systemd.unified_cgroup_hierarchy=1"
GRUB_CMDLINE_LINUX=""


GRUB_DISTRIBUTOR="SLES15-SP5"
GRUB_GFXMODE=auto
GRUB_TERMINAL_INPUT="serial"
GRUB_TERMINAL_OUTPUT="serial"
GRUB_TIMEOUT_STYLE=countdow

请确保启用serial-getty@ttyS0.service,以便 systemd 能在该控制台提供登录提示:

sudo systemctl enable serial-getty@ttyS0.service
sudo systemctl start serial-getty@ttyS0.service

SLES 12 sp1

可以根据官方文档使用 YaST 引导加载程序

也将以下参数添加/更改为 /etc/default/grub:

GRUB_CMDLINE_LINUX_DEFAULT="console=ttyS0 net.ifnames=0 dis_ucode_ldr earlyprintk=ttyS0 multipath=off nvme_core.io_timeout=240 rootdelay=300 scsi_mod.use_blk_mq=1 USE_BY_UUID_DEVICE_NAMES=1 systemd.unified_cgroup_hierarchy=1"
GRUB_TERMINAL_INPUT="serial"
GRUB_TERMINAL_OUTPUT="serial"
GRUB_TIMEOUT=10
GRUB_TIMEOUT_STYLE=countdown

重新创建 grub.cfg

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

请确保启用serial-getty@ttyS0.service,以便 systemd 能在该控制台提供登录提示:

sudo systemctl enable serial-getty@ttyS0.service
sudo systemctl start serial-getty@ttyS0.service

此配置将使消息“按任意键继续”在控制台上显示 5 秒

然后,它将再显示 GRUB 菜单 5 秒 - 通过按下向下箭头,你将中断计数器并选择要启动的内核,以为需要设置根密码的单个用户模式追加关键字“single”

追加命令 init_/bin/bash 将加载内核,但可确保 init 程序替换为 bash shell

无需输入密码即可访问 shell。 然后,可以继续更新 Linux 帐户的密码或进行其他配置更改。

强制内核到 bash 提示

通过访问 GRUB 可以中断初始化过程,这种交互对于许多恢复过程非常有用。 如果没有根密码,并且单个用户要求你拥有根密码,则可以启动内核,将 init 程序替换为 bash 提示 - 通过将 init=/bin/bash 追加到内核启动行来实现此中断

屏幕截图显示了包含更新的启动行的控制台。

使用以下命令重新装载 / (root) 文件系统 RW

mount -o remount,rw /

屏幕截图显示了具有重新装载操作的控制台。

现在,你可以执行根密码更改或许多其他 Linux 配置更改

屏幕截图显示了一个控制台,可在其中更改根密码和其他配置。

使用以下命令重启 VM

/sbin/reboot -f

单个用户模式

或者,可能需要在单个用户或紧急模式下访问 VM。 使用箭头键选择希望启动或中断的内核。 通过将关键字“single”或“1”追加到内核启动行,输入所需的模式。 在 RHEL 系统上,还可以追加 rd.break

有关如何访问单一用户模式的详细信息,请参阅此文档

启动 GRUB 中所选 OS 屏幕中 *Ubuntu 条目的屏幕截图。

后续步骤

详细了解 Azure 串行控制台

联系我们寻求帮助

如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区