安裝 Linux 訪客環境

本頁面說如何安裝 Compute Engine 適用的 Linux 訪客環境。使用 Google 提供的公開映像檔建立的 Linux 執行個體,包含 OS 維護人員安裝的訪客環境。如需 Google 提供的公開映像檔詳細資料 (包含映像檔的完整清單),請參閱公開映像檔

訪客環境是一組程序和設定,適用於提供重要 Compute Engine 功能的 Linux Compute Engine 執行個體。

下列機構針對特定 Linux 發行版建構和維護訪客環境套件:

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

CoreOS 提供下列功能以支援訪客環境功能:

事前準備

目錄

安裝訪客環境

您可以透過下列兩種方式安裝訪客環境。選擇下列兩個選項的其中一個:

妥善安裝訪客環境

如果能以 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 主控台和 Cloud Shell 中完成的下列步驟。

  1. 如有必要請建立新磁碟可連結的另一個執行個體。我們將這另一個執行個體稱為救援執行個體

  2. 將需要重新安裝訪客環境的執行個體停止。我們將這個執行個體稱為問題執行個體

  3. 當執行個體停止時,建立問題執行個體上開機磁碟的快照。

  4. 從快照建立新的永久磁碟。

  5. 將新磁碟連結至救援執行個體,並掛接本身的根磁碟區。將目的為安裝訪客環境的暫時 rc.local 指令碼複製到根磁碟區。

  6. 從救援執行個體卸離新磁碟,並使用新磁碟建立替代執行個體

  7. 啟動替代執行個體。

  8. 替代執行個體首次啟動並執行暫時 rc.local 指令碼。這個指令碼會安裝訪客環境、自我刪除,並重新啟動。

  9. 驗證替代執行個體可運作。

  10. 可選擇停止或刪除問題執行個體。

請使用 Cloud Shell 來執行此步驟:

CentOS/RHEL

  1. 建立新執行個體以做為救援執行個體。將這個執行個體命名為 rescue 以在操作時易於辨識。它執行的 Linux OS 需要和問題執行個體相同 (我們用 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. 前往「VM instances」(VM 執行個體) 頁面。

      前往 VM 執行個體頁面

    2. 點選問題執行個體,然後按一下 [複製]
    3. 指定替代執行個體的名稱。在「Boot disk」(開機磁碟) 區段,點選 [Change] (變更),然後按一下 [Existing Disks](現有磁碟) 。選取新磁碟。
    4. 按一下 [Create] (建立)。替代執行個體會在建立後啟動。
  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. 建立新執行個體以做為救援執行個體。將這個執行個體命名為 rescue 以在操作時易於辨識。它執行的 Linux OS 需要和問題執行個體相同 (我們用 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. 前往「VM instances」(VM 執行個體) 頁面。

      前往 VM 執行個體頁面

    2. 點選問題執行個體,然後按一下 [複製]
    3. 指定替代執行個體的名稱。在「Boot disk」(開機磁碟) 區段,點選 [Change] (變更),然後按一下 [Existing Disks](現有磁碟) 。選取新磁碟。
    4. 按一下 [Create] (建立)。替代執行個體會在建立後啟動。
  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. 建立新執行個體以做為救援執行個體。將這個執行個體命名為 rescue 以在操作時易於辨識。它執行的 Linux OS 需要和問題執行個體相同 (我們用 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. 前往「VM instances」(VM 執行個體) 頁面。

      前往 VM 執行個體頁面

    2. 點選問題執行個體,然後按一下 [複製]
    3. 指定替代執行個體的名稱。在「Boot disk」(開機磁碟) 區段,點選 [Change] (變更),然後按一下 [Existing Disks](現有磁碟) 。選取新磁碟。
    4. 按一下 [Create] (建立)。替代執行個體會在建立後啟動。
  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 和 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. 前往「VM instances」(VM 執行個體) 頁面。

    前往 VM 執行個體頁面

    1. 點選要您要檢查的執行個體。
    2. 重新啟動重設執行個體。
    3. 在「記錄」下按一下 [序列埠 1 (主控台)]
    4. 參考上表搜尋預期的輸出。

gcloud

  1. 重新啟動重設執行個體。
  2. 使用 gcloud compute get-serial-port-output 子指令,以用 gcloud 指令列工具來連線。例如:

    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 說明文件