常规问题排查

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

排查实例的常规问题

如果实例未启动

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

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

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

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

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

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

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

    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

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

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

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

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

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

如需了解详情,请参阅虚拟私有云文档中的问题排查信息:

排查 SSH 的问题

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

检查防火墙规则

Google Compute Engine 为每个项目配置了一组允许 SSH 流量的默认防火墙规则。如果允许 SSH 连接的默认防火墙规则以某种方式被移除,您将无法访问您的实例。请使用 gcloud compute 命令行工具来检查您的防火墙列表并确保存在 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. 运行 gcloud compute instances delete 并添加 --keep-disks 标志。

    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 脚本来收集最常见问题的诊断信息。

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Compute Engine 文档