修复无法访问的虚拟机


如果您的 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. 检查您是否能够使用 SSH 连接到临时虚拟机
  5. 按照以下步骤将额外磁盘添加到临时虚拟机:

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

      转到虚拟机实例

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

    3. 点击 修改

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

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

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

  7. 执行以下命令:

    ls -l /dev/disk/by-id/google-*

    输出将如下所示:

      /dev/disk/by-id/google-my-vm -> ../../sda
      /dev/disk/by-id/google-my-vm-part1 -> ../../sda1
      /dev/disk/by-id/google-my-vm-part14 -> ../../sda14
      /dev/disk/by-id/google-my-vm-part15 -> ../../sda15
      /dev/disk/by-id/google-my-recovery-disk -> ../../sdb
      /dev/disk/by-id/google-my-recovery-disk-part1 -> ../../sdb1
      /dev/disk/by-id/google-my-recovery-disk-part2 -> ../../sdb2
      /dev/disk/by-id/google-my-recovery-disk-part5 -> ../../sdb5
    

    使用符号链接 (/dev/disk/by-id/google-my-recovery-disk-partN) 查找新添加磁盘的底层设备和分区,例如 /dev/sdb1

    磁盘的符号链接是 google-DISK_NAME,或者如果为磁盘指定了自定义设备名称,则为 google-DEVICE_NAME,请记下新磁盘符号链接指向的设备名称。

  8. /mnt/newdisk 处创建装载点:

    sudo mkdir /mnt/newdisk

  9. 将额外的磁盘分区装载到装载点 /mnt/newdisk

     sudo mount -o discard,defaults DISK_NAME /mnt/newdisk

    DISK_NAME 替换为您在上述步骤中记下的设备名称,例如 /dev/sdb1

    如果您看到错误 Filesystem has duplicate UUID XXXXXX - can't mountmount: /mnt/newdisk: wrong fs type, bad optionbad superblock on /dev/sdb,请使用以下命令:

     sudo mount -o nouuid DISK_NAME /mnt/newdisk

    无法访问的虚拟机文件系统现已装载到 /mnt/newdisk。您可以浏览文件系统、更改配置文件、解决问题或检索数据。

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

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

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

     cd ~
     sudo umount /mnt/newdisk

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

    转到虚拟机实例

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

    2. 点击修改

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

    4. 点击保存

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

    转到虚拟机实例

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

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

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

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

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

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