使用 Azure CLI 将 OS 磁盘附加到恢复 VM,对 Linux VM 进行故障排除

如果 Linux 虚拟机 (VM) 遇到启动或磁盘错误,则可能需要对虚拟硬盘本身执行故障排除步骤。 一个常见示例是 中的 /etc/fstab 无效条目,导致 VM 无法成功启动。 本文详细介绍了如何使用 Azure CLI 将虚拟硬盘连接到另一个 Linux VM 以修复任何错误,然后重新创建原始 VM。

恢复过程概述

故障排除过程如下:

  1. 停止受影响的 VM。
  2. 从 VM 的 OS 磁盘获取快照。
  3. 从 OS 磁盘快照创建磁盘。
  4. 将新的 OS 磁盘附加并装载到另一个 Linux VM,以便进行故障排除。
  5. 连接到故障排除 VM。 编辑文件或运行任何工具来修复新 OS 磁盘上的问题。
  6. 从故障排除 VM 卸载并分离新 OS 磁盘。
  7. 更改受影响 VM 的 OS 磁盘。

若要执行这些故障排除步骤,需要使用 az login 安装最新的 Azure CLI 并登录到 Azure 帐户。

可以使用 VM 修复命令自动执行步骤 1、2、3、4、6 和 7。 有关更多文档和说明,请参阅 使用 Azure 虚拟机修复命令修复 Linux VM

重要

本文中的脚本仅适用于使用 托管磁盘的 VM。

在以下示例中,将参数名称替换为自己的值,例如 myResourceGroupmyVM

确定启动问题

检查串行输出以确定 VM 无法正确启动的原因。 常见示例是 中的 /etc/fstab无效条目或正在删除或移动的基础虚拟硬盘。

使用 az vm boot-诊断 get-boot-log 获取启动日志。 以下示例从名为 的资源组myResourceGroup中名为 myVM 的 VM 获取串行输出:

az vm boot-diagnostics get-boot-log --resource-group myResourceGroup --name myVM

查看串行输出以确定 VM 无法启动的原因。 如果串行输出未提供任何指示,则可能需要在将虚拟硬盘连接到故障排除 VM 后查看中的 /var/log 日志文件。

停止 VM

以下示例从名为 的 myVM 资源组中停止名为 的 myResourceGroupVM:

az vm stop --resource-group MyResourceGroup --name MyVm

从受影响 VM 的 OS 磁盘获取快照

快照是 VHD 的完整只读副本。 无法将其附加到 VM。 在下一步中,我们将从此快照创建磁盘。 以下示例从名为“myVM”的 VM 的 OS 磁盘创建mySnapshot名为“myVM”的快照。

#Get the OS disk Id 
$osdiskid=(az vm show -g myResourceGroup -n myVM --query "storageProfile.osDisk.managedDisk.id" -o tsv)

#creates a snapshot of the disk
az snapshot create --resource-group myResourceGroupDisk --source "$osdiskid" --name mySnapshot

从快照创建磁盘

此脚本使用名为 myOSDisk 的快照创建一个托管mySnapshot磁盘。

#Provide the name of your resource group
$resourceGroup="myResourceGroup"

#Provide the name of the snapshot that will be used to create Managed Disks
$snapshot="mySnapshot"

#Provide the name of the Managed Disk
$osDisk="myNewOSDisk"

#Provide the size of the disks in GB. It should be greater than the VHD file size.
$diskSize=128

#Provide the storage type for Managed Disk. Premium_LRS or Standard_LRS.
$storageType="Premium_LRS"

#Provide the OS type
$osType="linux"

#Get the snapshot Id 
$snapshotId=(az snapshot show --name $snapshot --resource-group $resourceGroup --query id -o tsv)

# Create a new Managed Disks using the snapshot Id.

az disk create --resource-group $resourceGroup --name $osDisk --sku $storageType --size-gb $diskSize --source $snapshotId

如果资源组和源快照不在同一区域中,则运行 az disk create时将收到“找不到资源”错误。 在这种情况下,必须指定--location <region>将磁盘创建到与源快照相同的区域中。

现在,你已拥有原始 OS 磁盘的副本。 可以将此新磁盘装载到另一个 Windows VM 以进行故障排除。

将新的虚拟硬盘附加到另一个 VM

在接下来的几个步骤中,请使用另一个 VM 进行故障排除。 将磁盘附加到此故障排除 VM 以浏览和编辑磁盘的内容。 此过程允许更正任何配置错误或查看其他应用程序或系统日志文件。

此脚本将磁盘 myNewOSDisk 附加到 VM MyTroubleshootVM

# Get ID of the OS disk that you just created.
$myNewOSDiskid=(az disk show -g $resourceGroup -n $osDisk --query id -o tsv)

# Attach the disk to the troubleshooting VM
az vm disk attach --disk $myNewOSDiskid --resource-group $resourceGroup --size-gb $diskSize --sku $storageType --vm-name MyTroubleshootVM

装载附加的数据磁盘

注意

以下示例详细介绍了 Ubuntu VM 上所需的步骤。 如果使用的是其他 Linux 发行版(例如 Red Hat Enterprise Linux 或 SUSE),日志文件位置和 mount 命令可能略有不同。 有关命令的相应更改,请参阅特定发行版的文档。

  1. 使用适当的凭据通过 SSH 连接到故障排除 VM。 如果此磁盘是附加到故障排除 VM 的第一个数据磁盘,则磁盘可能已连接到 /dev/sdc。 使用 dmesg 查看附加磁盘:

    dmesg | grep SCSI
    

    输出类似于以下示例:

    [    0.294784] SCSI subsystem initialized
    [    0.573458] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 252)
    [    7.110271] sd 2:0:0:0: [sda] Attached SCSI disk
    [    8.079653] sd 3:0:1:0: [sdb] Attached SCSI disk
    [ 1828.162306] sd 5:0:0:0: [sdc] Attached SCSI disk
    

    在前面的示例中,OS 磁盘位于 /dev/sda ,为每个 VM 提供的临时磁盘位于 /dev/sdb。 如果有多个数据磁盘,它们应位于 /dev/sdd/dev/sde等位置。

  2. 创建用于装载现有虚拟硬盘的目录。 以下示例创建一个名为 的 troubleshootingdisk目录:

    sudo mkdir /mnt/troubleshootingdisk
    
  3. 如果现有虚拟硬盘上有多个分区,请装载所需的分区。 以下示例在 装载第一个主分区 /dev/sdc1

    sudo mount /dev/sdc1 /mnt/troubleshootingdisk
    

    注意

    最佳做法是使用虚拟硬盘的通用唯一标识符 (UUID) 在 Azure 中的 VM 上装载数据磁盘。 对于此简短的故障排除方案,不需要使用 UUID 装载虚拟硬盘。 但是,在正常使用下,使用设备名称而不是 UUID 进行编辑 /etc/fstab 以装载虚拟硬盘可能会导致 VM 无法启动。

修复新 OS 磁盘上的问题

装载现有虚拟硬盘后,现在可以根据需要执行任何维护和故障排除步骤。 解决问题后,请继续执行以下步骤。

卸载和分离新的 OS 磁盘

解决错误后,从故障排除 VM 卸载现有虚拟硬盘并将其分离。 在解除将虚拟硬盘附加到故障排除 VM 的租约之前,不能将虚拟硬盘与任何其他 VM 一起使用。

  1. 从 SSH 会话到故障排除 VM,卸载现有虚拟硬盘。 首先更改装载点的父目录:

    cd /
    

    现在卸载现有虚拟硬盘。 以下示例在 中卸载设备 /dev/sdc1

    sudo umount /dev/sdc1
    
  2. 现在,从 VM 分离虚拟硬盘。 退出到故障排除 VM 的 SSH 会话:

    az vm disk detach -g MyResourceGroup --vm-name MyTroubleShootVm --name myNewOSDisk
    

更改受影响 VM 的 OS 磁盘

可以使用 Azure CLI 交换 OS 磁盘。 无需删除并重新创建 VM。

此示例停止名为 myVM 的 VM,并将名为 myNewOSDisk 的磁盘分配为新的 OS 磁盘。

# Stop the affected VM
az vm stop -n myVM -g myResourceGroup

# Get ID of the OS disk that is repaired.
$myNewOSDiskid=(az disk show -g $resourceGroup -n $osDisk --query id -o tsv)

# Change the OS disk of the affected VM to "myNewOSDisk"
az vm update -g myResourceGroup -n myVM --os-disk $myNewOSDiskid

# Start the VM
az vm start -n myVM -g myResourceGroup

后续步骤

如果在连接到 VM 时遇到问题,请参阅 排查与 Azure VM 的 SSH 连接问题。 有关访问 VM 上运行的应用程序的问题,请参阅 排查 Linux VM 上的应用程序连接问题

联系我们寻求帮助

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