Betriebssysteme für Google Cloud anpassen


In diesem Dokument wird beschrieben, wie Sie Betriebssystem-Images (OS) inGoogle Cloud anpassen, um die Enterprise-Betriebssystem-Images zu verwenden, für die Sie Lizenzen haben.

Google Cloud bietet Betriebssystem-Images für Debian, Ubuntu LTS, Rocky Linux und Container-Optimized OS. Wenn Sie eines dieser bereitgestellten Images verwenden möchten, erstellen Sie eine Instanz und wählen Sie das gewünschte Image während der Instanzerstellung aus.

Wenn Sie eine Lizenz für ein Enterprise-Betriebssystem haben, für das Google Cloud kein Betriebssystem-Image bereitgestellt wird, z. B. Windows, Red Hat Enterprise Linux (RHEL) oder SUSE Linux Enterprise Server (SLES), verwenden Sie das in diesem Dokument bereitgestellte Skript, um ein Image für die Verwendung mit Ihrer Lizenz anzupassen. Das Skript installiert die Treiber, die erforderlich sind, damit Sie Ihr Image zum Erstellen von Instanzen in Google Cloudverwenden können.

Hinweise

  • Installieren Sie den jq-Befehlszeilenprozessor.
  • Wenn Sie das noch nicht getan haben, laden Sie ein Laufwerk mit dem Betriebssystem-Image, das Sie verwenden möchten, in einen Cloud Storage-Bucket hoch.
  • Prüfen Sie, ob Sie die erforderlichen Berechtigungen zum Erstellen benutzerdefinierter Bilder haben.
  • Richten Sie die Authentifizierung ein, falls Sie dies noch nicht getan haben. Bei der Authentifizierung wird Ihre Identität für den Zugriff auf Google Cloud -Dienste und APIs überprüft. Zum Ausführen von Code oder Beispielen aus einer lokalen Entwicklungsumgebung können Sie sich so bei Compute Engine authentifizieren:

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

    gcloud

    1. Installieren Sie die Google Cloud CLI. Initialisieren Sie die Google Cloud CLI nach der Installation mit dem folgenden Befehl:

      gcloud init

      Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.

    2. Set a default region and zone.

    REST

    Wenn Sie die REST API-Beispiele auf dieser Seite in einer lokalen Entwicklungsumgebung verwenden möchten, nutzen Sie die Anmeldedaten, die Sie der gcloud CLI bereitstellen.

      Installieren Sie die Google Cloud CLI. Initialisieren Sie die Google Cloud CLI nach der Installation mit dem folgenden Befehl:

      gcloud init

      Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.

    Weitere Informationen finden Sie in der Dokumentation zur Google Cloud -Authentifizierung unter Für die Verwendung von REST authentifizieren.

Skript zur Betriebssystemanpassung

Damit Sie Bilder für Google Cloudanpassen können, Google Cloud bietet ein Skript, das die folgenden Schritte ausführt:

  1. Erstellt eine Instanz mit dem Laufwerk aus Cloud Storage und führt das Tool zur Betriebssystemanpassung auf dem Laufwerk der Instanz aus. Bei diesem Vorgang werden die Treiber installiert, die für die Funktion Ihres Betriebssystem-Images auf Google Clouderforderlich sind.
  2. Extrahiert den Bericht zur Betriebssystemanpassung und kopiert die Ausgabedateien auf Ihren lokalen Computer. Dieser Bericht enthält Informationen zu den Ergebnissen des Anpassungsprozesses sowie Details zum erkannten Betriebssystem. Wenn das Skript nicht erfolgreich ausgeführt wird, enthält der Bericht Fehler, Warnungen und Maßnahmen zur Behebung von Anpassungsproblemen.
  3. Erstellt ein Image vom Laufwerk der Instanz. Anschließend können Sie dieses Image verwenden, um Instanzen auf Google Cloudzu erstellen.
  4. Löscht die Instanz und das Laufwerk, die während dieses Vorgangs erstellt wurden. Bei diesem Schritt werden nicht benötigte Ressourcen aus Ihrem Projekt entfernt.

Mit dem folgenden Skript werden Bilder für die Verwendung in Google Cloudangepasst:

Vollständiges Skript zur Betriebssystemanpassung

#!/usr/bin/env bash

# Sets variables

set -e
set -x
set -o pipefail

UNIQUE_ID=''
TPC_PREFIX=''
ZONE=''
PROJECT=''
INPUT_IMAGE=''
INPUT_DISK=''
IMAGE_NAME=''
ADAPTATION_INSTANCE_TYPE='c3-highcpu-4' # needs to support nested virtualization



usage() {
  echo ""
  echo "Usage:"
  echo "       $0 -g  -o -z -t  -p "
  echo ""
  echo ""
  echo "Parameters:"
  echo "       -i  OR -d  OR -g "
  echo "       -o "
  echo "       -z "
  echo "       -t "
  echo "       -p "
  echo "       -h (help)"
  echo ""
}

while getopts ":i:d:g:o:z:t:p:h" opt; do
  case "${opt}" in
    i)
      INPUT_IMAGE="${OPTARG}"
      ;;
    d)
      INPUT_DISK="${OPTARG}"
      ;;
    g)
      INPUT_GCS_OBJECT="${OPTARG}"
      ;;
    o)
      IMAGE_NAME="${OPTARG}"
      ;;
    z)
      ZONE="${OPTARG}"
      ;;
    t)
      TPC_PREFIX="${OPTARG}"
      ;;
    p)
      PROJECT="${OPTARG}"
      ;;
    h)
      echo "$0 help:"
      usage
      exit 0
      ;;
    *)
      echo "Unknown arg -${opt} ${OPTARG}"
      usage
      exit 1
      ;;
  esac
done
shift $((OPTIND-1))

# Defines errors

if [[ -n "${INPUT_IMAGE}" && -n "${INPUT_DISK}" ]] ||
   [[ -n "${INPUT_IMAGE}" && -n "${INPUT_GCS_OBJECT}" ]] ||
   [[ -n "${INPUT_DISK}" && -n "${INPUT_GCS_OBJECT}" ]]; then
  echo "Only one of -i, -d, or -g must be specified"
  usage
  exit 1
fi

if [[ -z "${IMAGE_NAME}" ]]; then
  echo "The name of the image must be specified"
  usage
  exit 1
fi

if [[ -z "${ZONE}" ]]; then
  echo "Zone must be specified"
  usage
  exit 1
fi

if [[ -z "${TPC_PREFIX}" ]]; then
  echo "TPC prefix must be specified"
  usage
  exit 1
fi

if [[ -z "${PROJECT}" ]]; then
  echo "Project must be specified"
  usage
  exit 1
fi

# Creates disk

OS_ADAPTATION_IMAGE="projects/${TPC_PREFIX}:v2v-community/global/images/family/v2v-tpc-stable"

if [[ -z "${UNIQUE_ID}" ]]; then
  UNIQUE_ID=$(head /dev/urandom | tr -dc a-z0-9 | head -c4)
fi

if [[ -n "${INPUT_IMAGE}" ]]; then
  DISK_ID="${IMAGE_NAME}-disk-${UNIQUE_ID}"
  echo "Creating disk ${DISK_ID} from image ${INPUT_IMAGE}..."
  gcloud compute disks create "${DISK_ID}" --zone="${ZONE}" --image "${INPUT_IMAGE}"
elif [[ -n "${INPUT_GCS_OBJECT}" ]]; then
  DISK_ID="${IMAGE_NAME}-disk-${UNIQUE_ID}"

  echo "Creating disk ${DISK_ID} from GCS object ${INPUT_GCS_OBJECT}..."
  CURL_OUTPUT=$(curl \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H 'Content-Type: application/json' \
    -X POST  \
    "https://compute.googleapis.com/compute/v1/projects/${TPC_PREFIX}:${PROJECT}/zones/${ZONE}/disks" \
    -d '{"name":"'"${DISK_ID}"'", "sourceStorageObject":"'"${INPUT_GCS_OBJECT}"'"}')
  OPERATION_ID=$(jq -r '.name' <<< "${CURL_OUTPUT}")
  while ! gcloud compute operations describe --zone "${ZONE}" --format=json \
    "${OPERATION_ID}" | jq -e '.status == "DONE"' >/dev/null; do
    sleep 5
  done
elif [[ -n "${INPUT_DISK}" ]]; then
  DISK_ID="${INPUT_DISK}"
fi

QUERY_PATH='v2v/report'
DEVICE_NAME="dev-${UNIQUE_ID}"
OUTPUT_DIR='/var/v2v'
STARTUP_SCRIPT="docker run --privileged -v /dev:/dev -v ${OUTPUT_DIR}:${OUTPUT_DIR} v2v-tpc -vv --log file=${OUTPUT_DIR}/output.log,level=trace --report file=${OUTPUT_DIR}/report.json --report file=http://metadata.google.internal/computeMetadata/v1/instance/guest-attributes/${QUERY_PATH},headers=Metadata-Flavor=Google --license=byol --in-place --drive file=/dev/disk/by-id/google-${DEVICE_NAME},format=raw"

# Creates instance and runs adaptation tool on disk

echo "Adapting disk ${DISK_ID}"

INSTANCE="os-adaptation-instance-${UNIQUE_ID}"
gcloud compute instances create "${INSTANCE}" \
  --zone="${ZONE}" \
  --machine-type="${ADAPTATION_INSTANCE_TYPE}" \
  --enable-nested-virtualization \
  --metadata="^@@@^enable-guest-attributes=TRUE@@@startup-script=${STARTUP_SCRIPT}" \
  --create-disk="auto-delete=yes,boot=yes,image=${OS_ADAPTATION_IMAGE}" \
  --disk="name=${DISK_ID},auto-delete=no,device-name=${DEVICE_NAME}"


# Retrieves report

while [[ -z "${REPORT}" ]]; do
  sleep 5
  set +e
  REPORT=$(gcloud compute instances get-guest-attributes "${INSTANCE}" \
    --zone="${ZONE}" \
    --query-path="${QUERY_PATH}" \
    --format='value(value)') 2>/dev/null
  echo -n '.'
  set -e
done
echo "Operating System adaptation report:"
jq . <<< "${REPORT}"

gcloud compute scp --recurse "${INSTANCE}:${OUTPUT_DIR}" "$(pwd)"
echo "Output file: $(pwd)/v2v/output.log, Report file: $(pwd)/v2v/report.json"

echo "Deleting ${INSTANCE}..."
gcloud compute instances delete "${INSTANCE}" --zone="${ZONE}" --quiet

if jq --exit-status '.status != "SUCCESS"' <<< "${REPORT}" >/dev/null; then
  echo "Operating System adaptation failed"
  exit 1
fi

# Creates image

echo "Operating System adaptation successful, creating image..."

IMAGE="image-${UNIQUE_ID}"
gcloud compute images create "${IMAGE}" \
  --source-disk-zone="${ZONE}" \
  --guest-os-features="$(jq --raw-output '.guest_os_features | join(",")' <<< "${REPORT}")" \
  --source-disk="${DISK_ID}"

if [[ -z "${INPUT_DISK}" ]]; then
  gcloud compute disks delete "${DISK_ID}" --zone="${ZONE}" --quiet
fi

echo "Adapted image: ${IMAGE}"

Betriebssystemanpassungsskript ausführen

So passen Sie Ihr Betriebssystem-Image für Google Cloudan:

  1. Erstellen Sie ein Shell-Skript.
  2. Kopieren Sie das Script zur Anpassung an das Betriebssystem und fügen Sie es in Ihre Shell-Script-Datei ein.
  3. Führen Sie Ihr Shell-Skript mit den folgenden Flags aus:

    SCRIPT_NAME \
     -g 'INPUT_GCS_OBJECT' \
     -o 'IMAGE_NAME' \
     -z 'ZONE' \
     -p 'PROJECT' \
     -t 'TPC_PREFIX'

    Ersetzen Sie Folgendes:

    • SCRIPT_NAME: der Name der Datei mit dem Betriebssystemanpassungsskript
    • INPUT_GCS_OBJECT: der Pfad zum Laufwerk in Ihrem Cloud Storage-Bucket
    • IMAGE_NAME: der Name für das angepasste Image
    • ZONE: die Zone für das angepasste Bild
    • PROJECT: Ihre Google Cloud -Projekt-ID
    • TPC_PREFIX: ein Präfix, das für Ihre Ressourcennamen verwendet wird

Nachdem das Skript erfolgreich ausgeführt wurde, wird die folgende Meldung ausgegeben:

Adapted image: IMAGE_NAME

Nächste Schritte

Instanz aus Ihrem Image erstellen