常规问题排查

本页面介绍了在使用 Compute Engine 实例时遇到问题的情况下可能会有帮助的问题排查步骤。

排查实例的常规问题

如果实例未启动

以下提示有助于在永久性启动磁盘无法启动时排查其问题。

  • 您的启动磁盘已满。如果您的启动磁盘已满,并且您的操作系统不支持自动调整大小,您将无法通过 SSH 连接到您的实例。您必须创建新实例并重新创建启动磁盘。请参阅恢复无法访问的实例或存储空间已满的启动磁盘

  • 检查虚拟机实例的串行端口输出。

    实例的 BIOS、引导加载程序和内核会将其调试消息输出到实例的串行端口输出,从而提供有关实例遇到的任何错误或问题的宝贵信息。如果您启用将串行端口输出记录到 Cloud Logging 的功能,则即使实例未运行,您也可以访问此信息。请参阅查看串行端口输出

  • 启用对串行控制台的交互式访问。

    您可以启用对实例串行控制台的交互式访问,以便从实例内部登录并调试启动问题,而无需完全启动实例。如需了解详情,请参阅与串行控制台交互

  • 验证您的磁盘是否具有有效的文件系统。

    如果您的文件系统已损坏或者无效,您将无法启动您的实例。要验证您的磁盘的文件系统,请执行以下步骤:

    1. 如果适用,请将相关磁盘从其挂接的任何实例中分离:

      gcloud compute instances delete old-instance --keep-disks boot
      
    2. 启动一个使用 Google 提供的最新映像的新实例:

      gcloud compute instances create debug-instance
      
    3. 将您的磁盘作为非启动磁盘来挂接,但不装载该磁盘。将 DISK 替换为将不启动的磁盘的名称。请注意,我们还提供了设备名称,以便在实例上轻松识别相应磁盘:

      gcloud compute instances attach-disk debug-instance --disk DISK --device-name debug-disk
      
    4. 连接到实例:

      gcloud compute ssh debug-instance
      
    5. 查找磁盘的根分区,此分区以 part1 表示法标识。在本示例中,磁盘的根分区位于 /dev/sdb1

      user@debug-instance:~$ ls -l /dev/disk/by-id
      total 0
      lrwxrwxrwx 1 root root  9 Jan 22 17:09 google-debug-disk -> ../../sdb
      lrwxrwxrwx 1 root root 10 Jan 22 17:09 google-debug-disk-part1 -> ../../sdb1
      lrwxrwxrwx 1 root root  9 Jan 22 17:02 google-persistent-disk-0 -> ../../sda
      lrwxrwxrwx 1 root root 10 Jan 22 17:02 google-persistent-disk-0-part1 -> ../../sda1
      lrwxrwxrwx 1 root root  9 Jan 22 17:09 scsi-0Google_PersistentDisk_debug-disk -> ../../sdb
      lrwxrwxrwx 1 root root 10 Jan 22 17:09 scsi-0Google_PersistentDisk_debug-disk-part1 -> ../../sdb1
      lrwxrwxrwx 1 root root  9 Jan 22 17:02 scsi-0Google_PersistentDisk_persistent-disk-0 -> ../../sda
      lrwxrwxrwx 1 root root 10 Jan 22 17:02 scsi-0Google_PersistentDisk_persistent-disk-0-part1 -> ../../sda1
      
    6. 在根分区上运行文件系统检查:

      user@debug-instance:~$ sudo fsck /dev/sdb1
      fsck from util-linux 2.20.1
      e2fsck 1.42.5 (29-Jul-2012)
      /dev/sdb1: clean, 19829/655360 files, 208111/2621184 blocks
      
    7. 装载文件系统:

      user@debug-instance:~$ sudo mkdir /mydisk
      
      user@debug-instance:~$ sudo mount /dev/sdb1 /mydisk
      
    8. 检查磁盘是否具有内核文件:

      user@debug-instance~:$ ls /mydisk/boot/vmlinuz-*
      /mydisk/boot/vmlinuz-3.2.0-4-amd64
      
  • 验证磁盘是否具有有效的主启动记录 (MBR)

    在挂接了永久性启动磁盘(例如 /dev/sdb)的调试实例上运行以下命令:

    $ sudo parted /dev/sdb print
    

    如果您的 MBR 有效,应该会列出有关文件系统的信息:

    Disk /dev/sdb: 10.7GB
    Sector size (logical/physical): 512B/4096B
    Partition Table: msdos
    Disk Flags:
    
    Number  Start   End     Size    Type     File system  Flags
     1      2097kB  10.7GB  10.7GB  primary  ext4         boot
    

如果无法创建实例

以下提示可帮您排查有关实例未创建的问题。

  • 同时进行多项资源更改或创建操作可能会导致错误。 例如,如果您要修改子网中的次要范围并同时创建虚拟机,则可能会看到以下错误消息:The resource 'projects/[PROJECT]/regions/[REGION]/subnetworks/default' is not ready。解决方法是重试失败的操作。

  • 如果您在请求新资源时收到资源错误(如 ZONE_RESOURCE_POOL_EXHAUSTEDZONE_RESOURCE_POOL_EXHAUSTED_WITH_DETAILS),则表示相应地区目前无法满足您的请求。该错误是由于相应地区中 Compute Engine 资源的可用性引起的,不是由于您的 Compute Engine 配额所导致的。

    以下提示有助于缓解这些问题:

    • 由于这种情况是暂时的,并且会根据需求的转变而经常变化,因此稍后请再次尝试发出请求。
    • 请尝试在同一区域内的其他地区或在其他区域创建资源。
    • 请尝试更改所请求虚拟机的形态。获取较小的机器类型比获取较大的机器类型更容易。如果对您的请求进行更改(例如减少 GPU 数量或者使用内存或 vCPU 较少的自定义虚拟机),则您的请求可能会继续得到处理。
    • 使用 Compute Engine 预留将资源预留在一个地区中,以确保您需要的资源随时可用。
    • 如果您尝试创建抢占式实例,请注意抢占式虚拟机是空闲容量,因此在需求高峰时段可能无法获取。
    • 如果您在请求新资源时收到 notFounddoes not exist in zone 错误,则表示相应地区不提供您所请求的资源或机器类型。如需了解每个地区中可用的功能,请参阅区域和地区

如果进入或传出实例的网络流量被丢弃

Compute Engine 只允许项目的防火墙规则明确允许的网络流量进入您的实例。默认情况下,所有项目都会自动提供一个默认网络,该网络允许建立特定类型的连接。默认情况下,如果您拒绝所有流量,则 SSH 连接和所有内部流量也会被拒绝。如需了解详情,请参阅防火墙规则页面。

此外,您可能需要调整 TCP keep-alive 设置以规避默认闲置连接超时时间(10 分钟)。如需了解详情,请参阅在实例和互联网之间通信

对实例上的防火墙规则或路由进行问题排查

Google Cloud Console 会提供实例的每个网络接口的网络详细信息。您可以查看适用于某个接口的所有防火墙规则或路由,也可以仅查看该接口使用的规则和路由。 这两种查看方式都可以帮助您对该实例适用以及实际使用的防火墙规则和路由进行问题排查(在优先级和处理顺序替换其他规则或路由的情况下)。

如需了解详情,请参阅 Virtual Private Cloud 文档中的问题排查信息:

排查 SSH 的问题

在某些情况下,Linux 实例可能会拒绝 SSH 连接。发生此情况的原因有多种,可能是磁盘已满,也可能是意外地对 sshd 进行了错误的配置。此部分介绍了多种排查和解决常见 SSH 问题的提示和方法。

检查防火墙规则

Compute Engine 为每个项目预配了一组允许 SSH 流量的默认防火墙规则。如果允许 SSH 连接的默认防火墙规则以某种方式被移除,您将无法访问您的实例。请使用 gcloud 命令行工具来检查您的防火墙列表并确保存在 default-allow-ssh 规则。

gcloud compute firewall-rules list

如果缺少该规则,请重新添加:

gcloud compute firewall-rules create default-allow-ssh --allow tcp:22

在串行控制台中调试问题

您可以启用对实例的串行控制台的读写访问权限,以便登录该控制台并对实例进行问题排查。如果您无法使用 SSH 登录或者实例没有连接到网络,这样做特别有用。在这两种情况下,串行控制台仍然可供访问。

如需了解如何启用交互式访问权限以及如何连接到实例的串行控制台,请参阅与串行控制台交互

测试网络

您可以使用 netcat 工具连接到端口 22 上的实例,并确定网络连接是否正常。如果您建立了连接并看到 SSH 标识(例如 SSH-2.0-OpenSSH_6.0p1 Debian-4),则表示您的网络连接正常,因此可以排除防火墙问题。首先,使用 gcloud 工具获取实例的外部 natIP

gcloud compute instances describe example-instance --format='get(networkInterfaces[0].accessConfigs[0].natIP)'
198.51.100.8

使用 nc 命令来连接到您的实例:

# Check for SSH banner
user@local:~$ nc [EXTERNAL_IP] 22
SSH-2.0-OpenSSH_6.0p1 Debian-4

尝试以新用户身份登录

导致您无法登录的问题可能仅限于您的帐号(例如,如果没有正确设置实例上 ~/.ssh/authorized_keys 文件的权限)。

尝试使用 gcloud 工具以新用户身份登录,使用 SSH 请求指定其他用户名。gcloud 工具将更新项目的元数据以添加新用户并允许进行 SSH 访问。

user@local:~$ gcloud compute ssh [USER]@example-instance

其中 [USER] 是用于登录的新用户名。

在新实例上使用磁盘

如果上述步骤不奏效,并且您感兴趣的实例从永久性磁盘启动,您可以分离永久性磁盘,然后将该要使用的磁盘挂接到新实例上。 将 DISK 替换为您的磁盘名称:

gcloud compute instances delete old-instance --keep-disks=boot
gcloud compute instances create new-instance --disk name=DISK boot=yes auto-delete=no
gcloud compute ssh new-instance

在不关停实例的情况下对其进行检查

您可能无法连接某个实例,但该实例可以继续正常处理生产流量。在这种情况下,您可能需要检查磁盘,而不中断为用户提供服务的实例。首先,截取实例启动磁盘的快照,然后基于该快照创建新磁盘,创建临时实例,最后将新的永久性磁盘挂接并装载到您的临时实例,以便对该磁盘进行问题排查。

  1. 创建新的 VPC 网络以托管您的克隆实例:

    gcloud compute networks create debug-network
    
  2. 添加防火墙规则以允许通过 SSH 连接到网络:

    gcloud compute firewall-rules create debug-network-allow-ssh --allow tcp:22
    
  3. 创建相关磁盘的快照,将 DISK 替换为磁盘名称:

    gcloud compute disks snapshot DISK --snapshot-name debug-disk-snapshot
    
  4. 使用您刚创建的快照创建新磁盘:

    gcloud compute disks create example-disk-debugging --source-snapshot debug-disk-snapshot
    
  5. 创建没有外部 IP 地址的新调试实例:

    gcloud compute instances create debugger --network debug-network --no-address
    
  6. 将调试磁盘挂接到实例:

    gcloud compute instances attach-disk debugger --disk example-disk-debugging
    
  7. 按照说明来连接到没有外部 IP 地址的实例

  8. 登录调试程序实例后,排查实例问题。 例如,您可以查看实例日志:

    $ sudo su -
    
    $ mkdir /mnt/myinstance
    
    $ mount /dev/disk/by-id/scsi-0Google_PersistentDisk_example-disk-debugging /mnt/myinstance
    
    $ cd /mnt/myinstance/var/log
    
    # Identify the issue preventing ssh from working
    $ ls
    

使用启动脚本

如果前面的建议均不起作用,您可以创建启动脚本,以在实例启动后立即收集信息。按照说明来运行启动脚本

之后,您需要通过运行 gcloud compute instances reset 重置您的实例,然后元数据才会生效。或者,您也可以使用诊断启动脚本来重新创建您的实例:

  1. 运行带有 --keep-disks 标志的 gcloud compute instances delete

    gcloud compute instances delete INSTANCE --keep-disks boot
    
  2. 添加挂接了同一磁盘的新实例并指定您的启动脚本。

    gcloud compute instances create example-instance --disk name=DISK,boot=yes --startup-script-url URL
    

首先,您可以使用 compute-ssh-diagnostic 脚本来收集最常见问题的诊断信息。