安装客机环境

本页面介绍了如何在虚拟机 (VM) 实例上手动安装客机环境。客机环境是实例在 Compute Engine 上运行所需的一组脚本、守护程序和二进制文件。如需了解详情,请参阅客机环境

在大多数情况下,如果您使用的是 Google 提供的公共操作系统映像,则会自动包含客机环境。如需查看自动包含客机环境的操作系统映像的完整列表,请参阅操作系统详细信息

如果未安装客机环境或已过时,请安装或更新客机环境。如需识别这些情况,请参阅何时安装或更新客机环境

准备工作

  • 如果您尚未设置身份验证,请进行设置。身份验证用于验证您的身份,以便访问 Trusted Cloud by S3NS 服务和 API。如需从本地开发环境运行代码或示例,您可以通过选择以下选项之一向 Compute Engine 进行身份验证:

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Trusted Cloud console to access Trusted Cloud by S3NS services and APIs, you don't need to set up authentication.

    gcloud

    1. 安装 Google Cloud CLI,然后使用联合身份登录 gcloud CLI。 登录后,运行以下命令来初始化 Google Cloud CLI:

      gcloud init
    2. Set a default region and zone.

何时安装或更新客机环境

在大多数情况下,您无需手动安装或更新客机环境。请参阅以下部分,了解何时可能需要手动安装或更新。

查看安装要求

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

在以下情况下,您可能需要安装客机环境:

  • 您所需的 Google 提供的操作系统映像未安装客机环境。

  • 您将自定义映像或虚拟磁盘导入 Compute Engine,并选择阻止自动安装客机环境。

    导入虚拟磁盘或自定义映像时,您可以让 Compute Engine 为您安装客机环境。但是,如果您在导入过程中选择不安装客机环境,则必须手动安装客机环境。

  • 使用 Migrate to Virtual Machines 将虚拟机迁移到 Compute Engine

如需安装客机环境,请参阅安装方法

查看更新要求

在以下情况下,您可能需要更新客机环境:

如需更新客机环境,请参阅更新客机环境

安装方法

您可以通过多种方式安装客机环境。选择下列其中一个选项:

  • 导入工具。建议使用导入工具。不过,导入工具会安装客机环境,还会对映像执行其他配置更新,例如配置网络、配置引导加载程序和安装 Google Cloud CLI。如需查看相关说明,请参阅使映像可启动

    导入工具支持各种操作系统和版本。如需了解详情,请参阅操作系统详情页面

  • 手动安装。请按以下方式之一操作:

支持的操作系统

您可以在使用处于正式版 (GA) 生命周期或扩展支持生命周期阶段的操作系统映像版本的虚拟机上安装或更新客机环境。

如需查看 Compute Engine 上的操作系统映像版本及其生命周期阶段的列表,请参阅操作系统详情

限制

您无法手动安装或使用导入工具为 Fedora CoreOS 和 Container-Optimized (COS) 操作系统安装客机环境。对于 COS,Google 建议使用Google 提供的公共映像,这些映像包含客机环境作为核心组件。

安装客机环境

如需手动安装客机环境,请根据您是否能够连接到实例,选择以下方法之一:

就地安装客机环境

如果您可以使用 SSH 连接到目标实例,请使用此方法来安装客机环境。如果您无法连接到实例以安装客机环境,则可以改为克隆启动磁盘并使用启动脚本来安装客机环境

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

CentOS/RHEL/Rocky

  1. 验证您的操作系统版本是否受支持
  2. 确定 CentOS/RHEL/Rocky Linux 版本。然后,创建源仓库文件 /etc/yum.repos.d/google-cloud.repo

    eval $(grep VERSION_ID /etc/os-release)
    sudo tee /etc/yum.repos.d/google-cloud.repo << EOM
    [google-compute-engine]
    name=Google Compute Engine
    baseurl=https://packages.cloud.google.com/yum/repos/google-compute-engine-el${VERSION_ID/.*}-x86_64-stable
    enabled=1
    gpgcheck=1
    repo_gpgcheck=0
    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 google-osconfig-agent
    
  5. 重启实例。 然后,检查其控制台日志以确保实例重启过程中会加载客机环境。

  6. 使用 SSH 连接到实例以进行验证。如需查看详细说明,请参阅使用 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

    eval $(grep VERSION_CODENAME /etc/os-release)
    sudo tee /etc/apt/sources.list.d/google-cloud.list << EOM
    deb http://packages.cloud.google.com/apt google-compute-engine-${VERSION_CODENAME}-stable main
    deb http://packages.cloud.google.com/apt google-cloud-packages-archive-keyring-${VERSION_CODENAME} main
    EOM
    
  4. 更新软件包列表:

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

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

  7. 使用 SSH 连接到实例以进行验证。如需查看详细说明,请参阅使用 SSH 连接到实例

Ubuntu

  1. 验证您的操作系统版本是否受支持

  2. 启用 Universe 仓库。Canonical 会将其客机环境的软件包发布到 Universe 仓库

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

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

    sudo apt install -y google-compute-engine google-osconfig-agent
    
  5. 重启实例。 然后,检查其控制台日志以确保实例重启过程中会加载客机环境。

  6. 使用 SSH 连接到实例以进行验证。如需查看详细说明,请参阅使用 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-guest-{agent,configs,oslogin} \
    google-osconfig-agent
    sudo systemctl enable /usr/lib/systemd/system/google-*
    
  5. 重启实例。 然后,检查其控制台日志以确保实例重启过程中会加载客机环境。

  6. 使用 SSH 连接到实例以进行验证。如需查看详细说明,请参阅使用 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.18.3/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 google-osconfig-agent
    
  4. 安装可选的 Windows 访客环境软件包。

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

    使用 googet 命令

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

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

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

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

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

如果您无法连接到实例来手动安装客机环境,请按照此过程安装客机环境,其中包括可在 Trusted Cloud 控制台或 Cloud Shell 中完成的以下步骤。

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

使用 Cloud Shell 执行此过程。如需在不使用 Cloud Shell 时执行此过程,请安装 jq 命令行 JSON 处理器。此处理器用于过滤 gcloud CLI 输出。Cloud Shell 已预安装 jq

CentOS/RHEL/Rocky

  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/Rocky Linux 默认使用磁盘上的第一个卷作为根卷,因此卷标识符应为 /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 -o nouuid "$DEV" "$NEW_DISK_MOUNT_POINT"
      
    2. 创建 rc.local 脚本。

      cat <<'EOF' >/tmp/rc.local
      #!/bin/bash
      echo "== Installing Google guest environment for CentOS/RHEL/Rocky Linux =="
      sleep 30 # Wait for network.
      echo "Determining CentOS/RHEL/Rocky Linux version..."
      eval $(grep VERSION_ID /etc/os-release)
      if [[ -z $VERSION_ID ]]; then
        echo "ERROR: Could not determine version of CentOS/RHEL/Rocky Linux."
        exit 1
      fi
      echo "Updating repo file..."
      tee "/etc/yum.repos.d/google-cloud.repo" << EOM
      [google-compute-engine]
      name=Google Compute Engine
      baseurl=https://packages.cloud.google.com/yum/repos/google-compute-engine-el${VERSION_ID/.*}-x86_64-stable
      enabled=1
      gpgcheck=1
      repo_gpgcheck=0
      gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
      https://packages.cloud.google.com/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
      rpm -q google-compute-engine
      if [[ $? -ne 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
      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. 创建一个实例以用作替换实例。 在创建替换实例时,请将新磁盘指定为启动磁盘。 您可以使用 Trusted Cloud 控制台创建替换实例:

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

      转到虚拟机实例

    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
      echo "== Installing Google guest environment for Debian =="
      export DEBIAN_FRONTEND=noninteractive
      sleep 30 # Wait for network.
      echo "Determining Debian version..."
      eval $(grep VERSION_CODENAME /etc/os-release)
      if [[ -z $VERSION_CODENAME ]]; then
       echo "ERROR: Could not determine Debian version."
       exit 1
      fi
      echo "Adding GPG key for Google cloud repo."
      curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
      echo "Updating repo file..."
      tee "/etc/apt/sources.list.d/google-cloud.list" << EOM
      deb http://packages.cloud.google.com/apt google-compute-engine-${VERSION_CODENAME}-stable main
      deb http://packages.cloud.google.com/apt google-cloud-packages-archive-keyring-${VERSION_CODENAME} 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 [[ $? -ne 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
      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. 创建一个新实例作为替换实例。 在创建替换实例时,请将新磁盘指定为启动磁盘。 您可以使用 Trusted Cloud 控制台创建替换实例:

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

      转到虚拟机实例

    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 "Running apt update..."
      apt update
      echo "Installing packages..."
      echo "Running apt install google-compute-engine..."
      apt install -y google-compute-engine
      if [[ $? -ne 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
      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. 创建一个新实例作为替换实例。 在创建替换实例时,请将新磁盘指定为启动磁盘。 您可以使用 Trusted Cloud 控制台创建替换实例:

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

      转到虚拟机实例

    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/Rocky

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

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 google-compute-engine google-compute-engine-oslogin \
google-guest-agent google-osconfig-agent

SLES

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

sudo zypper refresh
sudo zypper install google-guest-{agent,configs,oslogin} \
google-osconfig-agent

Windows

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

googet update

验证访客环境

您可以通过以下方式检查是否已安装客机环境:检查在实例启动时发送到控制台的系统日志,或者在连接到实例时列出已安装的软件包。

查看客机环境的预期控制台日志

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

操作系统 服务管理 预期输出
CentOS/RHEL/Rocky Linux
Debian
Ubuntu
SLES
Container-Optimized OS 89 及更高版本
systemd
google_guest_agent: GCE Agent Started (version YYYYMMDD.NN)
google_metadata_script_runner: Starting startup scripts (version YYYYMMDD.NN)
OSConfigAgent Info: OSConfig Agent (version YYYYMMDD.NN)
Container-Optimized OS 85 及更早版本 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
Windows
GCEGuestAgent: GCE Agent Started (version YYYYMMDD.NN)
GCEMetadataScripts: Starting startup scripts (version YYYYMMDD.NN)
OSConfigAgent Info: OSConfig Agent (version YYYYMMDD.NN)

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

控制台

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

    转到虚拟机实例

    1. 选择您需要检查的实例。
    2. 重启重置该实例。
    3. 日志下,点击串行端口 1(控制台)
    4. 搜索上述步骤之前的表中的预期输出。

gcloud

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

    gcloud compute instances get-serial-port-output VM_NAME

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

  3. 搜索上述步骤之前的表中的预期输出。

按操作系统版本查看已加载的服务

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

操作系统 列出服务的命令 预期输出
CentOS/RHEL/Rocky Linux
Debian
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
Ubuntu
sudo systemctl list-unit-files \
| grep google | grep 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
Container-Optimized OS
sudo systemctl list-unit-files \
| grep google
var-lib-google.mount                   disabled
google-guest-agent.service             disabled
google-osconfig-agent.service          disabled
google-osconfig-init.service           disabled
google-oslogin-cache.service           static
google-shutdown-scripts.service        disabled
google-startup-scripts.service         disabled
var-lib-google-remount.service         static
google-oslogin-cache.timer             disabled 
SLES 12+
sudo systemctl list-unit-files \
| grep google | grep 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 
Windows
Get-Service GCEAgent
Get-ScheduledTask GCEStartup
Running    GCEAgent   GCEAgent
\          GCEStartup Ready

按操作系统版本查看已安装的软件包

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

如需详细了解这些软件包,请参阅客机环境组件

操作系统 列出软件包的命令 预期输出
CentOS/RHEL/Rocky Linux
rpm -qa --queryformat '%{NAME}\n' \
| grep -iE 'google|gce'
google-osconfig-agent
google-compute-engine-oslogin
google-guest-agent
gce-disk-expand
google-cloud-sdk
google-compute-engine
Debian
apt list --installed \
| grep -i google
gce-disk-expand
google-cloud-packages-archive-keyring
google-cloud-sdk
google-compute-engine-oslogin
google-compute-engine
google-guest-agent
google-osconfig-agent
Ubuntu
apt list --installed \
| grep -i google
google-compute-engine-oslogin
google-compute-engine
google-guest-agent
google-osconfig-agent
SUSE (SLES)
rpm -qa --queryformat '%{NAME}\n' \
| grep -i google
google-guest-configs
google-osconfig-agent
google-guest-oslogin
google-guest-agent
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
google-osconfig-agent

后续步骤