如果您的 Linux 虚拟机因任何原因而无法访问,您可以尝试按照以下步骤修复虚拟机。
所需的角色
如需获得修复虚拟机所需的权限,请让管理员向您授予项目的以下 IAM 角色:
-
Compute Instance Admin (v1) (
roles/compute.instanceAdmin.v1
) -
使用服务账号的虚拟机:
服务账号用户 (
roles/iam.serviceAccountUser
)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
这些预定义角色包含修复虚拟机所需的权限。如需查看所需的确切权限,请展开所需权限部分:
所需权限
修复虚拟机需要以下权限:
- 项目的
compute.instances.create
权限 - 项目的
compute.disks.create
权限 - 项目的
compute.instances.get
权限 - 磁盘的
compute.disks.createSnapshot
权限 - 新虚拟机的
compute.instances.attachDisk
权限 - 磁盘的
compute.disks.use
权限 - 无法访问的新虚拟机的
compute.instances.start
权限 - 无法访问的新虚拟机的
compute.instances.stop
权限
修复虚拟机
如果您无法连接到虚拟机,或者启动磁盘已满,则必须创建临时虚拟机来修复无法访问的虚拟机。
- (可选)停止无法访问的虚拟机。
- 通过无法访问的虚拟机的启动磁盘创建快照。如果根文件系统分布在多个磁盘上,您必须为每个磁盘创建快照。
- 使用与无法访问的虚拟机的操作系统最接近的公共映像创建临时虚拟机。在某些情况下,可信映像政策可能会限制您使用公开映像创建启动磁盘。在这种情况下,您必须先让管理员暂时解除此限制,然后才能创建救援虚拟机。如需了解详情,请参阅设置映像访问权限限制。
对于您之前创建的无法访问的虚拟机的启动磁盘的每个快照,请按照以下步骤从快照创建一个新磁盘,并将其附加到救援虚拟机:
在 Google Cloud 控制台中,前往虚拟机实例页面。
点击您创建的临时虚拟机名称。
点击
修改。在额外磁盘下,点击
添加新磁盘,然后执行以下操作:- 添加磁盘名称,例如 my-recovery-disk
- 对于来源类型,选择快照标签页。
- 在来源快照下拉菜单中,选择您之前在以下步骤中创建的来源虚拟机的快照。
- 点击完成。
点击保存。
使用 SSH 连接到临时虚拟机。
运行以下命令,找出之前挂接到虚拟机的每个磁盘的名称:
lsblk -d -o NAME,SERIAL
输出类似于以下内容:
NAME SERIAL sda rescue-vm sdb my-recovery-disk
在此示例中,
rescue-vm
是救援虚拟机的启动磁盘,my-recovery-disk
是无法访问的虚拟机的快照中的启动磁盘。记下无法访问的虚拟机的NAME
,以便在下一步中使用。对于您之前挂接到虚拟机的每个磁盘,请执行以下操作:
运行以下命令可识别每个分区的文件系统:
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 文件系统的分区名称。
在
/rescue
处创建装载点:sudo mkdir /rescue
将 Linux 文件系统分区装载到
/rescue
:sudo mount PARTITION_NAME /rescue
将 PARTITION_NAME 替换为您之前记下的 Linux 文件系统的名称。
如果您想使用
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
。您可以浏览文件系统、更改配置文件、解决问题或检索数据。
还原更改并重新启动无法访问的虚拟机
解决问题或检索数据后,您需要恢复实际虚拟机。请按照以下步骤恢复原始虚拟机:
卸载临时虚拟机中安装在
/rescue
上的其他磁盘:cd ~ sudo umount /rescue
在 Google Cloud 控制台中,前往虚拟机实例页面。
选择您创建的临时虚拟机。
点击
修改。在额外磁盘下,点击之前步骤中所创建磁盘的
,以将额外磁盘与临时虚拟机分离。点击保存。
前往 Google Cloud 控制台中的虚拟机实例页面。
现在,您应该可以使用 SSH 连接到虚拟机。