修复无法访问的虚拟机


如果您的 Linux 虚拟机因任何原因而无法访问,您可以尝试按照以下步骤修复虚拟机。

所需的角色

如需获得修复虚拟机所需的权限,请让管理员向您授予项目的以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

这些预定义角色包含修复虚拟机所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

修复虚拟机需要以下权限:

  • 项目的 compute.instances.create 权限
  • 项目的 compute.disks.create 权限
  • 项目的 compute.instances.get 权限
  • 磁盘的 compute.disks.createSnapshot 权限
  • 新虚拟机的 compute.instances.attachDisk 权限
  • 磁盘的 compute.disks.use 权限
  • 无法访问的新虚拟机的 compute.instances.start 权限
  • 无法访问的新虚拟机的 compute.instances.stop 权限

您也可以使用自定义角色或其他预定义角色来获取这些权限。

修复虚拟机

如果您无法连接到虚拟机,或者启动磁盘已满,则必须创建临时虚拟机来修复无法访问的虚拟机。

  1. (可选)停止无法访问的虚拟机。
  2. 通过无法访问的虚拟机的启动磁盘创建快照。如果根文件系统分布在多个磁盘上,您必须为每个磁盘创建快照。
  3. 使用与无法访问的虚拟机的操作系统最接近的公共映像创建临时虚拟机。在某些情况下,可信映像政策可能会限制您使用公开映像创建启动磁盘。在这种情况下,您必须先让管理员暂时解除此限制,然后才能创建救援虚拟机。如需了解详情,请参阅设置映像访问权限限制
  4. 对于您之前创建的无法访问的虚拟机的启动磁盘的每个快照,请按照以下步骤从快照创建一个新磁盘,并将其附加到救援虚拟机:

    1. 在 Google Cloud 控制台中,前往虚拟机实例页面。

      转到虚拟机实例

    2. 点击您创建的临时虚拟机名称。

    3. 点击 修改

    4. 额外磁盘下,点击添加新磁盘,然后执行以下操作:

      1. 添加磁盘名称,例如 my-recovery-disk
      2. 对于来源类型,选择快照标签页。
      3. 来源快照下拉菜单中,选择您之前在以下步骤中创建的来源虚拟机的快照。
      4. 点击完成
    5. 点击保存

  5. 使用 SSH 连接到临时虚拟机

  6. 运行以下命令,找出之前挂接到虚拟机的每个磁盘的名称:

    lsblk -d -o NAME,SERIAL

    输出类似于以下内容:

     NAME SERIAL
     sda  rescue-vm
     sdb  my-recovery-disk
     

    在此示例中,rescue-vm 是救援虚拟机的启动磁盘,my-recovery-disk 是无法访问的虚拟机的快照中的启动磁盘。记下无法访问的虚拟机的 NAME,以便在下一步中使用。

  7. 对于您之前挂接到虚拟机的每个磁盘,请执行以下操作:

    1. 运行以下命令可识别每个分区的文件系统:

      fdisk -l /dev/NAME -o Device,Size,Type
      

      NAME 替换为上一步中无法访问的虚拟机的启动磁盘的名称。在此示例中,该名称为 sdb

      输出类似于以下内容:

      Disk /dev/sdb: 10 GiB, 10737418240 bytes, 20971520 sectors
      Disk model: PersistentDisk
      Units: sectors of 1 * 512 = 512 bytes
      Sector size (logical/physical): 512 bytes / 4096 bytes
      I/O size (minimum/optimal): 4096 bytes / 4096 bytes
      Disklabel type: gpt
      Disk identifier: B31430F1-F041-4555-96B9-B2F43DC057AD
      
      Device     Size Type
      /dev/sdb1    2M BIOS boot
      /dev/sdb2   20M EFI System
      /dev/sdb3   10G Linux filesystem
      

      Type 列列出了每个分区的文件系统。如果任何分区都缺少文件系统类型,请运行以下命令:

      file -sL /dev/PARTITION_NAME
      

      NAME 替换为分区的名称。

      输出因文件系统类型而异:

      • 无文件系统:如果输出仅显示 data,则表示分区不包含文件系统。输出示例:

        /dev/sdb1: data
        
      • EFI 文件系统:如果输出描述的是 DOS/MBR 引导扇区,则分区使用的是 EFI 文件系统。输出示例:

        dev/sdb2: DOS/MBR boot sector, code offset 0x3c+2, OEM-ID "mkfs.fat", sectors/cluster 4, reserved sectors
        4, root entries 512, sectors 40960 (volumes <=32 MB), Media descriptor 0xf8, sectors/FAT 40, sectors/
        track 32, heads 64, serial number 0xf2af2664, label: "EFI        ", FAT (16 bit)
        
      • Linux 文件系统:如果输出描述的是文件系统数据,则分区是 Linux 文件系统。输出示例:

        /dev/sdb3: SGI XFS filesystem data (blksz 4096, inosz 512, v2 dirs)
        

      记下 Linux 文件系统的分区名称。

    2. /rescue 处创建装载点:

      sudo mkdir /rescue
    3. 将 Linux 文件系统分区装载到 /rescue

      sudo mount PARTITION_NAME /rescue
      

      PARTITION_NAME 替换为您之前记下的 Linux 文件系统的名称。

    4. 如果您想使用 chroot 命令修改文件系统的根目录,则还必须通过运行以下命令来装载虚拟文件系统和设备:

      sudo mount -t proc /proc /rescue/proc
      sudo mount -t sysfs /sys /rescue/sys
      sudo mount -o bind /dev /rescue/dev
      sudo mount -o bind /dev/pts /rescue/dev/pts
      sudo mount -o bind /run /rescue/run
      

    无法访问的启动磁盘的文件系统现已装载在 /rescue。您可以浏览文件系统、更改配置文件、解决问题或检索数据。

还原更改并重新启动无法访问的虚拟机

解决问题或检索数据后,您需要恢复实际虚拟机。请按照以下步骤恢复原始虚拟机:

  1. 卸载临时虚拟机中安装在 /rescue 上的其他磁盘:

     cd ~
     sudo umount /rescue

  2. 在 Google Cloud 控制台中,前往虚拟机实例页面。

    转到虚拟机实例

    1. 选择您创建的临时虚拟机。

    2. 点击修改

    3. 额外磁盘下,点击之前步骤中所创建磁盘的 ,以将额外磁盘与临时虚拟机分离。

    4. 点击保存

  3. 前往 Google Cloud 控制台中的虚拟机实例页面。

    转到虚拟机实例

    1. 如果无法访问的虚拟机仍在运行,请停止虚拟机

    2. 点击您刚刚停止的虚拟机名称,然后点击 修改

    3. 启动磁盘下,点击 分离启动磁盘,以将现有启动磁盘与无法访问的虚拟机分离。

    4. 接下来,点击 配置启动磁盘,以挂接您之前在本页面的修复虚拟机中创建和修复的磁盘。

      1. 启动磁盘部分中,点击现有磁盘标签页。
      2. 在下拉列表中,选择您在上一部分中创建的磁盘,例如 my-recovery-disk
      3. 点击选择,然后点击保存
    5. 启动虚拟机

  4. 现在,您应该可以使用 SSH 连接到虚拟机