安裝訪客環境


本頁說明如何為虛擬機器 (VM) 執行個體手動安裝訪客環境。訪客環境是一組指令碼、Daemon 和二進位檔,執行個體必須具備這些資源,才能在 Compute Engine 上運作。詳情請參閱「訪客環境」。

在大多數情況下,如果您使用 Google 提供的公開 OS 映像檔,系統會自動納入訪客環境。如要查看自動納入客體環境的 OS 映像檔完整清單,請參閱作業系統詳細資料

如果未安裝訪客環境或訪客環境已過時,請安裝或更新。如要判斷是否屬於這些情況,請參閱「安裝或更新訪客環境的時機」。

事前準備

  • 如果尚未設定驗證,請先完成設定。 驗證可確認您的身分,以便存取 Google Cloud 服務和 API。如要從本機開發環境執行程式碼或範例,可以選取下列任一選項,向 Compute Engine 進行驗證:

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

    Console

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

    gcloud

    1. 安裝 Google Cloud CLI。 安裝完成後,執行下列指令初始化 Google Cloud CLI:

      gcloud init

      如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI

    2. Set a default region and zone.

安裝或更新訪客環境的時機

在大多數情況下,您不需要手動安裝或更新訪客環境。請參閱下列章節,瞭解何時可能需要手動安裝或更新。

檢查安裝需求

安裝訪客環境之前,請先進行驗證訪客環境程序,檢查您的執行個體上是否正在執行訪客環境。如果執行個體上有可用的訪客環境,但該訪客環境已過時,請更新訪客環境

在下列情況中,您可能需要安裝訪客環境:

  • 您需要的 Google 提供 OS 映像檔未安裝客體環境。

  • 您將自訂映像檔或虛擬磁碟匯入 Compute Engine,並選擇禁止系統自動安裝訪客環境。

    匯入虛擬磁碟或自訂映像檔時,您可以讓 Compute Engine 為您安裝訪客環境。不過,如果您在匯入過程中選擇不安裝訪客環境,就必須手動安裝訪客環境。

  • 您是使用 Migrate to Virtual Machines 將 VM 遷移至 Compute Engine

如要安裝訪客環境,請參閱「安裝方法」。

檢查更新規定

在下列情況中,您可能需要更新訪客環境:

如要更新訪客環境,請參閱更新訪客環境

安裝方法

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

支援的作業系統

您可以在使用正式發布 (GA) 生命週期或延伸支援生命週期階段 OS 映像檔版本的 VM 上,安裝或更新客體環境。

如要查看 Compute Engine 上的作業系統映像檔版本清單及其生命週期階段,請參閱「作業系統詳細資料」。

限制

您無法為 Fedora CoreOS 和 Container-Optimized (COS) 作業系統手動安裝訪客環境,也無法使用匯入工具安裝。對於 COS,Google 建議使用Google 提供的公開映像檔,因為這些映像檔已將訪客環境納入核心元件。

安裝訪客環境

如要手動安裝訪客環境,請根據連線至執行個體的能力,選取下列其中一種方法:

就地安裝訪客環境

如果能以 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

複製開機磁碟並使用開機指令碼

如果無法連線至執行個體以手動安裝訪客環境,請改用這個程序安裝,這個程序包含可在 Google Cloud 控制台或 Cloud Shell 中完成的步驟。

這個方法僅適用於 Linux 發行版。如果是 Windows,請使用其他兩種安裝方法

請使用 Cloud Shell 執行此程序。如果未使用 Cloud Shell,請安裝 jq 指令列 JSON 處理器,以便執行此程序。這個處理器會篩選 gcloud CLI 輸出內容。 Cloud Shell 已預先安裝 jq

CentOS/RHEL/Rocky

  1. 確認作業系統版本受支援

  2. 建立新執行個體以做為救援執行個體。將此執行個體命名為 rescue。此救援執行個體執行的 Linux OS 不需要和有問題的執行個體相同。此範例在救援執行個體上使用的是 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. 將新磁碟連接至救援執行個體,並掛接救援執行個體的根磁碟區。由於這個程序只連結一個額外磁碟,因此新磁碟的裝置 ID 為 /dev/sdb。根據預設,CentOS/RHEL/Rocky Linux 會使用磁碟的第一個磁碟區做為根磁碟區,因此磁碟區 ID 應為 /dev/sdb1。如為自訂設定,請使用 lsblk 判定磁碟區 ID。

    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. 建立新執行個體以做為替代執行個體。建立替代執行個體後,請將新磁碟指定為開機磁碟。您可以使用 Google Cloud 控制台建立替代執行個體:

    1. 前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面

      前往 VM 執行個體

    2. 按一下有問題的執行個體,然後點選「建立類似的執行個體範本」

    3. 指定替代執行個體的名稱。在「Boot disk」(開機磁碟) 區段,點選 [Change] (變更),然後按一下 [Existing Disks](現有磁碟) 。選取新磁碟。

    4. 按一下 [Create] (建立)。替代執行個體在建立完成後會自動啟動。

    當替代執行個體啟動時,暫時 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 OS 不需要和有問題的執行個體相同。此範例在救援執行個體上使用的是 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. 將新磁碟連接至救援執行個體,並掛接救援執行個體的根磁碟區。由於這個程序只連結一個額外磁碟,因此新磁碟的裝置 ID 為 /dev/sdb。根據預設,Debian 會使用磁碟的第一個磁碟區做為根磁碟區,因此磁碟區 ID 應為 /dev/sdb1。如為自訂設定,請使用 lsblk 判定磁碟區 ID。

    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. 建立新執行個體以做為替代執行個體。建立替代執行個體後,請將新磁碟指定為開機磁碟。您可以使用 Google Cloud 控制台建立替代執行個體:

    1. 前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面

      前往 VM 執行個體

    2. 按一下有問題的執行個體,然後點選「建立類似的執行個體範本」

    3. 指定替代執行個體的名稱。在「Boot disk」(開機磁碟) 區段,點選 [Change] (變更),然後按一下 [Existing Disks](現有磁碟) 。選取新磁碟。

    4. 按一下 [Create] (建立)。替代執行個體在建立完成後會自動啟動。

    當替代執行個體啟動時,暫時 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 OS 不需要和有問題的執行個體相同。此範例在救援執行個體上使用的是 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. 將新磁碟連接至救援執行個體,並掛接救援執行個體的根磁碟區。由於這個程序只連結一個額外磁碟,因此新磁碟的裝置 ID 為 /dev/sdb。Ubuntu 預設將自己的根磁碟區標示為 1,因此磁碟區 ID 應為 /dev/sdb1。如為自訂設定,請使用 lsblk 判定磁碟區 ID。

    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. 建立新執行個體以做為替代執行個體。建立替代執行個體後,請將新磁碟指定為開機磁碟。您可以使用 Google Cloud 控制台建立替代執行個體:

    1. 前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面

      前往 VM 執行個體

    2. 按一下有問題的執行個體,然後點選「建立類似的執行個體範本」

    3. 指定替代執行個體的名稱。在「Boot disk」(開機磁碟) 區段,點選 [Change] (變更),然後按一下 [Existing Disks](現有磁碟) 。選取新磁碟。

    4. 按一下 [Create] (建立)。替代執行個體在建立完成後會自動啟動。

    當替代執行個體啟動時,暫時 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. 前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面

    前往 VM 執行個體

    1. 選取要查看的執行個體。
    2. 重新啟動重設執行個體
    3. 在「記錄」下按一下 [序列埠 1 (主控台)]
    4. 參考這些步驟前的表格,搜尋預期的輸出內容。

gcloud

  1. 重新啟動重設執行個體
  2. 使用 gcloud compute instances get-serial-port-output 子指令,透過 Google Cloud CLI 進行連線。例如:

    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

後續步驟