Trusted Cloud by S3NS용 운영체제 조정

이 문서에서는 라이선스가 있는 엔터프라이즈 OS 이미지를 사용하도록Trusted Cloud by S3NS 의 운영체제(OS) 이미지를 조정하는 방법을 설명합니다.

Trusted Cloud by S3NS 는 Debian, Ubuntu LTS, Rocky Linux, Container-Optimized OS용 OS 이미지를 제공합니다. 제공된 이미지 중 하나를 사용하려면 인스턴스 만들기로 이동하여 인스턴스 생성 중에 사용할 이미지를 선택합니다.

Windows, Red Hat Enterprise Linux(RHEL), SUSE Linux Enterprise Server(SLES)와 같이 Trusted Cloud by S3NS 에서 OS 이미지를 제공하지 않는 엔터프라이즈 OS 라이선스가 있는 경우 이 문서에 제공된 스크립트를 사용하여 라이선스와 함께 사용할 이미지를 조정합니다. 이 스크립트는 이미지를 사용하여 Trusted Cloud by S3NS에서 인스턴스를 만드는 데 필요한 드라이버를 설치합니다.

시작하기 전에

OS 조정 스크립트

Trusted Cloud by S3NS에 맞게 이미지를 조정하는 데 도움이 되도록 Trusted Cloud by S3NS 에서는 다음 단계를 완료하는 스크립트를 제공합니다.

  1. Cloud Storage의 디스크로 인스턴스를 만들고 인스턴스의 디스크에서 OS 조정 도구를 실행합니다. 이 프로세스는 OS 이미지가 Trusted Cloud by S3NS에서 작동하는 데 필요한 드라이버를 설치합니다.
  2. OS 조정 보고서를 추출하고 출력 파일을 로컬 머신에 복사합니다. 이 보고서에는 감지된 OS에 관한 세부정보와 함께 조정 프로세스의 결과에 관한 정보가 제공됩니다. 스크립트가 실행되지 않으면 보고서에 조정 문제를 해결하기 위한 오류, 경고, 작업 항목이 제공됩니다.
  3. 인스턴스의 디스크에서 이미지를 만듭니다. 그런 다음 이 이미지를 사용하여 Trusted Cloud by S3NS에서 인스턴스를 만들 수 있습니다.
  4. 이 과정에서 생성된 인스턴스와 디스크를 삭제합니다. 이 단계에서는 프로젝트에서 불필요한 리소스를 정리합니다.

다음 스크립트는 Trusted Cloud by S3NS에서 사용할 수 있도록 이미지를 조정합니다.

전체 OS 조정 스크립트

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

OS 조정 스크립트 실행

Trusted Cloud by S3NS에 맞게 OS 이미지를 조정하려면 다음 단계를 따르세요.

  1. 셸 스크립트를 만듭니다.
  2. OS 조정 스크립트를 복사하여 셸 스크립트 파일에 붙여넣습니다.
  3. 다음 플래그를 사용하여 셸 스크립트를 실행합니다.

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

    다음을 바꿉니다.

    • SCRIPT_NAME: OS 조정 스크립트 파일의 이름
    • INPUT_GCS_OBJECT: Cloud Storage 버킷의 디스크 경로
    • IMAGE_NAME: 조정된 이미지의 이름
    • ZONE: 조정된 이미지의 영역
    • PROJECT: Trusted Cloud by S3NS 프로젝트 ID
    • TPC_PREFIX: 리소스 이름에 사용되는 프리픽스

스크립트가 성공적으로 실행되면 다음 메시지가 출력됩니다.

Adapted image: IMAGE_NAME

다음 단계

이미지에서 인스턴스를 만듭니다.