Menyesuaikan sistem operasi untuk Trusted Cloud by S3NS

Dokumen ini menjelaskan cara menyesuaikan image sistem operasi (OS) di Trusted Cloud by S3NS untuk menggunakan image OS Enterprise yang lisensinya Anda miliki.

Trusted Cloud by S3NS menyediakan image OS untuk Debian, Ubuntu LTS, Rocky Linux, dan Container-Optimized OS. Jika Anda ingin menggunakan salah satu gambar yang disediakan ini, lanjutkan untuk membuat instance dan pilih gambar yang ingin Anda gunakan selama pembuatan instance.

Jika Anda memiliki lisensi untuk OS tingkat perusahaan yang Trusted Cloud by S3NS tidak menyediakan image OS, seperti Windows, Red Hat Enterprise Linux (RHEL), atau SUSE Linux Enterprise Server (SLES), gunakan skrip yang disediakan dalam dokumen ini untuk menyesuaikan image agar dapat digunakan dengan lisensi Anda. Skrip ini menginstal driver yang diperlukan agar Anda dapat menggunakan image untuk membuat instance di Trusted Cloud by S3NS.

Sebelum memulai

Skrip adaptasi OS

Untuk membantu Anda menyesuaikan gambar untuk Trusted Cloud by S3NS, Trusted Cloud by S3NS menyediakan skrip yang menyelesaikan langkah-langkah berikut:

  1. Membuat instance dengan disk dari Cloud Storage dan menjalankan alat adaptasi OS di disk instance. Proses ini menginstal driver yang diperlukan agar image OS Anda berfungsi di Trusted Cloud by S3NS.
  2. Mengekstrak laporan adaptasi OS dan menyalin file output ke komputer lokal Anda. Laporan ini memberikan informasi tentang hasil proses adaptasi, beserta detail tentang OS yang terdeteksi. Jika skrip tidak berhasil dijalankan, laporan akan memberikan error, peringatan, dan item tindakan untuk memperbaiki masalah adaptasi.
  3. Membuat image dari disk instance. Kemudian, Anda dapat menggunakan image ini untuk membuat instance di Trusted Cloud by S3NS.
  4. Menghapus instance dan disk yang dibuat selama proses ini. Langkah ini membersihkan resource yang tidak diperlukan dari project Anda.

Skrip berikut menyesuaikan gambar untuk digunakan di Trusted Cloud by S3NS:

Skrip adaptasi OS lengkap

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

Jalankan skrip adaptasi OS

Untuk menyesuaikan image OS Anda untuk Trusted Cloud by S3NS, lakukan hal berikut:

  1. Buat skrip shell.
  2. Salin skrip adaptasi OS dan tempelkan ke file skrip shell Anda.
  3. Jalankan skrip shell Anda dengan tanda berikut:

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

    Ganti kode berikut:

    • SCRIPT_NAME: nama file skrip adaptasi OS
    • INPUT_GCS_OBJECT: jalur ke disk di bucket Cloud Storage Anda
    • IMAGE_NAME: nama untuk image yang diadaptasi
    • ZONE: zona untuk gambar yang diadaptasi
    • PROJECT: Trusted Cloud by S3NS project ID Anda
    • TPC_PREFIX: awalan yang digunakan untuk nama resource Anda

Setelah skrip berhasil dijalankan, skrip akan mencetak pesan berikut:

Adapted image: IMAGE_NAME

Langkah berikutnya

Buat instance dari image Anda.