当无法访问 Azure 串行控制台且磁盘布局使用 LVM 或逻辑卷管理器 (Linux VM 疑难解答)
11/24/2019
本文内容
此疑难解答指南对于 Linux VM 未启动、无法启动 ssh 以及使用 LVM (Logical Volume Manager) 配置的方案十分受益。
拍摄故障 VM 的快照
拍摄受影响虚拟机的快照。
然后,快照将附加到一个 启动的 VM。 请按照 此处有关如何 拍摄快照 的说明操作。
创建一个管理虚拟机
通常建议使用相同或类似操作系统版本的虚拟机。 使用受影响的 VM 的同 一区域和资源组
连接到虚拟机
使用 ssh 连接到 虚拟机。 提升特权并成为超级用户使用
sudo su -
附加磁盘
将磁盘附加到 从之前拍摄 快照创建的虚拟机。
Azure 门户 ->选择 虚拟机 -> 磁盘
填充字段。 为新磁盘分配名称,选择与快照、受影响的 VM 和安装虚拟机相同的资源组。
源 类型为****快照。
Source 快照 是以前创建的 快照 的名称。
为附加磁盘创建装入点。
mkdir /rescue
运行 fdisk -l 命令以验证快照磁盘已连接,并列出所有可用的设备和分区
fdisk -l
在大多数情况下,附加快照磁盘将视为显示两个分区 /dev/sdc1 和 /dev/sdc2 的 /dev/sdc
* 指示启动分区,两个分区均要装入。
运行命令 lsblk 以查看受影响 VM 的 LVM
lsblk
验证是否显示来自受影响 VM 的 LVM。
如果没有,请使用以下命令启用它们,然后重新运行 lsblk。
请确保附加磁盘中的 LVM 可见,然后再继续。
vgscan --mknodes
vgchange -ay
lvscan
mount –a
lsblk
找到装载逻辑卷的路径,该逻辑卷包含 / (根) 分区。 它具有配置文件,如 /etc/default/grub
本示例中,从上一 个 lsblk 命令 rootvg-rootlv 获得的输出是要装载的正确根 LV, 可用于下一个命令。
下一个命令的输出将显示为根 LV 装载的路径
pvdisplay -m | grep -i rootlv
继续将此设备装载到目录 /更新
mount /dev/rootvg/rootlv /rescue
装载在 /一次启动/启动上设置了 启动 标志的分区
mount /dev/sdc1 /rescue/boot
使用 lsblk 命令验证已附加磁盘的文件系统现已正确装入
或 df -Th 命令
获取 chroot 访问权限
获取 chroot 访问权限,这将使您能够执行各种修复,每个 Linux 分发都存在细微的变体。
cd /rescue
mount -t proc proc proc
mount -t sysfs sys sys/
mount -o bind /dev dev/
mount -o bind /dev/pts dev/pts/
chroot /rescue
如果遇到错误,例如:
chroot:无法运行命令"/bin/bash":无此类文件或目录
尝试装载 usr 逻辑卷
mount /dev/mapper/rootvg-usrlv /rescue/usr
提示
在 chroot 环境中执行命令时,请注意,这些命令针对附加的操作系统磁盘而不是 本地虚拟机运行 。
命令可用于安装、删除和更新软件。 对 VM 进行故障排除以修复错误。
执行 lsblk 命令,此时 /时/或 /时为 /时/boot 为 /boot
执行修复
示例 1 - 将 VM 配置为从不同的内核启动
一种常见方案是强制 VM 从以前的内核启动,因为当前安装的内核可能已损坏或升级未正确完成。
cd /boot/grub2
grep -i linux grub.cfg
grub2-editenv list
grub2-set-default "CentOS Linux (3.10.0-1062.1.1.el7.x86_64) 7 (Core)"
grub2-editenv list
grub2-mkconfig -o /boot/grub2/grub.cfg
walkthrough
the grep command lists the kernels that grub.cfg is aware of.
grub2-editenv 列表 显示在下次启动内核默认值时将加载
grub2-set-default 用于更改为其他内核
grub2-editenv 列表显示哪个内核将在下次启动新内核
grub2-mkconfig 使用所需的
示例 2 - 升级包
失败的内核升级会导致虚拟机不可启动。
装载所有逻辑卷以允许删除或重新安装程序包
运行 lvs 命令来验证哪些 LV 可供装载,每个 VM(已迁移或来自其他云提供商)的配置将有所不同。
退出 chroot 环境,装载所需的 LV
现在通过运行 再次访问 chroot 环境
chroot /rescue
所有 LV 都应作为已装载的分区可见
查询已安装 的内核
如果需要,请删除或升级 内核
示例 3 - 启用串行控制台
如果无法访问 Azure 串行控制台,请验证 Linux VM 的 GRUB 配置参数并更正这些参数。 可在此文档 找到详细信息
示例 4 - 使用有问题的 LVM 交换卷加载内核
VM 可能无法完全启动并进入 dracut 提示符。
可以从 Azure 串行控制台找到故障的更多详细信息,也可以导航到 Azure 门户 ->启动诊断 ->串行日志
可能出现错误,类似于此错误:
[ 188.000765] dracut-initqueue[324]: Warning: /dev/VG/SwapVol does not exist
Starting Dracut Emergency Shell...
Warning: /dev/VG/SwapVol does not exist
此示例中配置 grub.cfg 以加载名称为 rd.lvm.lv=VG/SwapVol 的 LV,并且 VM 无法找到它。 此行显示如何加载引用 LV SwapVol 的内核
[ 0.000000] Command line: BOOT_IMAGE=/vmlinuz-3.10.0-1062.4.1.el7.x86_64 root=/dev/mapper/VG-OSVol ro console=tty0 console=ttyS0 earlyprintk=ttyS0 net.ifnames=0 biosdevname=0 crashkernel=256M rd.lvm.lv=VG/OSVol rd.lvm.lv=VG/SwapVol nodmraid rhgb quiet
[ 0.000000] e820: BIOS-provided physical RAM map:
从 /etc/default/grub 配置中删除有问题的 LV 并重新生成 grub2.cfg
退出 chroot 并交换操作系统磁盘
修复问题后,继续卸载磁盘,然后从允许其与受影响的 VM 操作系统磁盘进行交换的故障 VM 分离磁盘。
exit
cd /
umount /rescue/proc/
umount /rescue/sys/
umount /rescue/dev/pts
umount /rescue/dev/
umount /rescue/boot
umount /rescue
从虚拟机分离磁盘并执行磁盘交换。
从门户磁盘中选择 VM, 然后选择 分离
保存更改 保存
磁盘现在将变为可用状态,允许其与受影响的 VM 的原始操作系统磁盘进行交换。
在 Azure 门户中导航到出现故障的 VM,然后选择 磁盘 -> 交换操作系统
完成" 选择磁盘 "是上一步中刚刚分离的快照磁盘的字段。 还需要受影响虚拟机的 VM 名称,然后选择"确定 "
如果 VM 正在运行,则磁盘交换将关闭它,在磁盘交换操作完成后重新启动 VM。
后续步骤
详细了解