Linux-Gastumgebung installieren

Auf dieser Seite wird die Installation der Linux-Gastumgebung für Compute Engine beschrieben. Linux-Instanzen, die mit öffentlichen Images von Google erstellt werden, enthalten eine vom Administrator des Betriebssystems installierte Gastumgebung. Weitere Informationen zu den von Google bereitgestellten öffentlichen Images, einschließlich einer vollständigen Liste dieser Images, finden Sie unter Öffentliche Images.

Die Gastumgebung besteht aus einer Reihe von Prozessen und Konfigurationen für Linux Compute Engine-Instanzen, die wichtige Compute Engine-Funktionen bereitstellen.

Die folgenden Organisationen erstellen und verwalten Gastumgebungspakete für bestimmte Linux-Distributionen:

  • Canonical:
  • Google:
    • CentOS/Red Hat Enterprise Linux (RHEL) 6 und 7
    • Debian 9
  • SUSE:
    • SLES 12, SLES 15, SLES für SAP

CoreOS bietet die folgenden Funktionen zur Unterstützung von Gastumgebungsfunktionen:

Vorbereitung

Inhalt

Gastumgebung installieren

Sie installieren die Gastumgebung mit einer der folgenden Optionen:

Gastumgebung direkt installieren

Mit dieser Methode können Sie die Gastumgebung installieren, wenn Sie mithilfe von SSH eine Verbindung zur Zielinstanz herstellen können. Wenn Sie keine Verbindung zu der Instanz herstellen können, um die Gastumgebung zu installieren, können Sie die Gastumgebung durch Klonen des Bootlaufwerks und Erstellen eines Startskripts installieren.

Diese Vorgehensweise ist für importierte Images nützlich, wenn Sie mit der passwortbasierten SSH-Authentifizierung eine Verbindung herstellen können. Sie kann auch verwendet werden, um die Gastumgebung neu zu installieren, wenn Sie mindestens ein Nutzerkonto mit funktionierender schlüsselbasierter SSH-Authentifizierung haben.

CentOS/RHEL

Bestimmen Sie die Version von CentOS/RHEL und erstellen Sie die Datei /etc/yum.repos.d/google-cloud.repo für das Quell-Repository:

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

Aktualisieren Sie die Paketlisten:

sudo yum makecache
sudo yum updateinfo

Installieren Sie die Gastumgebungspakete:

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

Sie können feststellen, ob die Gastumgebung beim Neustart geladen wird, wenn Sie die Instanz neu starten und das zugehörige Konsolenlog überprüfen.

Überprüfen Sie, ob Sie mit SSH eine Verbindung zur Instanz herstellen können.

Debian

Installieren Sie den öffentlichen Repo-GPG-Schlüssel:

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

Bestimmen Sie den Namen der Debian-Distribution und erstellen Sie die Quelllistendatei /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

Aktualisieren Sie die Paketlisten:

sudo apt-get update

Installieren Sie die Gastumgebungspakete:

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

Sie können feststellen, ob die Gastumgebung beim Neustart geladen wird, wenn Sie die Instanz neu starten und das zugehörige Konsolenlog überprüfen.

Überprüfen Sie, ob Sie mit SSH eine Verbindung zur Instanz herstellen können.

Ubuntu

Canonical veröffentlicht Pakete für die zugehörige Gastumgebung im Universe-Repository. Aktivieren Sie zuerst das Universe-Repository:

sudo apt-add-repository universe

Aktualisieren Sie die Paketlisten:

sudo apt-get update

Installieren Sie die Gastumgebungspakete:

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

Sie können feststellen, ob die Gastumgebung beim Neustart geladen wird, wenn Sie die Instanz neu starten und das zugehörige Konsolenlog überprüfen.

Überprüfen Sie, ob Sie mit SSH eine Verbindung zur Instanz herstellen können.

Bootlaufwerk klonen und Startskript verwenden

Wenn Sie zu einer Instanz keine Verbindung herstellen können, um die Gastumgebung manuell zu installieren, installieren Sie sie mithilfe der folgenden Schritte entweder über die GCP Console oder Cloud Shell.

  1. Erstellen Sie gegebenenfalls eine weitere Instanz, der das neue Laufwerk hinzugefügt werden kann. Wir bezeichnen diese andere Instanz als Rettungsinstanz.

  2. Beenden Sie die Instanz, für die Sie die Gastumgebung neu installieren müssen. Wir bezeichnen diese Instanz als problematische Instanz.

  3. Erstellen Sie einen Snapshot des Bootlaufwerks für die problematische Instanz, solange sie nicht aktiv ist.

  4. Erstellen Sie einen neuen nichtflüchtigen Speicher anhand dieses Snapshots.

  5. Fügen Sie das neue Laufwerk der Rettungsinstanz hinzu und stellen Sie das zugehörige Root-Volume bereit. Kopieren Sie ein temporäres Skript rc.local, mit dem die Gastumgebung auf dem Root-Volume installiert werden soll.

  6. Trennen Sie das neue Laufwerk von der Rettungsinstanz und erstellen Sie eine Ersatzinstanz mit dem neuen Laufwerk.

  7. Starten Sie die Ersatzinstanz.

  8. Die Ersatzinstanz wird erstmalig gestartet und führt das temporäre Skript rc.local aus. Dieses Skript installiert die Gastumgebung, löscht sich selbst und startet neu.

  9. Überprüfen Sie, ob die Ersatzinstanz betriebsbereit ist.

  10. Optional können Sie die problematische Instanz beenden oder löschen.

Verwenden Sie die Cloud Shell, um dieses Verfahren durchzuführen:

CentOS/RHEL

  1. Erstellen Sie eine neue Instanz, die als Rettungsinstanz dient. Bezeichnen Sie diese Instanz zur Verdeutlichung als Rettungsinstanz. Diese Instanz muss nicht dasselbe Linux-Betriebssystem wie die problematische Instanz ausführen. Wir haben dieses Verfahren mit Debian 9 als Rettungsinstanz validiert.

  2. Beenden Sie die problematische Instanz und erstellen Sie eine Kopie des Bootlaufwerks.

    1. Legen Sie einen Variablennamen für die problematische Instanz fest. Dadurch werden zukünftige Schritte dieses Verfahrens leichter nachvollziehbar. Ersetzen Sie INSTANCE_NAME durch den Namen der problematischen Instanz:
      PROB_INSTANCE_NAME=INSTANCE_NAME
    2. Beenden Sie die problematische Instanz:
      gcloud compute instances stop "$PROB_INSTANCE_NAME"
    3. Ermitteln Sie den Namen des zugehörigen Bootlaufwerks:
      PROB_INSTANCE_DISK="$(gcloud compute instances describe "$PROB_INSTANCE_NAME" 
      --format='json' | jq -r '.disks[] | select(.boot == true) | .source')"
    4. Erstellen Sie einen Snapshot des zugehörigen Bootlaufwerks:
      DISK_SNAPSHOT="${PROB_INSTANCE_NAME}-snapshot"
      gcloud compute disks snapshot "$PROB_INSTANCE_DISK" --snapshot-names "$DISK_SNAPSHOT"
    5. Erstellen Sie ein neues Laufwerk anhand des Snapshots:
      NEW_DISK="${PROB_INSTANCE_NAME}-new-disk"
      gcloud compute disks create "$NEW_DISK" --source-snapshot="$DISK_SNAPSHOT"
    6. Löschen Sie den Snapshot:
      gcloud compute snapshots delete "$DISK_SNAPSHOT"
  3. Fügen Sie das neue Laufwerk der Rettungsinstanz hinzu und hängen Sie das zugehörige Root-Volume ein. Da bei diesem Verfahren nur ein zusätzliches Laufwerk hinzugefügt wird, lautet die Geräte-ID des neuen Laufwerks /dev/sdb. CentOS/RHEL verwenden standardmäßig das erste Volume auf dem Laufwerk als Root-Volume, daher sollte die Volume-Kennzeichnung /dev/sdb1 lauten. Für Fälle mit benutzerdefinierten Änderungen verwenden Sie lsblk, um die Volume-Kennzeichnung zu bestimmen.

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

  4. Stellen Sie mit SSH eine Verbindung zur Instanz her:

    gcloud compute ssh rescue

  5. Führen Sie die folgenden Schritte unter Verwendung der Rettungsinstanz aus:

    1. Hängen Sie das Root-Volume auf dem neuen Laufwerk ein.

      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. Erstellen Sie das Skript 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. Verschieben Sie das Skript rc.local auf das Root-Volume des neuen Laufwerks und legen Sie Berechtigungen fest. Falls bereits ein Skript rc.local vorhanden ist, verschieben Sie es an eine andere Position. Es wird durch das temporäre Skript ersetzt, sobald dieses abgeschlossen ist.

      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. Hängen Sie das Root-Volume auf dem neuen Laufwerk aus.

      sudo umount "$NEW_DISK_MOUNT_POINT" && sudo rmdir "$NEW_DISK_MOUNT_POINT"
    5. Beenden Sie die SSH-Sitzung auf der Rettungsinstanz.

  6. Trennen Sie das neue Laufwerk von der Rettungsinstanz.

    gcloud compute instances detach-disk rescue --disk "$NEW_DISK"
  7. Erstellen Sie eine neue Instanz, die als Ersatz dient. Beim Erstellen der Ersatzinstanz geben Sie das neue Laufwerk als Bootlaufwerk an. Sie können die Ersatzinstanz mithilfe der Cloud Console erstellen:

    1. Gehen Sie zur Seite "VM-Instanzen".

      Zur Seite "VM-Instanzen"

    2. Klicken Sie auf die problematische Instanz und dann auf Klonen.
    3. Geben Sie einen Namen für die Ersatzinstanz ein. Klicken Sie im Abschnitt Bootlaufwerk auf Ändern und dann auf Vorhandene Laufwerke. Wählen Sie das neue Laufwerk aus.
    4. Klicken Sie auf Erstellen. Die Ersatzinstanz wird gestartet, nachdem sie erstellt wurde.
  8. Warten Sie, bis die Ersatzinstanz startet. Während des Startvorgangs wird das temporäre Skript rc.local ausgeführt und die Linux-Gastumgebung installiert. Den Fortschritt dieses Skripts können Sie beobachten, wenn Sie die Konsolenlogs auf Zeilen überprüfen, die vom temporären Skript rc.local ausgegeben wurden. Verwenden Sie hierzu beispielsweise gcloud, wie unten gezeigt. Ändern Sie REPLACEMENT_INSTANCE_NAME in den Namen, den Sie der Ersatzinstanz zugewiesen haben.

    gcloud compute instances get-serial-port-output REPLACEMENT_INSTANCE_NAME
  9. Die Ersatzinstanz wird automatisch noch einmal neu gestartet, wenn das Skript rc.local abgeschlossen ist. Ab dem zweiten Neustart können Sie anhand des zugehörigen Konsolenlogs feststellen, ob die Gastumgebung geladen wird. Überprüfen Sie, ob Sie mit SSH eine Verbindung zur Instanz herstellen können.

  10. Wenn Sie sicher sind, dass die Ersatzinstanz funktionsfähig ist, können Sie die problematische Instanz beenden oder löschen.

Debian

  1. Erstellen Sie eine neue Instanz, die als Rettungsinstanz dient. Bezeichnen Sie diese Instanz zur Verdeutlichung als Rettungsinstanz. Diese Instanz muss nicht dasselbe Linux-Betriebssystem wie die problematische Instanz ausführen. Wir haben dieses Verfahren mit Debian 9 als Rettungsinstanz validiert.

  2. Beenden Sie die problematische Instanz und erstellen Sie eine Kopie des Bootlaufwerks.

    1. Legen Sie einen Variablennamen für die problematische Instanz fest. Dadurch werden zukünftige Schritte dieses Verfahrens leichter nachvollziehbar. Ersetzen Sie INSTANCE_NAME durch den Namen der problematischen Instanz:
      PROB_INSTANCE_NAME=INSTANCE_NAME
    2. Beenden Sie die problematische Instanz:
      gcloud compute instances stop "$PROB_INSTANCE_NAME"
    3. Ermitteln Sie den Namen des zugehörigen Bootlaufwerks:
      PROB_INSTANCE_DISK="$(gcloud compute instances describe "$PROB_INSTANCE_NAME" 
      --format='json' | jq -r '.disks[] | select(.boot == true) | .source')"
    4. Erstellen Sie einen Snapshot des zugehörigen Bootlaufwerks:
      DISK_SNAPSHOT="${PROB_INSTANCE_NAME}-snapshot"
      gcloud compute disks snapshot "$PROB_INSTANCE_DISK" --snapshot-names "$DISK_SNAPSHOT"
    5. Erstellen Sie ein neues Laufwerk anhand des Snapshots:
      NEW_DISK="${PROB_INSTANCE_NAME}-new-disk"
      gcloud compute disks create "$NEW_DISK" --source-snapshot="$DISK_SNAPSHOT"
    6. Löschen Sie den Snapshot:
      gcloud compute snapshots delete "$DISK_SNAPSHOT"
  3. Fügen Sie das neue Laufwerk der Rettungsinstanz hinzu und hängen Sie das zugehörige Root-Volume ein. Da bei diesem Verfahren nur ein zusätzliches Laufwerk hinzugefügt wird, lautet die Geräte-ID des neuen Laufwerks /dev/sdb. Debian verwendet standardmäßig das erste Volume auf dem zugehörigen Laufwerk als Root-Volume. Daher sollte die Volume-Kennzeichnung /dev/sdb1 lauten. Für Fälle mit benutzerdefinierten Änderungen verwenden Sie lsblk, um die Volume-Kennzeichnung zu bestimmen.

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

  4. Stellen Sie mit SSH eine Verbindung zur Instanz her:

    gcloud compute ssh rescue

  5. Führen Sie die folgenden Schritte unter Verwendung der Rettungsinstanz aus:

    1. Hängen Sie das Root-Volume auf dem neuen Laufwerk ein.

      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. Erstellen Sie das Skript 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. Verschieben Sie das Skript rc.local auf das Root-Volume des neuen Laufwerks und legen Sie Berechtigungen fest. Falls bereits ein Skript rc.local vorhanden ist, verschieben Sie es an eine andere Position. Es wird durch das temporäre Skript ersetzt, sobald dieses abgeschlossen ist.

      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. Hängen Sie das Root-Volume auf dem neuen Laufwerk aus.

      sudo umount "$NEW_DISK_MOUNT_POINT" && sudo rmdir "$NEW_DISK_MOUNT_POINT"
    5. Beenden Sie die SSH-Sitzung auf der Rettungsinstanz.

  6. Trennen Sie das neue Laufwerk von der Rettungsinstanz.

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

  7. Erstellen Sie eine neue Instanz, die als Ersatz dient. Beim Erstellen der Ersatzinstanz geben Sie das neue Laufwerk als Bootlaufwerk an. Sie können die Ersatzinstanz mithilfe der Cloud Console erstellen:

    1. Gehen Sie zur Seite "VM-Instanzen".

      Zur Seite "VM-Instanzen"

    2. Klicken Sie auf die problematische Instanz und dann auf Klonen.
    3. Geben Sie einen Namen für die Ersatzinstanz ein. Klicken Sie im Abschnitt Bootlaufwerk auf Ändern und dann auf Vorhandene Laufwerke. Wählen Sie das neue Laufwerk aus.
    4. Klicken Sie auf Erstellen. Die Ersatzinstanz wird gestartet, nachdem sie erstellt wurde.
  8. Warten Sie, bis die Ersatzinstanz startet. Während des Startvorgangs wird das temporäre Skript rc.local ausgeführt und die Linux-Gastumgebung installiert. Den Fortschritt dieses Skripts können Sie beobachten, wenn Sie die Konsolenlogs auf Zeilen überprüfen, die vom temporären Skript rc.local ausgegeben wurden. Verwenden Sie hierzu beispielsweise gcloud, wie unten gezeigt. Ändern Sie REPLACEMENT_INSTANCE_NAME in den Namen, den Sie der Ersatzinstanz zugewiesen haben.

    gcloud compute instances get-serial-port-output REPLACEMENT_INSTANCE_NAME

  9. Die Ersatzinstanz wird automatisch noch einmal neu gestartet, wenn das Skript rc.local abgeschlossen ist. Ab dem zweiten Neustart können Sie anhand des zugehörigen Konsolenlogs feststellen, ob die Gastumgebung geladen wird. Überprüfen Sie, ob Sie mit SSH eine Verbindung zur Instanz herstellen können.

  10. Wenn Sie sicher sind, dass die Ersatzinstanz funktionsfähig ist, können Sie die problematische Instanz beenden oder löschen.

Ubuntu

  1. Erstellen Sie eine neue Instanz, die als Rettungsinstanz dient. Bezeichnen Sie diese Instanz zur Verdeutlichung als Rettungsinstanz. Diese Instanz muss nicht dasselbe Linux-Betriebssystem wie die problematische Instanz ausführen. Wir haben dieses Verfahren mit Debian 9 als Rettungsinstanz validiert.

  2. Beenden Sie die problematische Instanz und erstellen Sie eine Kopie des Bootlaufwerks.

    1. Legen Sie einen Variablennamen für die problematische Instanz fest. Dadurch werden zukünftige Schritte dieses Verfahrens leichter nachvollziehbar. Ersetzen Sie INSTANCE_NAME durch den Namen der problematischen Instanz:
      PROB_INSTANCE_NAME=INSTANCE_NAME
    2. Beenden Sie die problematische Instanz:
      gcloud compute instances stop "$PROB_INSTANCE_NAME"
    3. Ermitteln Sie den Namen des zugehörigen Bootlaufwerks:
      PROB_INSTANCE_DISK="$(gcloud compute instances describe "$PROB_INSTANCE_NAME" 
      --format='json' | jq -r '.disks[] | select(.boot == true) | .source')"
    4. Erstellen Sie einen Snapshot des zugehörigen Bootlaufwerks:
      DISK_SNAPSHOT="${PROB_INSTANCE_NAME}-snapshot"
      gcloud compute disks snapshot "$PROB_INSTANCE_DISK" --snapshot-names "$DISK_SNAPSHOT"
    5. Erstellen Sie ein neues Laufwerk anhand des Snapshots:
      NEW_DISK="${PROB_INSTANCE_NAME}-new-disk"
      gcloud compute disks create "$NEW_DISK" --source-snapshot="$DISK_SNAPSHOT"
    6. Löschen Sie den Snapshot:
      gcloud compute snapshots delete "$DISK_SNAPSHOT"
  3. Fügen Sie das neue Laufwerk der Rettungsinstanz hinzu und hängen Sie das zugehörige Root-Volume ein. Da bei diesem Verfahren nur ein zusätzliches Laufwerk hinzugefügt wird, lautet die Geräte-ID des neuen Laufwerks /dev/sdb. Ubuntu kennzeichnet standardmäßig das Root-Volume 1. Aus diesem Grund sollte die Volume-Kennzeichnung /dev/sdb1 lauten. Für Fälle mit benutzerdefinierten Änderungen verwenden Sie lsblk, um die Volume-Kennzeichnung zu bestimmen.

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

  4. Stellen Sie mit SSH eine Verbindung zur Instanz her:

    gcloud compute ssh rescue

  5. Führen Sie die folgenden Schritte unter Verwendung der Rettungsinstanz aus:

    1. Hängen Sie das Root-Volume auf dem neuen Laufwerk ein.

      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. Erstellen Sie das Skript 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. Verschieben Sie das Skript rc.local auf das Root-Volume des neuen Laufwerks und legen Sie Berechtigungen fest. Falls bereits ein Skript rc.local vorhanden ist, verschieben Sie es an eine andere Position. Es wird durch das temporäre Skript ersetzt, sobald dieses abgeschlossen ist.

      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. Hängen Sie das Root-Volume auf dem neuen Laufwerk aus.

      sudo umount "$NEW_DISK_MOUNT_POINT" && sudo rmdir "$NEW_DISK_MOUNT_POINT"
    5. Beenden Sie die SSH-Sitzung auf der Rettungsinstanz.

  6. Trennen Sie das neue Laufwerk von der Rettungsinstanz.

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

  7. Erstellen Sie eine neue Instanz, die als Ersatz dient. Beim Erstellen der Ersatzinstanz geben Sie das neue Laufwerk als Bootlaufwerk an. Sie können die Ersatzinstanz mithilfe der Cloud Console erstellen:

    1. Gehen Sie zur Seite "VM-Instanzen".

      Zur Seite "VM-Instanzen"

    2. Klicken Sie auf die problematische Instanz und dann auf Klonen.
    3. Geben Sie einen Namen für die Ersatzinstanz ein. Klicken Sie im Abschnitt Bootlaufwerk auf Ändern und dann auf Vorhandene Laufwerke. Wählen Sie das neue Laufwerk aus.
    4. Klicken Sie auf Erstellen. Die Ersatzinstanz wird gestartet, nachdem sie erstellt wurde.
  8. Warten Sie, bis die Ersatzinstanz startet. Während des Startvorgangs wird das temporäre Skript rc.local ausgeführt und die Linux-Gastumgebung installiert. Den Fortschritt dieses Skripts können Sie beobachten, wenn Sie die Konsolenlogs auf Zeilen überprüfen, die vom temporären Skript rc.local ausgegeben wurden. Verwenden Sie hierzu beispielsweise gcloud, wie unten gezeigt. Ändern Sie REPLACEMENT_INSTANCE_NAME in den Namen, den Sie der Ersatzinstanz zugewiesen haben.

    gcloud compute instances get-serial-port-output REPLACEMENT_INSTANCE_NAME

  9. Die Ersatzinstanz wird automatisch noch einmal neu gestartet, wenn das Skript rc.local abgeschlossen ist. Ab dem zweiten Neustart können Sie anhand des zugehörigen Konsolenlogs feststellen, ob die Gastumgebung geladen wird. Überprüfen Sie, ob Sie mit SSH eine Verbindung zur Instanz herstellen können.

  10. Wenn Sie sicher sind, dass die Ersatzinstanz funktionsfähig ist, können Sie die problematische Instanz beenden oder löschen.

Gastumgebung validieren

Das Vorhandensein einer Gastumgebung kann entweder durch Überprüfen der Systemprotokolle, die während des Startvorgangs einer Instanz an die Konsole ausgegeben werden, oder durch Auflisten der installierten Pakete während der Verbindung mit der Instanz bestimmt werden.

Erwartete Konsolen-Logs für die Gastumgebung

Diese Tabelle enthält eine Übersicht über die erwartete Ausgabe für Konsolen-Logs, die von Instanzen mit aktiven Gastumgebungen beim Start ausgegeben werden.

Betriebssystem Dienstverwaltung Erwartete Ausgabe
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 und 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

Führen Sie die folgenden Schritte aus, um Konsolen-Logs für eine Instanz anzuzeigen.

Console

  1. Gehen Sie zur Seite "VM-Instanzen".

    Zur Seite "VM-Instanzen"

    1. Klicken Sie auf die Instanz, die Sie untersuchen möchten.
    2. Führen Sie einen Neustart oder eine Zurücksetzung der Instanz durch.
    3. Klicken Sie unter Logs auf Serieller Port 1 (Konsole).
    4. Suchen Sie nach der erwarteten Ausgabe, die auf die obige Tabelle verweist.

gcloud

  1. Führen Sie einen Neustart oder eine Zurücksetzung der Instanz durch.
  2. Verwenden Sie den Unterbefehl gcloud compute get-serial-port-output, um mithilfe des gcloud-Befehlszeilentools eine Verbindung herzustellen. Beispiel:

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

    [INSTANCE_NAME] ist der Name der Instanz, die Sie untersuchen möchten.

  3. Suchen Sie nach der erwarteten Ausgabe, die auf die obige Tabelle verweist.

Geladene Dienste für die Gastumgebung

Diese Tabelle enthält eine Übersicht über die Dienste, die auf Instanzen mit aktiven Gastumgebungen geladen sein sollten. Der Befehl zum Auflisten von Diensten muss nach dem Herstellen einer Verbindung zur Instanz ausgeführt werden. Daher kann diese Überprüfung nur durchgeführt werden, wenn Sie über entsprechenden Zugriff verfügen.

Betriebssystem Befehl zum Auflisten von Diensten Erwartete Ausgabe
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

Installierte Pakete für die Gastumgebung

Diese Tabelle enthält eine Übersicht über die Pakete, die auf Instanzen mit aktiven Gastumgebungen installiert sein sollten. Der Befehl zum Auflisten von installierten Paketen muss nach dem Herstellen einer Verbindung zur Instanz ausgeführt werden. Daher kann diese Überprüfung nur durchgeführt werden, wenn Sie über entsprechenden Zugriff verfügen.

Betriebssystem Befehl zum Auflisten von Paketen Erwartete Ausgabe
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

Weitere Informationen

Hat Ihnen diese Seite weitergeholfen? Teilen Sie uns Ihr Feedback mit:

Feedback geben zu...

Compute Engine-Dokumentation