适用于:✔️ 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。 在云环境中,此过程具有挑战性。 在工具和功能方面不断取得进展,以确保服务得到快速恢复。
使用 Azure 串行控制台,你可以像在系统控制台中一样与 Linux VM 进行交互。
可以操作许多配置文件,包括内核的启动方式。
经验较丰富的 Linux/Unix sys 管理员会喜欢通过 Azure 串行控制台访问的“单一用户”和“紧急模式”,使许多恢复场景的磁盘交换和 VM 删除变得冗余。
恢复方法取决于遇到的问题,例如,可以通过Azure 门户选项 ->Reset Password 重置丢失或错放的密码。 “重置密码”功能是一种扩展,该功能与 Linux 来宾代理通信。
其他扩展(如自定义脚本)可用,但这些选项要求 Linux waagent 处于正常状态,这种情况并非总是如此。
确保你有权访问 Azure 串行控制台和 GRUB 意味着密码更改或不正确的配置可以在几分钟(而不是几小时)内得到纠正。 如果磁盘上有多个内核并且主内核损坏,你甚至可以强制 VM 从备用内核启动。
建议的恢复方法顺序
Azure 串行控制台
旧方法
磁盘交换视频
如果无法访问 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 的所有函数,从而允许重新启动/关闭电源
要将 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
如下所示:
完成后,可以尝试访问 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
选择显示 (恢复模式) 的行,不要按 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。
有关如何访问单一用户模式的详细信息,请参阅此文档
后续步骤
详细了解 Azure 串行控制台
联系我们寻求帮助
如果你有任何疑问或需要帮助,请创建支持请求或联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区。