Adapter les systèmes d'exploitation pour Trusted Cloud by S3NS

Ce document explique comment adapter les images de système d'exploitation (OS) dansTrusted Cloud by S3NS pour utiliser les images d'OS Enterprise pour lesquelles vous disposez d'une licence.

Trusted Cloud by S3NS fournit des images d'OS pour Debian, Ubuntu LTS, Rocky Linux et Container-Optimized OS. Si vous souhaitez utiliser l'une de ces images fournies, passez à la section Créer une instance et sélectionnez l'image que vous souhaitez utiliser lors de la création de l'instance.

Si vous disposez d'une licence pour un OS d'entreprise pour lequel Trusted Cloud by S3NS aucune image d'OS n'est fournie (par exemple, Windows, Red Hat Enterprise Linux (RHEL) ou SUSE Linux Enterprise Server (SLES)), utilisez le script fourni dans ce document pour adapter une image à votre licence. Le script installe les pilotes nécessaires pour que vous puissiez utiliser votre image afin de créer des instances dans Trusted Cloud by S3NS.

Avant de commencer

  • Installez le processeur de ligne de commande jq.
  • Si vous ne l'avez pas déjà fait, importez un disque contenant l'image d'OS que vous souhaitez utiliser dans un bucket Cloud Storage.
  • Vérifiez que vous disposez des autorisations requises pour créer des images personnalisées.
  • Si ce n'est pas déjà fait, configurez l'authentification. L'authentification est le processus permettant de valider votre identité pour accéder aux services et aux API Trusted Cloud by S3NS . Pour exécuter du code ou des exemples depuis un environnement de développement local, vous pouvez vous authentifier auprès de Compute Engine en sélectionnant l'une des options suivantes :

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

    gcloud

    1. Installez la Google Cloud CLI, puis connectez-vous à la gcloud CLI avec votre identité fédérée. Après vous être connecté, initialisez Google Cloud CLI en exécutant la commande suivante :

      gcloud init
    2. Set a default region and zone.

    REST

    Pour utiliser les exemples d'API REST de cette page dans un environnement de développement local, vous devez utiliser les identifiants que vous fournissez à gcloud CLI.

      Installez la Google Cloud CLI, puis connectez-vous à la gcloud CLI avec votre identité fédérée. Après vous être connecté, initialisez Google Cloud CLI en exécutant la commande suivante :

      gcloud init

    Pour en savoir plus, consultez la section S'authentifier pour utiliser REST dans la documentation sur l'authentification Trusted Cloud .

Script d'adaptation de l'OS

Pour vous aider à adapter les images pour Trusted Cloud by S3NS, Trusted Cloud by S3NS fournit un script qui effectue les étapes suivantes :

  1. Crée une instance avec le disque provenant de Cloud Storage et exécute l'outil d'adaptation de l'OS sur le disque de l'instance. Ce processus installe les pilotes nécessaires au fonctionnement de votre image d'OS sur Trusted Cloud by S3NS.
  2. Extrait le rapport d'adaptation de l'OS et copie les fichiers de sortie sur votre ordinateur local. Ce rapport fournit des informations sur les résultats du processus d'adaptation, ainsi que des détails sur l'OS détecté. Si le script ne s'exécute pas correctement, le rapport fournit des erreurs, des avertissements et des éléments d'action pour résoudre les problèmes d'adaptation.
  3. Crée une image à partir du disque de l'instance. Vous pouvez ensuite utiliser cette image pour créer des instances sur Trusted Cloud by S3NS.
  4. Supprime l'instance et le disque créés lors de ce processus. Cette étape permet de supprimer les ressources inutiles de votre projet.

Le script suivant adapte les images pour les utiliser dans Trusted Cloud by S3NS :

Script d'adaptation de l'OS complet

#!/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.s3nsapis.fr/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}"

Exécuter le script d'adaptation de l'OS

Pour adapter votre image d'OS à Trusted Cloud by S3NS, procédez comme suit :

  1. Créez un script shell.
  2. Copiez le script d'adaptation de l'OS et collez-le dans votre fichier de script shell.
  3. Exécutez votre script shell avec les indicateurs suivants :

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

    Remplacez les éléments suivants :

    • SCRIPT_NAME : nom du fichier de script d'adaptation de l'OS
    • INPUT_GCS_OBJECT : chemin d'accès au disque dans votre bucket Cloud Storage
    • IMAGE_NAME : nom de l'image adaptée.
    • ZONE : zone de l'image adaptée
    • PROJECT : ID de votre projet Trusted Cloud by S3NS
    • TPC_PREFIX : préfixe utilisé pour les noms de vos ressources

Une fois le script exécuté correctement, le message suivant s'affiche :

Adapted image: IMAGE_NAME

Étapes suivantes

Créez une instance à partir de votre image.