安装 Linux 访客环境

本页面介绍如何安装适用于 Compute Engine 的 Linux 访客环境。使用 Google 提供的公共映像创建的 Linux 实例包括操作系统维护人员安装的访客环境。如需详细了解 Google 提供的公共映像,包括这些映像的完整列表,请参阅公共映像

访客环境是用于 Linux Compute Engine 实例的一组进程和配置,可提供关键的 Compute Engine 功能

以下组织构建和维护用于特定 Linux 发行版的访客环境软件包:

  • Canonical:
  • Google:
    • CentOS/Red Hat Enterprise Linux (RHEL) 6 和 7
    • Debian 9
  • SUSE:
    • SLES 12、SLES 15、SLES for SAP

CoreOS 提供以下功能来支持访客环境功能:

准备工作

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

目录

安装访客环境

采用以下任一方式安装访客环境:

就地安装访客环境

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

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

CentOS/RHEL

确定 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-cloud-compute-el${DIST}-x86_64
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

更新软件包列表:

sudo yum makecache
sudo yum updateinfo

安装访客环境软件包:

declare -a PKG_LIST=(python-google-compute-engine \
google-compute-engine-oslogin \
google-compute-engine)
for pkg in ${PKG_LIST[@]}; do
   sudo yum install -y $pkg
done

重启实例检查其控制台日志,确认实例启动过程中会加载访客环境。

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

Debian

安装公开代码库 GPG 密钥:

curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

确定 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

更新软件包列表:

sudo apt-get update

安装访客环境软件包:

declare -a PKG_LIST=(google-cloud-packages-archive-keyring \
python-google-compute-engine \
python3-google-compute-engine \
google-compute-engine-oslogin \
google-compute-engine)
for pkg in ${PKG_LIST[@]}; do
   sudo apt install -y $pkg
done

重启实例检查其控制台日志,确认实例启动过程中会加载访客环境。

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

Ubuntu

Canonical 将用于其访客环境的软件包发布到 Universe 代码库。首先启用 Universe 代码库

sudo apt-add-repository universe

更新软件包列表:

sudo apt-get update

安装访客环境软件包:

declare -a PKG_LIST=(python-google-compute-engine \
python3-google-compute-engine \
google-compute-engine-oslogin \
gce-compute-image-packages)
for pkg in ${PKG_LIST[@]}; do
   sudo apt install -y $pkg || echo "Not available: $pkg"
done

重启实例检查其控制台日志,确认实例启动过程中会加载访客环境。

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

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

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

  1. 如有必要,创建另一个可以附加新磁盘的实例。我们将这个新的实例称为救援实例

  2. 停止您要重新安装访客环境的实例。我们将其称为有问题的实例

  3. 实例停止时,在有问题的实例上创建启动磁盘的快照。

  4. 从该快照创建一个新的永久性磁盘。

  5. 将新磁盘附加到救援实例,并装载其根卷。复制一个目的是将访客环境安装到根卷的临时 rc.local 脚本。

  6. 将新磁盘与救援实例分离,并利用新磁盘创建替换实例

  7. 启动替换实例。

  8. 替换实例首次启动并运行临时 rc.local 脚本。该脚本将安装访客环境、删除自身并再次重启。

  9. 验证替换实例运行正常。

  10. (可选)停止或删除有问题的实例。

使用 Cloud Shell 运行此过程:

CentOS/RHEL

  1. 创建一个新实例作为救援实例。为了清楚说明起见,将此实例命名为救援。此实例需要运行与有问题的实例相同的 Linux 操作系统。(我们将 Debian 9 作为救援实例验证了此过程。)

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

    1. 为有问题的实例设置一个变量名称。这样更易于执行此过程的后续步骤。将 INSTANCE_NAME 替换为有问题的实例的名称:
      PROB_INSTANCE_NAME=INSTANCE_NAME
    2. 停止有问题的实例:
      gcloud compute instances stop "$PROB_INSTANCE_NAME"
    3. 确定其启动磁盘的名称:
      PROB_INSTANCE_DISK="$(gcloud compute instances describe "$PROB_INSTANCE_NAME" 
      --format='json' | jq -r '.disks[] | select(.boot == true) | .source')"
    4. 为其启动磁盘创建一个快照:
      DISK_SNAPSHOT="${PROB_INSTANCE_NAME}-snapshot"
      gcloud compute disks snapshot "$PROB_INSTANCE_DISK" --snapshot-names "$DISK_SNAPSHOT"
    5. 根据此快照新建一个磁盘:
      NEW_DISK="${PROB_INSTANCE_NAME}-new-disk"
      gcloud compute disks create "$NEW_DISK" --source-snapshot="$DISK_SNAPSHOT"
    6. 删除此快照:
      gcloud compute snapshots delete "$DISK_SNAPSHOT"
  3. 将新磁盘附加到救援实例并装载其根卷。因为此过程仅附加一块额外磁盘,所以新磁盘的设备标识符将为 /dev/sdb。CentOS/RHEL 默认使用其磁盘上的第一个卷作为根卷,因此卷标识符应为 /dev/sdb1。(对于自定义的情况,请使用 lsblk 来确定卷标识符。)

    gcloud compute instances attach-disk rescue --disk "$NEW_DISK"

  4. 通过 SSH 连接到救援实例

    gcloud compute ssh rescue

  5. 通过救援实例执行这些步骤:

    1. 装载新磁盘的根卷。

      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
      declare -a PKG_LIST=(python-google-compute-engine \
      google-compute-engine-oslogin \
      google-compute-engine)
      declare -x YUM_SERVER="packages.cloud.google.com"
      declare -x 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-cloud-compute-el${DIST}-x86_64
      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 "Installing packages..."
      for pkg in ${PKG_LIST[@]}; do
         echo "Running yum install $pkg..."
         yum install -y $pkg
         if [ "$?" != "0" ]; then
            echo "ERROR: Failed to install $pkg."
         fi
      done
      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 会话。

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

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

    1. 转到“虚拟机实例”页面。

      转到“虚拟机实例”页面

    2. 点击有问题的实例,然后点击克隆
    3. 指定替换实例的名称。在启动磁盘部分中,点击更改,然后点击现有磁盘。选择新的磁盘。
    4. 点击创建。替换实例将在创建完毕后启动。
  8. 让替换实例启动。在启动时,它将运行临时 rc.local 脚本,从而安装 Linux 访客环境。要查看此脚本的运行进度,请检查控制台日志中由临时 rc.local 脚本发出的内容。例如,您可以通过 gcloud 执行此操作,具体如下所示。将 REPLACEMENT_INSTANCE_NAME 更改为您之前分配给替换实例的名称。

    gcloud compute instances get-serial-port-output REPLACEMENT_INSTANCE_NAME
  9. 临时 rc.local 脚本运行完毕后,替换实例将自动再重启一次。从第二次重启开始,您可以检查其控制台日志以确保加载访客环境。验证您可以通过 SSH 连接到实例

  10. 一旦您确信替换实例在正常运行,就可以停止删除有问题的实例。

Debian

  1. 创建一个新实例作为救援实例。为了清楚说明起见,将此实例命名为救援。此实例需要运行与有问题的实例相同的 Linux 操作系统。(我们将 Debian 9 作为救援实例验证了此过程。)

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

    1. 为有问题的实例设置一个变量名称。这样更易于执行此过程的后续步骤。将 INSTANCE_NAME 替换为有问题的实例的名称:
      PROB_INSTANCE_NAME=INSTANCE_NAME
    2. 停止有问题的实例:
      gcloud compute instances stop "$PROB_INSTANCE_NAME"
    3. 确定其启动磁盘的名称:
      PROB_INSTANCE_DISK="$(gcloud compute instances describe "$PROB_INSTANCE_NAME" 
      --format='json' | jq -r '.disks[] | select(.boot == true) | .source')"
    4. 为其启动磁盘创建一个快照:
      DISK_SNAPSHOT="${PROB_INSTANCE_NAME}-snapshot"
      gcloud compute disks snapshot "$PROB_INSTANCE_DISK" --snapshot-names "$DISK_SNAPSHOT"
    5. 根据此快照新建一个磁盘:
      NEW_DISK="${PROB_INSTANCE_NAME}-new-disk"
      gcloud compute disks create "$NEW_DISK" --source-snapshot="$DISK_SNAPSHOT"
    6. 删除此快照:
      gcloud compute snapshots delete "$DISK_SNAPSHOT"
  3. 将新磁盘附加到救援实例并装载其根卷。因为此过程仅附加一块额外磁盘,所以新磁盘的设备标识符将为 /dev/sdb。Debian 默认使用其磁盘上的第一卷作为根卷,因此卷标识符应为 /dev/sdb1。(对于自定义的情况,请使用 lsblk 来确定卷标识符。)

    gcloud compute instances attach-disk rescue --disk "$NEW_DISK"

  4. 通过 SSH 连接到救援实例

    gcloud compute ssh rescue

  5. 通过救援实例执行这些步骤:

    1. 装载新磁盘的根卷。

      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 -a PKG_LIST=(google-cloud-packages-archive-keyring \
      python-google-compute-engine \
      python3-google-compute-engine \
      google-compute-engine-oslogin \
      google-compute-engine)
      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-get update
      echo "Installing packages..."
      for pkg in ${PKG_LIST[@]}; 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 会话。

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

    gcloud compute instances detach-disk rescue --disk "$NEW_DISK"

  7. 创建一个新实例作为替换实例。在创建替换实例时,请将新磁盘指定为启动磁盘。您可以通过 Cloud Console 创建替换实例:

    1. 转到“虚拟机实例”页面。

      转到“虚拟机实例”页面

    2. 点击有问题的实例,然后点击克隆
    3. 指定替换实例的名称。在启动磁盘部分中,点击更改,然后点击现有磁盘。选择新的磁盘。
    4. 点击创建。替换实例将在创建完毕后启动。
  8. 让替换实例启动。在启动时,它将运行临时 rc.local 脚本,从而安装 Linux 访客环境。要查看此脚本的运行进度,请检查控制台日志中由临时 rc.local 脚本发出的内容。例如,您可以通过 gcloud 执行此操作,具体如下所示。将 REPLACEMENT_INSTANCE_NAME 更改为您之前分配给替换实例的名称。

    gcloud compute instances get-serial-port-output REPLACEMENT_INSTANCE_NAME

  9. 临时 rc.local 脚本运行完毕后,替换实例将自动再重启一次。从第二次重启开始,您可以检查其控制台日志以确保加载访客环境。验证您可以通过 SSH 连接到实例

  10. 一旦您确信替换实例在正常运行,就可以停止删除有问题的实例。

Ubuntu

  1. 创建一个新实例作为救援实例。为了清楚说明起见,将此实例命名为救援。此实例需要运行与有问题的实例相同的 Linux 操作系统。(我们将 Debian 9 作为救援实例验证了此过程。)

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

    1. 为有问题的实例设置一个变量名称。这样更易于执行此过程的后续步骤。将 INSTANCE_NAME 替换为有问题的实例的名称:
      PROB_INSTANCE_NAME=INSTANCE_NAME
    2. 停止有问题的实例:
      gcloud compute instances stop "$PROB_INSTANCE_NAME"
    3. 确定其启动磁盘的名称:
      PROB_INSTANCE_DISK="$(gcloud compute instances describe "$PROB_INSTANCE_NAME" 
      --format='json' | jq -r '.disks[] | select(.boot == true) | .source')"
    4. 为其启动磁盘创建一个快照:
      DISK_SNAPSHOT="${PROB_INSTANCE_NAME}-snapshot"
      gcloud compute disks snapshot "$PROB_INSTANCE_DISK" --snapshot-names "$DISK_SNAPSHOT"
    5. 根据此快照新建一个磁盘:
      NEW_DISK="${PROB_INSTANCE_NAME}-new-disk"
      gcloud compute disks create "$NEW_DISK" --source-snapshot="$DISK_SNAPSHOT"
    6. 删除此快照:
      gcloud compute snapshots delete "$DISK_SNAPSHOT"
  3. 将新磁盘附加到救援实例并装载其根卷。因为此过程仅附加一块额外磁盘,所以新磁盘的设备标识符将为 /dev/sdb。Ubuntu 默认的根卷标签为 1;因此,卷标识符应为 /dev/sdb1。(对于自定义的情况,请使用 lsblk 来确定卷标识符。)

    gcloud compute instances attach-disk rescue --disk "$NEW_DISK"

  4. 通过 SSH 连接到救援实例

    gcloud compute ssh rescue

  5. 通过救援实例执行这些步骤:

    1. 装载新磁盘的根卷。

      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 -a PKG_LIST=(python-google-compute-engine \
      python3-google-compute-engine \
      google-compute-engine-oslogin \
      gce-compute-image-packages)
      echo "== Installing a Linux Guest Environment for Ubuntu =="
      sleep 30 # Wait for network.
      echo "Determining Ubuntu version..."
      DIST=$(cat /etc/os-release | grep "VERSION_ID=" \
      | sed "s/\"\|(\|)\|VERSION_ID=//g" | awk -F. '{print tolower($1)}')
      if [ -z $DIST ]; then
         echo "ERROR: Could not determine Ubuntu version."
         exit 1
      fi
      if [ "$DIST" -lt "16" ]; then
         # Adjust package list for older Ubuntu:
         echo "Ubuntu version less than 16.04."
         declare -a PKG_LIST=(python-google-compute-engine \
         gce-compute-image-packages)
      fi
      echo "Ensuring Ubuntu universe repositories are enabled."
      apt-add-repository universe
      echo "Running apt update..."
      apt-get update
      echo "Installing packages..."
      for pkg in ${PKG_LIST[@]}; 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 会话。

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

    gcloud compute instances detach-disk rescue --disk "$NEW_DISK"

  7. 创建一个新实例作为替换实例。在创建替换实例时,请将新磁盘指定为启动磁盘。您可以通过 Cloud Console 创建替换实例:

    1. 转到“虚拟机实例”页面。

      转到“虚拟机实例”页面

    2. 点击有问题的实例,然后点击克隆
    3. 指定替换实例的名称。在启动磁盘部分中,点击更改,然后点击现有磁盘。选择新的磁盘。
    4. 点击创建。替换实例将在创建完毕后启动。
  8. 让替换实例启动。在启动时,它将运行临时 rc.local 脚本,从而安装 Linux 访客环境。要查看此脚本的运行进度,请检查控制台日志中由临时 rc.local 脚本发出的内容。例如,您可以通过 gcloud 执行此操作,具体如下所示。将 REPLACEMENT_INSTANCE_NAME 更改为您之前分配给替换实例的名称。

    gcloud compute instances get-serial-port-output REPLACEMENT_INSTANCE_NAME

  9. 临时 rc.local 脚本运行完毕后,替换实例将自动再重启一次。从第二次重启开始,您可以检查其控制台日志以确保加载访客环境。验证您可以通过 SSH 连接到实例

  10. 一旦您确信替换实例在正常运行,就可以停止删除有问题的实例。

验证访客环境

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

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

下表概括了具有有效访客环境的实例在启动时发送的控制台日志预期输出内容。

操作系统 服务管理 预期输出内容
CentOS/RHEL 7
Debian 9
Ubuntu 16.04+
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
CentOS/RHEL 6
Ubuntu 14.04
upstart

google-accounts: INFO Starting Google Accounts daemon
google-ip-forwarding: INFO Starting Google Compute Engine Network Daemon
google-clock-skew: INFO Starting Google Clock Skew daemon
CoreOS systemd and 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"
SUSE (SLES) 12+ 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

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

控制台

  1. 转到“虚拟机实例”页面。

    转到“虚拟机实例”页面

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

gcloud

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

    gcloud compute instances get-serial-port-output [INSTANCE_NAME]
    

    其中,[INSTANCE_NAME] 是您要检查的实例的名称。

  3. 参考上表,搜索预期输出内容。

为访客环境加载的服务

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

操作系统 用于列出服务的命令 预期输出内容
CentOS/RHEL 7
Debian 9
Ubuntu 16.04+

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-shutdown-scripts.service     enabled
google-startup-scripts.service      enabled
google-network-daemon.service       enabled
CentOS/RHEL 6
Ubuntu 14.04

initctl list | grep google

google-accounts-daemon              start/running
google-network-daemon               start/running
google-clock-skew-daemon            start/running
google-instance-setup               stop/waiting
google-startup-scripts              stop/waiting
google-shutdown-scripts             stop/waiting
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
SUSE (SLES) 12+

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

google-accounts-daemon.service      enabled
google-network-daemon.service       enabled
google-clock-skew-daemon.service    enabled
google-instance-setup.service       enabled
google-shutdown-scripts.service     enabled
google-startup-scripts.service      enabled

为访客环境安装的软件包

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

操作系统 用于列出软件包的命令 预期输出内容
CentOS/RHEL 6 & 7

yum list installed | grep google-compute

google-compute-engine.noarch
google-compute-engine-oslogin.x86_64
python-google-compute-engine.noarch
Debian 9

apt list --installed | grep google-compute

google-compute-engine
google-compute-engine-oslogin
python-google-compute-engine
python3-google-compute-engine
Ubuntu 14.04

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

gce-compute-image-packages
google-compute-engine-oslogin
python-google-compute-engine
Ubuntu 16.04+

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

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

zypper se -i | grep package \
| grep "google-compute-engine\|gce\|ClientConfigGCE"

cloud-regionsrv-client-plugin-gce
google-compute-engine-init
python-gcemetadata
regionServiceClientConfigGCE

后续步骤

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

发送以下问题的反馈:

此网页
Compute Engine 文档