主动确保你有权访问 GRUB 和 sysrq 可以节省大量时间

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

执行 VM 恢复的原因有很多,可归结为以下方案:

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

此处详细介绍的许多其他 方案

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

如果你是串行控制台的新增用户,请参阅 此链接

提示

确保先备份文件,然后再进行更改

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

恢复 Linux VM 视频

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

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

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

经验较丰富的 Linux/Unix sys 管理员将感谢你可通过Azure 串行控制台访问的单一用户和紧急模式,使许多恢复方案的磁盘交换和 VM 删除冗余。

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

其他扩展(如自定义脚本)可用,但这些选项要求 Linux waagent 启动且状态并非始终正常。

代理状态

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

多内核

建议的恢复方法顺序:

磁盘交换视频:

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

挑战:

并非所有 Linux Azure VM 都默认配置为用于 GRUB 访问,并且两者均配置为使用 sysrq 命令中断。 某些较旧的 distros(如 SLES 11)未配置为在 Azure 串行控制台中显示登录提示

本文将介绍各种 Linux 分发和文档配置,了解如何使 GRUB 可用。

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

默认情况下,在某些较新的 Linux 发行版上启用 sysrq 键,尽管对于其他发行版,它可能配置为仅接受某些 SysRq 函数的值。 在较旧的 distros 上,可能会完全禁用它。

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

启用 sysrq 视频

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

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

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

动态配置内核参数

sysctl -w kernel.sysrq=1

如果没有 根访问权限或 中断了支持,则不能从命令行管理程序提示符配置 sysrq。

你可以在此方案中使用 Azure 门户启用 sysrq。 如果 sudoers.d/waagent 文件已损坏或已删除,此方法将非常有利。

使用 Azure 门户 Operations -> Run Command -> RunShellScript 功能,需要 waagent 进程正常运行,然后你可以注入此命令以启用 sysrq

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

如下所示:启用  sysrq2

完成后,你可以尝试访问 sysrq, 并且应该会看到重启是可能的。

启用 sysrq3

选择 重新启动发送 SysRq 命令

启用 sysrq4

系统应记录如下重置消息

启用 sysrq5

Ubuntu GRUB 配置

默认情况下,你应该能够通过在 VM 启动期间按住 Esc 键来访问 GRUB,如果未显示 GRUB 菜单,可以使用这些选项之一在 Azure 串行控制台中强制将 GRUB 菜单保留在屏幕上。

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

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

GRUB_TIMEOUT=0

change to

GRUB_TIMEOUT=5

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

通过更改文件 /etc/default/grub 并观察命中 Esc 的 3 秒超时,可能会遇到 类似行为

注释掉以下两行:

#GRUB_HIDDEN_TIMEOUT=0
#GRUB_HIDDEN_TIMEOUT_QUIET=true

并添加以下行:

GRUB_TIMEOUT_STYLE=countdown

Ubuntu 12 . 04

Ubuntu 12.04 将允许访问串行控制台,但不提供交互功能。 登录 未看到提示

对于 12.04 获取 登录名: 提示:

  1. 创建名为 /etc/init/ttyS0.conf 的文件,其中包含以下文本:

    # ttyS0 - getty
    #
    # This service maintains a getty on ttyS0 from the point the system is
    # started until it is shut down again.
    start on stopped rc RUNLEVEL=[12345]
    stop on runlevel [!12345]
    
    respawn
    exec /sbin/getty -L 115200 ttyS0 vt102
    
  2. 请求启动以启动 getty

    sudo start ttyS0
    

可以在此处找到为 Ubuntu 版本配置串行控制台所需的 设置

Ubuntu 恢复模式

可通过 GRUB 为 Ubuntu 提供其他恢复和清理选项,但是只有在相应地配置内核参数时,才能访问这些设置。 如果配置此内核启动参数失败,将强制将"恢复"菜单发送到 Azure 诊断,而不是 Azure 串行控制台。 可以通过执行以下步骤获取 Ubuntu 恢复菜单的访问权限:

中断启动过程并访问 GRUB 菜单

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

Screenshot shows the Serial console with Advanced options for Ubuntu selected.

选择显示恢复 (行,) 按 Enter 但按"e"

Screenshot shows the Serial console with a recovery mode version selected.

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

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

Screenshot shows the Serial console with the changed value.

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

Screenshot shows the Serial console at the Recovery Menu, which offers additional recovery options.

Red Hat GRUB 配置

Red Hat 7 . 4 + GRUB 配置

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

GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL="serial console"
GRUB_SERIAL_COMMAND="serial"
GRUB_CMDLINE_LINUX="console=tty1 console=ttyS0 earlyprintk=ttyS0 rootdelay=300"
GRUB_DISABLE_RECOVERY="true"

启用 SysRq 键

sysctl -w kernel.sysrq=1;echo kernel.sysrq = 1 >> /etc/sysctl.conf;sysctl -a | grep -i sysrq

Red Hat 7 . 2 和 7 . 3 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_OUTPUT="console"
GRUB_CMDLINE_LINUX="console=tty1 console=ttyS0 earlyprintk=ttyS0 rootdelay=300"
GRUB_DISABLE_RECOVERY="true"

在 /etc/default/grub 中更改以下行

GRUB_TIMEOUT=1 

to

GRUB_TIMEOUT=5
GRUB_TERMINAL_OUTPUT="console"

to

GRUB_TERMINAL="serial console"

此外,添加以下行:

GRUB_SERIAL_COMMAND=”serial –speed=115200 –unit=0 –word=8 –parity=no –stop=1″

/etc/default/grub 现在应类似于此示例:

GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL="serial console"
GRUB_CMDLINE_LINUX="console=tty1 console=ttyS0 earlyprintk=ttyS0 rootdelay=300"
GRUB_DISABLE_RECOVERY="true"

使用 完成和更新 grub 配置

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

设置 SysRq 内核参数:

sysctl -w kernel.sysrq = 1;echo kernel.sysrq = 1 >> /etc/sysctl.conf;sysctl -a | grep -i sysrq

或者,可以使用命令行管理程序中的单行或通过运行命令配置 GRUB 和 SysRq。 在运行此命令之前备份文件:

cp /etc/default/grub /etc/default/grub.bak; sed -i 's/GRUB_TIMEOUT=1/GRUB_TIMEOUT=5/g' /etc/default/grub; sed -i 's/GRUB_TERMINAL_OUTPUT="console"/GRUB_TERMINAL="serial console"/g' /etc/default/grub; echo "GRUB_SERIAL_COMMAND=\"serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1\"" >> /etc/default/grub;grub2-mkconfig -o /boot/grub2/grub.cfg;sysctl -w kernel.sysrq=1;echo kernel.sysrq = 1 /etc/sysctl.conf;sysctl -a | grep -i sysrq

Red Hat 6 . x GRUB 配置

要修改的文件是 /boot/grub/grub.conf。 timeout该值将确定 GRUB 的显示时间。

#boot=/dev/vda
default=0
timeout=15
splashimage=(hd0,0)/grub/splash.xpm.gz
#hiddenmenu
serial --unit=0 --speed=9600
terminal serial
terminal --timeout=5 serial console

最后一 行终端 –-timeout=5 串行 控制台将添加 5 秒的提示以进一步增加 GRUB 超时,显示 按任意键继续。

Screenshot shows a console with output.

对于配置的 timeout=15,GRUB 菜单应显示在屏幕上,而无需按 Esc。确保在浏览器中的控制台中单击以激活菜单并选择所需的内核

Screenshot shows a console with two Linux options.

SuSE

SLES 12 sp1

根据官方文档使用 YaST 启动 加载程序

或者添加/更改为 /etc/default/grub 以下参数:

GRUB_TERMINAL=serial
GRUB_TIMEOUT=5
GRUB_SERIAL_COMMAND="serial --unit=0 --speed=9600 --parity=no"

验证 ttys0 是否用于 GRUB_CMDLINE_LINUX 或 GRUB_CMDLINE_LINUX_DEFAULT

GRUB_CMDLINE_LINUX_DEFAULT="console=ttyS0,9600n"

重新创建 grub.cfg

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

SLES 11 SP4

串行控制台显示并显示启动消息,但不显示 登录: 提示

在 VM 中打开 ssh 会话,然后通过取消注释以下行来更新文件 /etc/inittab:

#S0:12345:respawn:/sbin/agetty -L 9600 ttyS0 vt102

接下来运行命令

telinit q

若要启用 GRUB,应更改 /boot/grub/menu.lst

timeout 5
serial --unit=0 --speed=9600 --parity=no
terminal --timeout=5 serial console

root (hd0,0)
kernel /boot/vmlinuz-3.0.101-108.74-default root=/dev/disk/by-uuid/ab6b62bb--
1a8c-45eb-96b1-1fbc535b9265 disk=/dev/sda  USE_BY_UUID_DEVICE_NAMES=1 earlyprinttk=ttyS0 console=ttyS0 rootdelay=300  showopts vga=0x314

此配置将启用消息 按任意键以在 控制台上继续显示 5 秒

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

追加命令 init=/bin/bash 将加载内核,但可确保将 init 程序替换为 Bash Shell。

无需输入密码即可访问命令行管理程序。 然后可以继续更新 Linux 帐户的密码或进行其他配置更改。

将内核强制到 Bash 提示符

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

Screenshot shows a console with the updated boot line.

使用 命令 (/) RW 的根数据库

mount -o remount,rw /

Screenshot shows a console with a re-mount action.

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

Screenshot shows a console where you can change root password and other configuration.

使用 重启 VM

/sbin/reboot -f

单用户模式

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

若要详细了解如何访问单个用户模式,请参阅 此文档

single_user_ubuntu

后续步骤

详细了解 Azure 串行控制台