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 は、ゲスト環境の機能をサポートするために次の機能を提供します。

始める前に

内容

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

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

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

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

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

CentOS/RHEL

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

公開 repo GPG 鍵をインストールします。

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

Debian distro の名前を特定し、ソースリスト ファイル /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. レスキュー インスタンスとして機能する新しいインスタンスを作成します。わかりやすくするために、このインスタンスの名前を 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. 新しいディスクをレスキュー インスタンスに接続し、そのルート ボリュームをマウントします。この手順では追加のディスクを 1 つだけ接続するため、新しいディスクのデバイス識別子は /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 インスタンス] ページに移動します。

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

    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 スクリプトが終了すると、置換インスタンスが再度自動的にリブートします。2 回目のリブート以降は、そのコンソールログを調査することで、ゲスト環境が読み込まれていることを確認できます。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. 新しいディスクをレスキュー インスタンスに接続し、そのルート ボリュームをマウントします。この手順では追加のディスクを 1 つだけ接続するため、新しいディスクのデバイス識別子は /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 インスタンス] ページに移動します。

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

    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 スクリプトが終了すると、置換インスタンスが再度自動的にリブートします。2 回目のリブート以降は、そのコンソールログを調査することで、ゲスト環境が読み込まれていることを確認できます。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. 新しいディスクをレスキュー インスタンスに接続し、そのルート ボリュームをマウントします。この手順では追加のディスクを 1 つだけ接続するため、新しいディスクのデバイス識別子は /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 インスタンス] ページに移動します。

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

    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 スクリプトが終了すると、置換インスタンスが再度自動的にリブートします。2 回目のリブート以降は、そのコンソールログを調査することで、ゲスト環境が読み込まれていることを確認できます。SSH を使用してインスタンスに接続できることを確認します。

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

ゲスト環境を検証する

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

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

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

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"
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

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

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

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

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

OS パッケージをリストするコマンド 想定される出力
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 ドキュメント