ゲスト環境のインストール

このページでは、Compute Engine で動作している VM インスタンスのゲスト環境を手動でインストールする方法を説明します。

ほとんどの場合、Google 提供の公開イメージを使用して作成された VM を使用すると、ゲスト環境を手動でインストールする必要がありません。

ゲスト環境を手動でインストールする前に、ゲスト環境を検証するの手順に沿って、インスタンスでゲスト環境が実行されているかどうかを確認します。インスタンスで使用できるゲスト環境が古くなっている場合は、ゲスト環境を更新します。

それ以外の場合は、ゲスト環境を手動でインストールする場合の説明を確認し、ゲスト環境を手動でインストールする必要があるかどうかを判断します。

始める前に

目次

オペレーティング システムのサポート

ゲスト環境の手動インストールは、次のオペレーティング システムで行えます。

  • Ubuntu 14.04 以降
  • CentOS 6、7
  • Red Hat Enterprise Linux(RHEL)6、7
  • Debian 9
  • Windows Server 2019
  • Windows Server 1809、1803
  • Windows Server 1709
  • Windows Server 2016
  • Windows Server 2012 R2
  • Windows Server 2008 R2
  • Windows Server 上の SQL Server
  • Windows BYOL(お客様所有ライセンスの使用)(ベータ版):
    • Windows 7
    • Windows 10

ゲスト環境のインストールには、インポート ツールの使用をおすすめします。インストール オプションの一覧については、インストール方法をご覧ください。

SUSE、CoreOS、Container-Optimized の各オペレーティング システム用のゲスト環境を手動でインストールすることはできません。これらのオペレーティング システムのいずれかが必要な場合は、すべての公開イメージの中核としてゲスト環境が含まれているため、公開イメージを使用することをおすすめします。

ゲスト環境のインストール

インストール方法

ゲスト環境のインストール方法は 3 つあります。次のいずれかを選択します。

ゲスト環境をインプレースでインストールする

SSH を使用してターゲット インスタンスに接続できる場合、この方法を使用してゲスト環境をインストールします。インスタンスに接続してゲスト環境をインストールできない場合は、ブートディスクのクローンを作成して起動スクリプトでゲスト環境をインストールします。

SSH パスワード ベースの認証を使用して接続できる場合は、この手順がイメージのインポートに便利です。機能キーベースの SSH を使用したユーザー アカウントが 1 つ以上ある場合は、ゲスト環境の再インストールにも使用できます。

CentOS / RHEL

  1. お使いのオペレーティング システムのバージョンがサポートされていることを確認します。
  2. CentOS/RHEL のバージョンを特定して、ソース repo ファイル /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. ゲスト環境パッケージをインストールします。

        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
        
  5. インスタンスを再起動して、コンソールログを調査することで、バックアップの開始時にゲスト環境が読み込まれることを確認します。

  6. SSH を使用してインスタンスに接続できることを確認します。

Debian

  1. お使いのオペレーティング システムのバージョンがサポートされていることを確認します。
  2. 公開 repo 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-get update
  5. ゲスト環境パッケージをインストールします。

        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
        
  6. インスタンスを再起動して、コンソールログを調査することで、バックアップの開始時にゲスト環境が読み込まれることを確認します。

  7. SSH を使用してインスタンスに接続できることを確認します。

Ubuntu

  1. お使いのオペレーティング システムのバージョンがサポートされていることを確認します。

  2. Universe リポジトリを有効にします。Canonical は、そのゲスト環境用のパッケージを Universe リポジトリに公開します。

    sudo apt-add-repository universe
  3. パッケージ リストを更新します。

    sudo apt-get update
  4. ゲスト環境パッケージをインストールします。

        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
        
  5. インスタンスを再起動して、コンソールログを調査することで、バックアップの開始時にゲスト環境が読み込まれることを確認します。

  6. SSH を使用してインスタンスに接続できることを確認します。

Windows

開始する前に、お使いのオペレーティング システムのバージョンがサポートされていることを確認します。

Windows ゲスト環境をインストールするには、昇格した PowerShell バージョン 3.0 以降のプロンプトで次のコマンドを実行します。以下の手順の Invoke-WebRequest コマンドには、3.0 より上のバージョンの PowerShell が必要です。

  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 の場合は、他の 2 つのインストール方法のいずれかを使用してください。

この手順は Cloud Shell で行います。

CentOS / RHEL

  1. お使いのオペレーティング システムのバージョンがサポートされていることを確認します。
  2. 公開 repo GPG 鍵をインストールします。
  3. レスキュー インスタンスとして機能する新しいインスタンスを作成します。このインスタンスにレスキューという名前を付けます。このレスキュー インスタンスは、問題インスタンスと同じ Linux OS を実行する必要はありません。この例では、レスキュー インスタンスで Debian 9 を使用します。

  4. 問題インスタンスを停止し、そのルートディスクのコピーを作成します。

    1. 問題インスタンスの変数名を設定します。これにより、後の手順でインスタンスを簡単に参照できるようになります。

      export PROB_INSTANCE_NAME=instance-name

      ここで、instance-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"
  5. 新しいディスクをレスキュー インスタンスに接続し、そのルート ボリュームをマウントします。この手順では追加のディスクを 1 つだけ接続するため、新しいディスクのデバイス識別子は /dev/sdb になります。CentOS / RHEL では、デフォルトでディスク上の最初のボリュームをルート ボリュームとして使用するため、ボリューム識別子は /dev/sdb1 にする必要がありますカスタムケースでは、lsblk を使用してボリューム識別子を特定します。

    gcloud compute instances attach-disk rescue --disk "$NEW_DISK"
  6. SSH を使用してレスキュー インスタンスに接続します。

    gcloud compute ssh rescue
  7. レスキュー インスタンスで次の手順を行います。

    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
        
    1. 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-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 "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
        
    1. 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"
          
    2. 新しいディスクのルート ボリュームをアンマウントします。

      sudo umount "$NEW_DISK_MOUNT_POINT" && sudo rmdir \
          "$NEW_DISK_MOUNT_POINT"
    3. レスキュー インスタンスへの SSH セッションを終了します。

  8. レスキュー インスタンスから新しいディスクを切り離します。

    gcloud compute instances detach-disk rescue --disk "$NEW_DISK"
  9. 置換インスタンスとして機能するインスタンスを作成します。置換インスタンスを作成するときに、新しいディスクをブートディスクとして指定します。置換インスタンスは Google Cloud Console で作成できます。

    1. [VM インスタンス] ページに移動します。

      [VM インスタンス] ページに移動

    2. 問題インスタンスをクリックしてから、[クローン] をクリックします。
    3. 置換インスタンスの名前を指定します。[ブートディスク] セクションで、[変更] をクリックしてから、[既存のディスク] をクリックします。新しいディスクを選択します。
    4. [作成] をクリックします。置換インスタンスは、作成されると自動的に開始されます。

    置換インスタンスが開始されると、一時的な rc.local スクリプトが実行され、ゲスト環境がインストールされます。このスクリプトの進行状況を監視するには、一時的な rc.local スクリプトによって生成されたコンソールログの行を調べます。ログを表示するには、次のコマンドを実行します。

    gcloud compute instances get-serial-port-output replacement-instance-name

    ここで、replacement-instance-name は、置換インスタンスに割り当てた名前です。

    また、一時的な rc.local スクリプトが終了すると、置換インスタンスが自動的に再起動されます。2 回目の再起動中にコンソールログを調査することで、ゲスト環境が読み込まれていることを確認できます。

  10. SSH を使用してインスタンスに接続できることを確認します。

    置換インスタンスが機能していることを確認したら、問題インスタンスを停止または削除できます。

Debian

  1. お使いのオペレーティング システムのバージョンがサポートされていることを確認します。
  2. レスキュー インスタンスとして機能する新しいインスタンスを作成します。このインスタンスにレスキューという名前を付けます。このレスキュー インスタンスは、問題インスタンスと同じ Linux OS を実行する必要はありません。この例では、レスキュー インスタンスで Debian 9 を使用します。

  3. 問題インスタンスを停止し、そのルートディスクのコピーを作成します。

    1. 問題インスタンスの変数名を設定します。これにより、後の手順でインスタンスを簡単に参照できるようになります。

      export PROB_INSTANCE_NAME=instance-name

      ここで、instance-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. 新しいディスクをレスキュー インスタンスに接続し、そのルート ボリュームをマウントします。この手順では追加のディスクを 1 つだけ接続するため、新しいディスクのデバイス識別子は /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 -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 セッションを終了します。

  7. レスキュー インスタンスから新しいディスクを切り離します。

    gcloud compute instances detach-disk rescue --disk "$NEW_DISK"
  8. 置換インスタンスとして機能する新しいインスタンスを作成します。置換インスタンスを作成するときに、新しいディスクをブートディスクとして指定します。置換インスタンスは Google Cloud Console で作成できます。

    1. [VM インスタンス] ページに移動します。

      [VM インスタンス] ページに移動

    2. 問題インスタンスをクリックしてから、[クローン] をクリックします。
    3. 置換インスタンスの名前を指定します。[ブートディスク] セクションで、[変更] をクリックしてから、[既存のディスク] をクリックします。新しいディスクを選択します。
    4. [作成] をクリックします。置換インスタンスは、作成されると自動的に開始されます。

    置換インスタンスが開始されると、一時的な rc.local スクリプトが実行され、ゲスト環境がインストールされます。このスクリプトの進行状況を監視するには、一時的な rc.local スクリプトによって生成されたコンソールログの行を調べます。ログを表示するには、次のコマンドを実行します。

    gcloud compute instances get-serial-port-output replacement-instance-name

    ここで、replacement-instance-name は、置換インスタンスに割り当てた名前です。

    また、一時的な rc.local スクリプトが終了すると、置換インスタンスが自動的に再起動されます。2 回目の再起動中にコンソールログを調査することで、ゲスト環境が読み込まれていることを確認できます。

  9. SSH を使用してインスタンスに接続できることを確認します。

    置換インスタンスが機能していることを確認したら、問題インスタンスを停止または削除できます。

Ubuntu

  1. お使いのオペレーティング システムのバージョンがサポートされていることを確認します。
  2. 公開 repo GPG 鍵をインストールします。
  3. レスキュー インスタンスとして機能する新しいインスタンスを作成します。このインスタンスにレスキューという名前を付けます。このレスキュー インスタンスは、問題インスタンスと同じ Linux OS を実行する必要はありません。この例では、レスキュー インスタンスで Debian 9 を使用します。

  4. 問題インスタンスを停止し、そのルートディスクのコピーを作成します。

    1. 問題インスタンスの変数名を設定します。これにより、後の手順でインスタンスを簡単に参照できるようになります。

      export PROB_INSTANCE_NAME=instance-name

      ここで、instance-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"
  5. 新しいディスクをレスキュー インスタンスに接続し、そのルート ボリュームをマウントします。この手順では追加のディスクを 1 つだけ接続するため、新しいディスクのデバイス識別子は /dev/sdb になります。Ubuntu では、デフォルトでルート ボリュームに 1 というラベルを付けるため、ボリューム識別子は /dev/sdb1 にする必要があります。カスタムケースでは、lsblk を使用してボリューム識別子を特定します。

    gcloud compute instances attach-disk rescue --disk "$NEW_DISK"
  6. SSH を使用してレスキュー インスタンスに接続します。

    gcloud compute ssh rescue
  7. レスキュー インスタンスで次の手順を行います。

    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 -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 セッションを終了します。

  8. レスキュー インスタンスから新しいディスクを切り離します。

    gcloud compute instances detach-disk rescue --disk "$NEW_DISK"
  9. 置換インスタンスとして機能する新しいインスタンスを作成します。置換インスタンスを作成するときに、新しいディスクをブートディスクとして指定します。置換インスタンスは Google Cloud Console で作成できます。

    1. [VM インスタンス] ページに移動します。

      [VM インスタンス] ページに移動

    2. 問題インスタンスをクリックしてから、[クローン] をクリックします。
    3. 置換インスタンスの名前を指定します。[ブートディスク] セクションで、[変更] をクリックしてから、[既存のディスク] をクリックします。新しいディスクを選択します。
    4. [作成] をクリックします。置換インスタンスは、作成されると自動的に開始されます。

    置換インスタンスが開始されると、一時的な rc.local スクリプトが実行され、ゲスト環境がインストールされます。このスクリプトの進行状況を監視するには、一時的な rc.local スクリプトによって生成されたコンソールログの行を調べます。ログを表示するには、次のコマンドを実行します。

    gcloud compute instances get-serial-port-output replacement-instance-name

    ここで、replacement-instance-name は、置換インスタンスに割り当てた名前です。

    また、一時的な rc.local スクリプトが終了すると、置換インスタンスが自動的に再起動されます。2 回目の再起動中にコンソールログを調査することで、ゲスト環境が読み込まれていることを確認できます。

  10. SSH を使用してインスタンスに接続できることを確認します。

    置換インスタンスが機能していることを確認したら、問題インスタンスを停止または削除できます。

ゲスト環境の更新

ゲスト環境が古いというメッセージが表示された場合は、オペレーティング システムのパッケージを更新します。

CentOS / RHEL

オペレーティング システムが CentOS または RHEL も場合、次のコマンドを実行します。

    sudo yum makecache
    sudo yum install google-compute-engine google-compute-engine-oslogin python*-google-compute-engine
    

Debian、Ubuntu

Debian または Ubuntu のオペレーティング システムを更新するには、次のコマンドを実行します。

    sudo apt-get update
    sudo apt install google-compute-engine google-compute-engine-oslogin python*-google-compute-engine
    

Windows

Windows オペレーティング システムを更新するには、次のコマンドを実行します。

googet update

ゲスト環境を検証する

ゲスト環境の存在は、インスタンスの起動中にコンソールに出力されるシステムログを調査するか、インスタンスへの接続中にインストールされたパッケージをリストすることによって判断できます。

ゲスト環境の想定されるコンソールログ

この表は、稼働中のゲスト環境が起動するときにインスタンスから発行されるコンソールログの想定される出力をまとめたものです。

OS サービス管理 予想される出力
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"
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
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
Windows

GCEWindowsAgent: GCE Agent Started
    GCEMetadataScripts: Starting startup scripts
    

インスタンスのコンソールログを表示するには、次の手順を実行します。

Console

  1. [VM インスタンス] ページに移動します。

    [VM インスタンス] ページに移動

    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. 上の表を参照して想定される出力を探します。

ゲスト環境で読み込まれるサービス

この表は、稼働中のゲスト環境でインスタンスに読み込む必要があるサービスをまとめたものです。サービスをリストするコマンドは、インスタンスに接続した後に実行する必要があります。そのため、このチェックはインスタンスへのアクセス権がある場合にのみ実行できます。

OS サービスの一覧を取得するコマンド 予想される出力
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
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 
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
Windows

Get-Service GCEAgent
    Get-ScheduledTask GCEStartup

Running    GCEAgent   GCEAgent
    \          GCEStartup Ready
    

ゲスト環境でインストールされるパッケージ

この表は、稼働中のゲスト環境でインスタンスにインストールする必要があるパッケージをまとめたものです。インストールされるパッケージをリストするコマンドは、インスタンスに接続した後に実行する必要があります。そのため、このチェックはインスタンスへのアクセス権がある場合にのみ実行できます。

OS パッケージの一覧を取得するコマンド 予想される出力
CentOS/RHEL 6 & 7

yum list installed | grep google-compute

google-compute-engine
    google-compute-engine-oslogin.x86_64
    python-google-compute-engine
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
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
    

次のステップ