安装客机环境


本页面介绍如何为 Compute Engine 上运行的虚拟机实例手动安装访客环境

在大多数情况下,如果您使用的是通过 Google 提供的公共映像创建的虚拟机实例,则无需手动安装访客环境。

在手动安装访客环境之前,请先按照验证访客环境中所述的过程来检查您的实例是否已在运行访客环境。如果在您的实例上发现访客环境,但该环境已经过时,请更新该访客环境

否则,请查看何时手动安装访客环境部分,以确定您是否需要手动安装访客环境。

准备工作

    如果您要使用本指南中的 gcloud 命令行工具示例,请执行以下操作:
    1. 您可以安装本地工具或使用 Cloud Shell
    2. 设置默认属性
      • gcloud config set compute/zone [ZONE]
      • gcloud config set compute/region [REGION]
      • gcloud config set project [PROJECT]

目录

操作系统支持

以下操作系统支持手动安装客机环境:

  • Ubuntu 16.04 或更高版本
  • CentOS 6、7 和 8
  • SUSE Linux Enterprise Server (SLES) 12 SP4、12 SP5、15 SP1 或更高版本
  • Red Hat Enterprise Linux (RHEL) 6、7 和 8
  • Debian 9 和 10
  • Windows Server 1909、1903 和 1809
  • Windows Server 2019
  • Windows Server 2016
  • Windows Server 2012 R2
  • Windows Server 上的 SQL Server
  • Windows 自备许可:
    • Windows 7
    • Windows 8
    • Windows 10

Google 建议您使用导入工具安装访客环境。如需查看安装选项列表,请参阅安装方法

您无法为 CoreOS 和 Container-Optimized 操作系统手动安装客机环境。如果您需要这些操作系统之一,我们建议您使用公共映像,因为访客环境包含在所有公共映像中并且是核心部分。

安装访客环境

安装方法

您可以通过三种方式安装访客环境,请从下面选择一种:

就地安装客机环境

如果可以使用 SSH 连接到目标实例,请使用此方法安装访客环境。如果无法连接到该实例以安装访客环境,可以通过克隆相应的启动磁盘并使用启动脚本来安装访客环境

如果您可以使用基于 SSH 密码的身份验证进行连接,则此过程对导入的映像很实用。如果您至少有一个用户帐号可使用有效的基于密钥的 SSH,也可以使用此过程来重新安装客机环境。

CentOS/RHEL

  1. 确保您的操作系统版本受支持
  2. 确定 CentOS/RHEL 的版本,并创建源存储库文件 /etc/yum.repos.d/google-cloud.repo

    OS_RELEASE_FILE="/etc/redhat-release"
    if [ ! -f $OS_RELEASE_FILE ]; then
      OS_RELEASE_FILE="/etc/centos-release"
    fi
    DIST=$(cat $OS_RELEASE_FILE | grep -o '[0-9].*' | awk -F'.' '{print $1}')
    sudo tee /etc/yum.repos.d/google-cloud.repo << EOM
    [google-cloud-compute]
    name=Google Cloud Compute
    baseurl=https://packages.cloud.google.com/yum/repos/google-compute-engine-el${DIST}-x86_64-stable
    enabled=1
    gpgcheck=1
    repo_gpgcheck=1
    gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
          https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
    EOM
    
  3. 更新软件包列表:

    sudo yum makecache
    sudo yum updateinfo
    
  4. 安装访客环境软件包:

    sudo yum install -y google-compute-engine
    
  5. 重启实例检查其控制台日志,确认实例重启过程中会加载访客环境。

  6. 验证您可以通过 SSH 连接到实例

Debian

  1. 确保您的操作系统版本受支持
  2. 安装存储库 GPG 公钥:

    curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
  3. 确定 Debian 发行版的名称,并创建源列表文件 /etc/apt/sources.list.d/google-cloud.list

    DIST=$(cat /etc/os-release | grep "VERSION=" | sed "s/\"\|(\|)\|VERSION=//g" \
    | awk '{print tolower($NF)}')
    sudo tee /etc/apt/sources.list.d/google-cloud.list << EOM
    deb http://packages.cloud.google.com/apt google-compute-engine-${DIST}-stable main
    deb http://packages.cloud.google.com/apt google-cloud-packages-archive-keyring-${DIST} main
    EOM
    
  4. 更新软件包列表:

    sudo apt update
  5. 安装访客环境软件包:

    sudo apt install -y google-cloud-packages-archive-keyring
    sudo apt install -y google-compute-engine
    
  6. 重启实例检查其控制台日志,确认实例重启过程中会加载访客环境。

  7. 验证您可以通过 SSH 连接到实例

Ubuntu

  1. 确保您的操作系统版本受支持

  2. 启用 Universe 存储库。 Canonical 会将其访客环境软件包发布到 Universe 存储库。

    sudo apt-add-repository universe
  3. 更新软件包列表:

    sudo apt update
  4. 安装访客环境软件包:

    sudo apt install -y gce-compute-image-packages
    
  5. 重启实例检查其控制台日志,确认实例重启过程中会加载访客环境。

  6. 验证您可以通过 SSH 连接到实例

SLES

  1. 确保您的操作系统版本受支持

  2. 激活公有云模块

    product=$(sudo SUSEConnect --list-extensions | grep -o "sle-module-public-cloud.*")
    [[ -n "$product" ]] && sudo SUSEConnect -p "$product"
    
  3. 更新软件包列表:

    sudo zypper refresh
  4. 安装访客环境软件包:

    sudo zypper install -y google-compute-engine-{oslogin,init} rsyslog
    sudo systemctl enable /usr/lib/systemd/system/google-*
    
  5. 重启实例检查其控制台日志,确认实例重启过程中会加载访客环境。

  6. 验证您可以通过 SSH 连接到实例

Windows

在开始之前,请确保您的操作系统版本受支持

如需安装 Windows 客机环境,请在提升权限的 PowerShell 3.0 版或更高版本提示符下运行以下命令。以下说明中的 Invoke-WebRequest 命令要求 PowerShell 版本高于 3.0。

  1. 下载并安装 GooGet

    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12;
    Invoke-WebRequest https://github.com/google/googet/releases/download/v2.13.0/googet.exe -OutFile $env:temp\googet.exe;
    & "$env:temp\googet.exe" -root C:\ProgramData\GooGet -noconfirm install -sources `
    https://packages.cloud.google.com/yuck/repos/google-compute-engine-stable googet;
    Remove-Item "$env:temp\googet.exe"
    

    安装期间,GooGet 会将内容添加到系统环境中。安装完成后,启动新的 PowerShell 控制台或提供 googet.exe 文件的完整路径 (C:\ProgramData\GooGet\googet.exe)。

  2. 打开新控制台并添加 google-compute-engine-stable 存储库。

    googet addrepo google-compute-engine-stable https://packages.cloud.google.com/yuck/repos/google-compute-engine-stable
  3. 安装核心 Windows 访客环境软件包。

    googet -noconfirm install google-compute-engine-windows `
    google-compute-engine-sysprep google-compute-engine-metadata-scripts `
    google-compute-engine-vss
    
  4. 安装可选的 Windows 访客环境软件包。

    googet -noconfirm install google-compute-engine-auto-updater

    使用 googet 命令

    要查看可用软件包,请运行 googet available 命令。

    要查看已安装的软件包,请运行 googet installed 命令。

    要更新为最新的软件包版本,请运行 googet update 命令。

    要查看其他命令,请运行 googet help

克隆启动磁盘并使用启动脚本

如果您无法连接到实例以手动安装客机环境,请使用此过程安装客机环境,此过程包括可在 Google Cloud Console 和 Cloud Shell 中完成的以下步骤。

此方法仅显示适用于 Linux 发行版的过程。对于 Windows,请使用其他两种安装方法之一。

使用 Cloud Shell 执行此过程:

CentOS/RHEL

  1. 确保您的操作系统版本受支持

  2. 创建一个新实例作为救援实例。将此实例命名为 rescue。此救援实例不需要运行与有问题的实例相同的 Linux 操作系统。此示例在救援实例上使用 Debian 9。

  3. 停止有问题的实例并创建其启动磁盘的副本。

    1. 为有问题的实例设置一个变量名称。这样会更便于在后续步骤中引用该实例。

      export PROB_INSTANCE_NAME=VM_NAME

      VM_NAME 替换为有问题的实例的名称。

    2. 停止有问题的实例。

      gcloud compute instances stop "$PROB_INSTANCE_NAME"
    3. 获取有问题的实例的启动磁盘名称。

      export PROB_INSTANCE_DISK="$(gcloud compute instances describe \
      "$PROB_INSTANCE_NAME" --format='json' |  jq -r \
      '.disks[] | select(.boot == true) | .source')"
      
    4. 创建启动磁盘的快照。

      export DISK_SNAPSHOT="${PROB_INSTANCE_NAME}-snapshot"
      
      gcloud compute disks snapshot "$PROB_INSTANCE_DISK" \
         --snapshot-names "$DISK_SNAPSHOT"
      
    5. 根据该快照创建一个新的磁盘。

      export NEW_DISK="${PROB_INSTANCE_NAME}-new-disk"
      
      gcloud compute disks create "$NEW_DISK" \
         --source-snapshot="$DISK_SNAPSHOT"
      
    6. 删除该快照:

      gcloud compute snapshots delete "$DISK_SNAPSHOT"
  4. 将新磁盘挂接到救援实例上并装载救援实例的根卷。由于此过程仅挂接一个额外磁盘,因此新磁盘的设备标识符为 /dev/sdb。CentOS/RHEL 默认使用磁盘上的第一个卷作为根卷,因此卷标识符应为 /dev/sdb1。对于自定义的情况,请使用 lsblk 确定卷标识符。

    gcloud compute instances attach-disk rescue --disk "$NEW_DISK"
  5. 通过 SSH 连接到救援实例

    gcloud compute ssh rescue
  6. 在救援实例上执行以下步骤。

    1. 装载新磁盘的根卷。

      export NEW_DISK_MOUNT_POINT="/tmp/sdb-root-vol"
      DEV="/dev/sdb1"
      sudo mkdir "$NEW_DISK_MOUNT_POINT"
      sudo mount "$DEV" "$NEW_DISK_MOUNT_POINT"
      if [ "$?" != "0" ]; then
      # Handle XFS filesystem cases (CentOS/RHEL 7):
      sudo mount -o nouuid "$DEV" "$NEW_DISK_MOUNT_POINT"
      fi
      
    2. 创建 rc.local 脚本。

      cat <<'EOF' >/tmp/rc.local
      #!/bin/bash
      YUM_SERVER="packages.cloud.google.com"
      REPO_FILE="/etc/yum.repos.d/google-cloud.repo"
      echo "== Installing a Linux guest environment for CentOS/RHEL =="
      sleep 30 # Wait for network.
      echo "Determining CentOS/RHEL version..."
      OS_RELEASE_FILE="/etc/redhat-release"
      if [ ! -f "$OS_RELEASE_FILE" ]; then
        OS_RELEASE_FILE="/etc/centos-release"
      fi
      if [ ! -f "$OS_RELEASE_FILE" ]; then
        echo "ERROR: This system does not appear to be CentOS/RHEL."
        exit 1
      fi
      DIST=$(cat "$OS_RELEASE_FILE" | grep -o '[0-9].*' | awk -F'.' '{print $1}')
      if [ -z $DIST ]; then
        echo "ERROR: Could not determine version of CentOS/RHEL."
        exit 1
      fi
      echo "Updating $REPO_FILE..."
      tee "$REPO_FILE" << EOM
      [google-cloud-compute]
      name=Google Cloud Compute
      baseurl=https://$YUM_SERVER/yum/repos/google-compute-engine-el${DIST}-x86_64-stable
      enabled=1
      gpgcheck=1
      repo_gpgcheck=1
      gpgkey=https://$YUM_SERVER/yum/doc/yum-key.gpg
      https://$YUM_SERVER/yum/doc/rpm-package-key.gpg
      EOM
      echo "Running yum makecache..."
      yum makecache
      echo "Running yum updateinfo..."
      yum updateinfo
      echo "Running yum install google-compute-engine..."
      yum install -y google-compute-engine
      if [ "$?" != "0" ]; then
        echo "ERROR: Failed to install ${pkg}."
      fi
      echo "Removing this rc.local script."
      rm /etc/rc.d/rc.local
      # Move back any previous rc.local:
      if [ -f "/etc/moved-rc.local" ]; then
        echo "Restoring a previous rc.local script."
        mv "/etc/moved-rc.local" "/etc/rc.d/rc.local"
      fi
      echo "Restarting the instance..."
      reboot now
      EOF
      
    3. 将此 rc.local 脚本移至新磁盘的根卷并设置权限。请将任何现有的 rc.local 脚本转移到别处。临时脚本会在完成运行时将其替换掉。

      if [ -f "$NEW_DISK_MOUNT_POINT/etc/rc.d/rc.local" ]; then
        sudo mv "$NEW_DISK_MOUNT_POINT/etc/rc.d/rc.local" \
        "$NEW_DISK_MOUNT_POINT/etc/moved-rc.local"
      fi
      sudo mv /tmp/rc.local "$NEW_DISK_MOUNT_POINT/etc/rc.d/rc.local"
      sudo chmod 0755 "$NEW_DISK_MOUNT_POINT/etc/rc.d/rc.local"
      sudo chown root:root "$NEW_DISK_MOUNT_POINT/etc/rc.d/rc.local"
      
    4. 卸载新磁盘的根卷。

      sudo umount "$NEW_DISK_MOUNT_POINT" && sudo rmdir \
      "$NEW_DISK_MOUNT_POINT"
    5. 退出与救援实例之间的 SSH 会话。

  7. 将新磁盘与救援实例分离。

    gcloud compute instances detach-disk rescue --disk "$NEW_DISK"
  8. 创建一个实例以用作替换实例。在创建替换实例时,请将新磁盘指定为启动磁盘。您可以使用 Google Cloud Console 创建替换实例:

    1. 在 Google Cloud Console 中,转到虚拟机实例页面。

      转到虚拟机实例

    2. 点击有问题的实例,然后点击创建类似的虚拟机实例

    3. 指定替换实例的名称。在启动磁盘部分中,点击更改,然后点击现有磁盘。选择前面步骤中创建的新磁盘。

    4. 点击创建。替换实例会在创建后自动启动。

    当替换实例启动时,临时 rc.local 脚本会运行并安装客机环境。如需查看此脚本的运行进度,请检查控制台日志中由临时 rc.local 脚本生成的日志行。如需查看日志,请运行以下命令:

    gcloud compute instances get-serial-port-output REPLACEMENT_VM_NAME

    REPLACEMENT_VM_NAME 替换为您分配给替换实例的名称。

    临时 rc.local 脚本运行完毕后,替换实例也会自动重新启动。在第二次重新启动期间,您可以检查控制台日志以确保加载客机环境。

  9. 验证您可以通过 SSH 连接到实例

    如果您对替换实例的运行状况感到满意,可以停止删除有问题的实例。

Debian

  1. 确保您的操作系统版本受支持

  2. 创建一个新实例作为救援实例。将此实例命名为 rescue。此救援实例不需要运行与有问题的实例相同的 Linux 操作系统。此示例在救援实例上使用 Debian 9。

  3. 停止有问题的实例并创建其启动磁盘的副本。

    1. 为有问题的实例设置一个变量名称。这样会更便于在后续步骤中引用该实例。

      export PROB_INSTANCE_NAME=VM_NAME

      VM_NAME 替换为有问题的实例的名称。

    2. 停止有问题的实例。

      gcloud compute instances stop "$PROB_INSTANCE_NAME"
    3. 获取有问题的实例的启动磁盘名称。

      export PROB_INSTANCE_DISK="$(gcloud compute instances describe \
      "$PROB_INSTANCE_NAME" --format='json' |  jq -r \
      '.disks[] | select(.boot == true) | .source')"
      
    4. 创建启动磁盘的快照。

      export DISK_SNAPSHOT="${PROB_INSTANCE_NAME}-snapshot"
      
      gcloud compute disks snapshot "$PROB_INSTANCE_DISK" \
         --snapshot-names "$DISK_SNAPSHOT"
      
    5. 根据该快照创建一个新的磁盘。

      export NEW_DISK="${PROB_INSTANCE_NAME}-new-disk"
      
      gcloud compute disks create "$NEW_DISK" \
         --source-snapshot="$DISK_SNAPSHOT"
      
    6. 删除该快照:

      gcloud compute snapshots delete "$DISK_SNAPSHOT"
  4. 将新磁盘挂接到救援实例上并装载救援实例的根卷。由于此过程仅挂接一个额外磁盘,因此新磁盘的设备标识符为 /dev/sdb。Debian 默认使用磁盘上的第一个卷作为根卷,因此卷标识符应为 /dev/sdb1。对于自定义的情况,请使用 lsblk 确定卷标识符。

    gcloud compute instances attach-disk rescue --disk "$NEW_DISK"
  5. 通过 SSH 连接到救援实例

    gcloud compute ssh rescue
  6. 在救援实例上执行以下步骤。

    1. 装载新磁盘的根卷。

      export NEW_DISK_MOUNT_POINT="/tmp/sdb-root-vol"
      DEV="/dev/sdb1"
      sudo mkdir "$NEW_DISK_MOUNT_POINT"
      sudo mount "$DEV" "$NEW_DISK_MOUNT_POINT"
      
    2. 创建 rc.local 脚本。

      cat <<'EOF' >/tmp/rc.local
      #!/bin/bash
      declare -x APT_SERVER="packages.cloud.google.com"
      declare -x REPO_FILE="/etc/apt/sources.list.d/google-cloud.list"
      echo "== Installing a Linux guest environment for Debian =="
      sleep 30 # Wait for network.
      echo "Determining Debian version..."
      DIST=$(cat /etc/os-release | grep "VERSION=" \
      | sed "s/\"\|(\|)\|VERSION=//g" | awk '{print tolower($NF)}')
      if [ -z $DIST ]; then
       echo "ERROR: Could not determine Debian version."
       exit 1
      fi
      echo "Adding GPG key for $APT_SERVER."
      curl https://$APT_SERVER/apt/doc/apt-key.gpg | apt-key add -
      echo "Updating $REPO_FILE..."
      tee "$REPO_FILE" << EOM
      deb http://$APT_SERVER/apt google-compute-engine-${DIST}-stable main
      deb http://$APT_SERVER/apt google-cloud-packages-archive-keyring-${DIST} main
      EOM
      echo "Running apt update..."
      apt update
      echo "Installing packages..."
      for pkg in google-cloud-packages-archive-keyring google-compute-engine; do
       echo "Running apt install ${pkg}..."
       apt install -y ${pkg}
       if [ "$?" != "0" ]; then
          echo "ERROR: Failed to install ${pkg}."
       fi
      done
      echo "Removing this rc.local script."
      rm /etc/rc.local
      # Move back any previous rc.local:
      if [ -f "/etc/moved-rc.local" ]; then
       echo "Restoring a previous rc.local script."
       mv "/etc/moved-rc.local" "/etc/rc.local"
      fi
      echo "Restarting the instance..."
      reboot now
      EOF
      
    3. 将此 rc.local 脚本移至新磁盘的根卷并设置权限。请将任何现有的 rc.local 脚本转移到别处。临时脚本会在完成运行时将其替换掉。

      if [ -f "$NEW_DISK_MOUNT_POINT/etc/rc.local" ]; then
         sudo mv "$NEW_DISK_MOUNT_POINT/etc/rc.local" \
         "$NEW_DISK_MOUNT_POINT/etc/moved-rc.local"
      fi
      sudo mv /tmp/rc.local "$NEW_DISK_MOUNT_POINT/etc/rc.local"
      sudo chmod 0755 "$NEW_DISK_MOUNT_POINT/etc/rc.local"
      sudo chown root:root "$NEW_DISK_MOUNT_POINT/etc/rc.local"
      
    4. 卸载新磁盘的根卷。

      sudo umount "$NEW_DISK_MOUNT_POINT" && sudo rmdir "$NEW_DISK_MOUNT_POINT"
    5. 退出与救援实例之间的 SSH 会话。

  7. 将新磁盘与救援实例分离。

    gcloud compute instances detach-disk rescue --disk "$NEW_DISK"
  8. 创建一个新实例作为替换实例。在创建替换实例时,请将新磁盘指定为启动磁盘。您可以使用 Google Cloud Console 创建替换实例:

    1. 在 Google Cloud Console 中,转到虚拟机实例页面。

      转到虚拟机实例

    2. 点击有问题的实例,然后点击创建类似的虚拟机实例

    3. 指定替换实例的名称。在启动磁盘部分中,点击更改,然后点击现有磁盘。选择前面步骤中创建的新磁盘。

    4. 点击创建。替换实例会在创建后自动启动。

    当替换实例启动时,临时 rc.local 脚本会运行并安装客机环境。如需查看此脚本的运行进度,请检查控制台日志中由临时 rc.local 脚本生成的日志行。如需查看日志,请运行以下命令:

    gcloud compute instances get-serial-port-output REPLACEMENT_VM_NAME

    REPLACEMENT_VM_NAME 替换为您分配给替换实例的名称。

    临时 rc.local 脚本运行完毕后,替换实例也会自动重新启动。在第二次重新启动期间,您可以检查控制台日志以确保加载客机环境。

  9. 验证您可以通过 SSH 连接到实例

    如果您对替换实例的运行状况感到满意,可以停止删除有问题的实例。

Ubuntu

  1. 确保您的操作系统版本受支持

  2. 创建一个新实例作为救援实例。将此实例命名为 rescue。此救援实例不需要运行与有问题的实例相同的 Linux 操作系统。此示例在救援实例上使用 Debian 9。

  3. 停止有问题的实例并创建其启动磁盘的副本。

    1. 为有问题的实例设置一个变量名称。这样更易于在后续步骤中引用该实例。

      export PROB_INSTANCE_NAME=VM_NAME

      VM_NAME 替换为有问题的实例的名称。

    2. 停止有问题的实例。

      gcloud compute instances stop "$PROB_INSTANCE_NAME"
    3. 获取有问题的实例的启动磁盘名称。

      export PROB_INSTANCE_DISK="$(gcloud compute instances describe \
      "$PROB_INSTANCE_NAME" --format='json' |  jq -r \
      '.disks[] | select(.boot == true) | .source')"
      
    4. 创建启动磁盘的快照。

      export DISK_SNAPSHOT="${PROB_INSTANCE_NAME}-snapshot"
      
      gcloud compute disks snapshot "$PROB_INSTANCE_DISK" \
         --snapshot-names "$DISK_SNAPSHOT"
      
    5. 根据该快照创建一个新的磁盘。

      export NEW_DISK="${PROB_INSTANCE_NAME}-new-disk"
      
      gcloud compute disks create "$NEW_DISK" \
         --source-snapshot="$DISK_SNAPSHOT"
      
    6. 删除该快照:

      gcloud compute snapshots delete "$DISK_SNAPSHOT"
  4. 将新磁盘挂接到救援实例上并装载救援实例的根卷。由于此过程仅挂接一个额外磁盘,因此新磁盘的设备标识符为 /dev/sdb。Ubuntu 的默认根卷标签为 1,因此卷标识符应为 /dev/sdb1。对于自定义的情况,请使用 lsblk 确定卷标识符。

    gcloud compute instances attach-disk rescue --disk "$NEW_DISK"
  5. 通过 SSH 连接到救援实例

    gcloud compute ssh rescue
  6. 在救援实例上执行以下步骤。

    1. 装载新磁盘的根卷。

      export NEW_DISK_MOUNT_POINT="/tmp/sdb-root-vol"
      DEV="/dev/sdb1"
      sudo mkdir "$NEW_DISK_MOUNT_POINT"
      sudo mount "$DEV" "$NEW_DISK_MOUNT_POINT"
      
    2. 创建 rc.local 脚本。

      cat <<'EOF' >/tmp/rc.local
      #!/bin/bash
      echo "== Installing a Linux guest environment for Ubuntu =="
      sleep 30 # Wait for network.
      echo "Ensuring Ubuntu universe repositories are enabled."
      apt-add-repository universe
      echo "Running apt update..."
      apt update
      echo "Installing packages..."
      echo "Running apt install gce-compute-image-packages..."
      apt install -y gce-compute-image-packages
      if [ "$?" != "0" ]; then
       echo "ERROR: Failed to install ${pkg}."
      fi
      echo "Removing this rc.local script."
      rm /etc/rc.local
      # Move back any previous rc.local:
      if [ -f "/etc/moved-rc.local" ]; then
       echo "Restoring a previous rc.local script."
       mv "/etc/moved-rc.local" "/etc/rc.local"
      fi
      echo "Restarting the instance..."
      reboot now
      EOF
      
    3. 将此 rc.local 脚本移至新磁盘的根卷并设置权限。请将任何现有的 rc.local 脚本转移到别处。临时脚本会在完成运行时将其替换掉。

      if [ -f "$NEW_DISK_MOUNT_POINT/etc/rc.local" ]; then
         sudo mv "$NEW_DISK_MOUNT_POINT/etc/rc.local" \
         "$NEW_DISK_MOUNT_POINT/etc/moved-rc.local"
      fi
      sudo mv /tmp/rc.local "$NEW_DISK_MOUNT_POINT/etc/rc.local"
      sudo chmod 0755 "$NEW_DISK_MOUNT_POINT/etc/rc.local"
      sudo chown root:root "$NEW_DISK_MOUNT_POINT/etc/rc.local"
      
    4. 卸载新磁盘的根卷。

      sudo umount "$NEW_DISK_MOUNT_POINT" && sudo rmdir "$NEW_DISK_MOUNT_POINT"
    5. 退出与救援实例之间的 SSH 会话。

  7. 将新磁盘与救援实例分离。

    gcloud compute instances detach-disk rescue --disk "$NEW_DISK"
  8. 创建一个新实例作为替换实例。在创建替换实例时,请将新磁盘指定为启动磁盘。您可以使用 Google Cloud Console 创建替换实例:

    1. 在 Google Cloud Console 中,转到虚拟机实例页面。

      转到虚拟机实例

    2. 点击有问题的实例,然后点击创建类似的虚拟机实例

    3. 指定替换实例的名称。在启动磁盘部分中,点击更改,然后点击现有磁盘。选择前面步骤中创建的新磁盘。

    4. 点击创建。替换实例会在创建后自动启动。

    当替换实例启动时,临时 rc.local 脚本会运行并安装客机环境。如需查看此脚本的运行进度,请检查控制台日志中由临时 rc.local 脚本生成的日志行。如需查看日志,请运行以下命令:

    gcloud compute instances get-serial-port-output REPLACEMENT_VM_NAME

    REPLACEMENT_VM_NAME 替换为您分配给替换实例的名称。

    临时 rc.local 脚本运行完毕后,替换实例也会自动重新启动。在第二次重新启动期间,您可以检查控制台日志以确保加载客机环境。

  9. 验证您可以通过 SSH 连接到实例

    如果您对替换实例的运行状况感到满意,可以停止删除有问题的实例。

安装客机环境

如果您收到客机环境已过时的消息,请更新您的操作系统软件包。

CentOS/RHEL

如需更新 CentOS 和 RHEL 操作系统,请运行以下命令:

sudo yum makecache
sudo yum install google-compute-engine google-compute-engine-oslogin \
google-guest-agent google-osconfig-agent

Debian

如需更新 Debian 操作系统,请运行以下命令:

sudo apt update
sudo apt install google-compute-engine google-compute-engine-oslogin \
google-guest-agent google-osconfig-agent

Ubuntu

如需更新 Ubuntu 操作系统,请运行以下命令:

sudo apt update
sudo apt install gce-compute-image-packages google-compute-engine-oslogin \
python3-google-compute-engine

SLES

如需更新 SLES 操作系统,请运行以下命令:

sudo zypper refresh
sudo zypper install google-compute-engine-{oslogin,init}

Windows

如需更新 Windows 操作系统,请运行以下命令:

googet update

验证客机环境

访客环境是否存在的判定方法如下:检查在实例启动时发送到控制台的系统日志,或者在连接到实例时列出已安装的软件包。

访客环境的预期控制台日志

下表概括了具有正常运行的客机环境的实例在启动时生成的控制台日志的预期输出。

操作系统 服务管理 预期输出
CentOS/RHEL 7+
Debian
Ubuntu
systemd

Started Google Compute Engine Guest Agent.
Started Google Compute Engine Shutdown Scripts.
Started Google Compute Engine Startup Scripts.
CentOS/RHEL 6 upstart

GCEGuestAgent Info: GCE Agent Started (version YYYYMMDD.NN)
CoreOS systemd 和 ignition

systemd[1]: Starting Ignition (files)...
[finished] enabling unit "coreos-metadata-sshkeys@.service
[finished] enabling unit "oem-gce.service"
[finished] enabling unit "oem-cloudinit.service"
Container-Optimized OS systemd

Started Google Compute Engine Accounts Daemon
Started Google Compute Engine Network Daemon
Started Google Compute Engine Clock Skew Daemon
Started Google Compute Engine Instance Setup
Started Google Compute Engine Startup Scripts
Started Google Compute Engine Shutdown Scripts
SLES 12+ systemd

Started Google Compute Engine Guest Agent.
Started Google Compute Engine Shutdown Scripts.
Started Google Compute Engine Startup Scripts.
Windows

GCEWindowsAgent: GCE Agent Started
GCEMetadataScripts: Starting startup scripts

如需查看实例的控制台日志,请按照下列步骤操作。

控制台

  1. 在 Google Cloud Console 中,转到虚拟机实例页面。

    转到虚拟机实例

    1. 点击您要检查的实例。
    2. 重启重置该实例。
    3. 日志下,点击串行端口 1(控制台)
    4. 参考上表来搜索预期输出。

gcloud

  1. 重启重置该实例。
  2. 通过 gcloud 命令行工具,使用 gcloud compute instances get-serial-port-output 子命令进行连接。例如:

    gcloud compute instances get-serial-port-output VM_NAME

    VM_NAME 替换为您需要检查的实例的名称。

  3. 参考上表来搜索预期输出。

为访客环境加载的服务

下表概括了应加载到有正常运行的访客环境的实例上的服务。用于列出服务的命令必须在连接到实例后才能运行,因此只有当您有权访问该实例时才能执行此检查。

操作系统 列出服务的命令 预期输出
CentOS/RHEL 7+
Debian 9+

sudo systemctl list-unit-files \
| grep google | grep enabled

google-disk-expand.service             enabled
google-guest-agent.service             enabled
google-osconfig-agent.service          enabled
google-shutdown-scripts.service        enabled
google-startup-scripts.service         enabled
google-oslogin-cache.timer             enabled
CentOS/RHEL 6

initctl list | grep google

google-guest-agent start/running, process NNNN
google-startup-scripts stop/waiting
google-shutdown-scripts stop/waiting
Ubuntu

sudo systemctl list-unit-files \
| grep google | grep enabled

google-accounts-daemon.service         enabled
google-clock-skew-daemon.service       enabled
google-instance-setup.service          enabled
google-network-daemon.service          enabled
google-shutdown-scripts.service        enabled
google-startup-scripts.service         enabled
google-oslogin-cache.timer             enabled
CoreOS

sudo systemctl list-unit-files \
| grep \
"oem-cloudinit\|oem-gce\|coreos-metadata-ssh" \
| grep enabled

coreos-metadata-sshkeys@.service    enabled
oem-cloudinit.service               enabled
oem-gce.service                     enabled
Container-Optimized OS

sudo systemctl list-unit-files \
| grep google

var-lib-google.mount                disabled
google-accounts-daemon.service      disabled
google-clock-skew-daemon.service    disabled
google-instance-setup.service       disabled
google-ip-forwarding-daemon.service disabled
google-network-setup.service        disabled
google-shutdown-scripts.service     disabled
google-startup-scripts.service      disabled
var-lib-google-remount.service      static 
SLES 12+

sudo systemctl list-unit-files \
| grep google | grep enabled

google-guest-agent.service              enabled
google-optimize-local-ssd.service       enabled
google-set-multiqueue.service           enabled
google-shutdown-scripts.service         enabled
google-startup-scripts.service          enabled
google-oslogin-cache.timer              enabled 
Windows

Get-Service GCEAgent
Get-ScheduledTask GCEStartup

Running    GCEAgent   GCEAgent
\          GCEStartup Ready

为访客环境安装的软件包

下表概括了有正常运行的访客环境的实例上应安装的软件包。列出已安装软件包的命令只能在连接到实例后运行,因此您必须有权访问该实例才能执行这项检查。

操作系统 列出软件包的命令 预期输出
CentOS/RHEL

rpm -qa --queryformat '%{NAME}\n' \
|grep -iE google\|gce | grep -iE \
'google-compute|google-guest'

google-compute-engine
google-compute-engine-oslogin
google-guest-agent
Debian

apt list --installed \
| grep -iE 'google-compute|google-guest'

gce-disk-expand
google-compute-engine-oslogin
google-compute-engine
google-guest-agent
google-osconfig-agent
Ubuntu

apt list --installed \
| grep "google-compute\|gce-compute-image-packages"

gce-compute-image-packages
google-compute-engine-oslogin
python3-google-compute-engine
SUSE (SLES)

rpm -qa --queryformat '%{NAME}\n' \
|grep -iE google\|gce

google-guest-configs
regionServiceClientConfigGCE
google-guest-agent
google-opensans-fonts
python3-gcemetadata
google-guest-oslogin
cloud-regionsrv-client-plugin-gce
Windows

googet installed

certgen
googet
google-compute-engine-auto-updater
google-compute-engine-driver-gga
google-compute-engine-driver-netkvm
google-compute-engine-driver-pvpanic
google-compute-engine-driver-vioscsi
google-compute-engine-metadata-scripts
google-compute-engine-powershell
google-compute-engine-sysprep
google-compute-engine-vss
google-compute-engine-windows

后续步骤