게스트 환경 설치

이 페이지에서는 Compute Engine에서 실행 중인 VM 인스턴스용 게스트 환경을 수동 설치하는 방법을 설명합니다.

Google 제공 공개 이미지를 통해 생성된 VM 인스턴스를 사용하는 대부분의 경우에는 게스트 환경을 수동으로 설치할 필요가 없습니다.

게스트 환경의 수동 설치가 필요한지 판단하려면 다음 항목을 확인해 보세요.

시작하기 전에

목차

운영체제 지원

게스트 환경 수동 설치는 다음 운영체제에서 지원됩니다.

  • Ubuntu 14.04 이상
  • CentOS 6 및 7
  • Red Hat Enterprise Linux(RHEL) 6 및 7
  • Debian 9
  • Windows Server 2019
  • Windows Server 1809 및 1803
  • Windows Server 1709
  • Windows Server 2016
  • Windows Server 2012 R2
  • Windows Server 2008 R2
  • Windows Server의 SQL Server
  • Windows BYOL(베타):
    • Windows 7
    • Windows 10

게스트 환경을 설치할 때는 가져오기 도구를 사용하는 것이 좋습니다. 설치 옵션 목록은 설치 방법을 참조하세요.

SUSE, CoreOS, 컨테이너 최적화 운영체제의 경우 게스트 환경을 수동으로 설치할 수 없습니다. 게스트 환경은 모든 공개 이미지의 핵심으로 포함되어 있으므로, 이 운영체제 중 하나가 필요한 경우에는 공개 이미지를 사용하는 것이 좋습니다.

게스트 환경 설치

설치 방법

게스트 환경은 다음 3가지 방법으로 설치할 수 있습니다. 다음 옵션 중 하나를 선택하세요.

현재 위치에 게스트 환경 설치

SSH를 통해 대상 인스턴스에 연결할 수 있는 경우에는 이 방법을 사용하여 게스트 환경을 설치합니다. 게스트 환경을 설치할 인스턴스에 연결할 수 없는 경우에는 부팅 디스크를 클론하고 시작 스크립트를 사용하여 게스트 환경을 설치합니다.

이 절차는 SSH 암호 기반 인증을 사용하여 가져온 이미지에 연결할 수 있는 경우에 유용합니다. 함수 키 기반 SSH를 사용하는 사용자 계정이 하나 이상 있는 경우에도 이 방법을 사용하여 게스트 환경을 다시 설치할 수 있습니다.

CentOS/RHEL

  1. 사용 중인 운영체제 버전이 지원되는지 확인합니다.
  2. CentOS/RHEL 버전을 확인하고 소스 저장소 파일 /etc/yum.repos.d/google-cloud.repo를 만듭니다.

    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-stable
    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
    
  3. 패키지 목록을 업데이트합니다.

    sudo yum makecache
    sudo yum updateinfo
    
  4. 게스트 환경 패키지를 설치합니다.

    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
    
  5. 인스턴스를 다시 시작하고 콘솔 로그를 검사하여 백업을 시작할 때 게스트 환경이 로드되는지 확인합니다.

  6. SSH를 사용하여 인스턴스에 연결할 수 있는지 확인합니다.

Debian

  1. 사용 중인 운영체제 버전이 지원되는지 확인합니다.
  2. 공개 저장소 GPG 키를 설치합니다.

    curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
    
  3. Debian 배포판의 이름을 확인하고 소스 목록 파일 /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
    
  4. 패키지 목록을 업데이트합니다.

    sudo apt-get update
    
  5. 게스트 환경 패키지를 설치합니다.

    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
    
  6. 인스턴스를 다시 시작하고 콘솔 로그를 검사하여 백업을 시작할 때 게스트 환경이 로드되는지 확인합니다.

  7. SSH를 통해 인스턴스에 연결할 수 있는지 확인합니다.

Ubuntu

  1. 사용 중인 운영체제 버전이 지원되는지 확인합니다.

  2. Universe 저장소를 사용 설정합니다. Canonical은 게스트 환경용 패키지를 Universe 저장소에 게시합니다.

    sudo apt-add-repository universe
    
  3. 패키지 목록을 업데이트합니다.

    sudo apt-get update
    
  4. 게스트 환경 패키지를 설치합니다.

    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
    
  5. 인스턴스를 다시 시작하고 콘솔 로그를 검사하여 백업을 시작할 때 게스트 환경이 로드되는지 확인합니다.

  6. SSH를 통해 인스턴스에 연결할 수 있는지 확인합니다.

Windows

시작하기 전에 사용 중인 운영체제 버전이 지원되는지 확인합니다.

Windows 게스트 환경을 설치하려면 권한 상승된 PowerShell 버전 3.0 이상 프롬프트에서 다음 명령어를 실행하세요. 아래의 안내에 나온 Invoke-WebRequest 명령어를 실행하려면 PowerShell 버전 3.0 이상이 필요합니다.

  1. GooGet을 다운로드하고 설치합니다.

    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    Invoke-WebRequest https://github.com/google/googet/releases/download/v2.13.0/googet.exe -OutFile $env:temp\googet.exe
    & "$env:temp\googet.exe" -root C:\ProgramData\GooGet -noconfirm install -sources \
    https://packages.cloud.google.com/yuck/repos/google-compute-engine-stable googet
    Remove-Item "$env:temp\googet.exe"
    

    설치 도중 GooGet은 시스템 환경에 콘텐츠를 추가합니다. 설치가 완료되면 새 PowerShell 콘솔을 실행하거나 googet.exe 파일의 전체 경로(C:\ProgramData\GooGet\googet.exe)를 제공하세요.

  2. 새 콘솔 창을 열고 google-compute-engine-stable 저장소를 추가합니다.

    googet addrepo google-compute-engine-stable https://packages.cloud.google.com/yuck/repos/google-compute-engine-stable
    
  3. Windows 게스트 환경의 코어 패키지를 설치합니다.

    googet -noconfirm install google-compute-engine-windows \
    google-compute-engine-sysprep google-compute-engine-metadata-scripts \
    google-compute-engine-vss
    
  4. Windows 게스트 환경의 옵션 패키지를 설치합니다.

    googet -noconfirm install google-compute-engine-auto-updater
    

    googet 명령어를 사용하세요.

    사용 가능한 패키지를 보려면 googet available 명령어를 실행합니다.

    설치된 패키지를 보려면 googet installed 명령어를 실행합니다.

    최신 패키지 버전으로 업데이트하려면 googet update 명령어를 실행합니다.

    명령어를 더 보려면 googet help를 실행합니다.

부팅 디스크 클론 및 시작 스크립트 사용

게스트 환경을 수동으로 설치할 인스턴스에 연결할 수 없는 경우 이 절차를 사용하여 게스트 환경을 설치합니다. 이 절차에는 다음과 같이 GCP Console 및 Cloud Shell에서 완료할 수 있는 단계가 포함됩니다.

이 절차는 Linux 배포에만 사용할 수 있습니다. Windows의 경우 다른 2가지 설치 방법을 사용하세요.

이 절차는 Cloud Shell에서 실행합니다.

CentOS/RHEL

  1. 사용 중인 운영체제 버전이 지원되는지 확인합니다.
  2. 공개 저장소 GPG 키를 설치합니다.
  3. 복구 인스턴스로 사용할 새 인스턴스를 만듭니다. 이 인스턴스 이름을 rescue로 지정합니다. 이 복구 인스턴스는 문제가 있는 인스턴스와 동일한 Linux OS를 실행하지 않아도 됩니다. 이 예시에서는 복구 인스턴스에서 Debian 9을 사용합니다.

  4. 문제가 있는 인스턴스를 중지하고 부팅 디스크의 복사본을 만듭니다.

    1. 문제가 있는 인스턴스의 변수 이름을 설정합니다. 이렇게 하면 이후 단계에서 인스턴스를 쉽게 참조할 수 있습니다.

      export PROB_INSTANCE_NAME=INSTANCE_NAME
      

      여기서 INSTANCE_NAME은 문제가 있는 인스턴스의 이름입니다.

    2. 문제가 있는 인스턴스를 중지합니다.

      gcloud compute instances stop "$PROB_INSTANCE_NAME"
      
    3. 문제가 있는 인스턴스의 부팅 디스크 이름을 가져옵니다.

      export PROB_INSTANCE_DISK="$(gcloud compute instances describe \
      "$PROB_INSTANCE_NAME" --format='json' |  jq -r '.disks[] | \
      select(.boot == true) | .source')"
      
    4. 부팅 디스크의 스냅샷을 만듭니다.

      export DISK_SNAPSHOT="${PROB_INSTANCE_NAME}-snapshot"
      
      gcloud compute disks snapshot "$PROB_INSTANCE_DISK" \
      --snapshot-names "$DISK_SNAPSHOT"
      
    5. 스냅샷에서 새 디스크를 만듭니다.

      export NEW_DISK="${PROB_INSTANCE_NAME}-new-disk"
      
      gcloud compute disks create "$NEW_DISK" \
      --source-snapshot="$DISK_SNAPSHOT"
      
    6. 스냅샷을 삭제합니다.

      gcloud compute snapshots delete "$DISK_SNAPSHOT"
      
  5. 새 디스크를 복구 인스턴스에 연결하고 복구 인스턴스의 루트 볼륨을 마운트합니다. 이 절차에서는 추가 디스크를 하나만 연결하므로 새 디스크의 기기 식별자는 /dev/sdb가 됩니다. CentOS/RHEL은 기본적으로 디스크의 첫 번째 볼륨을 루트 볼륨으로 사용하므로 볼륨 식별자는 /dev/sdb1이 됩니다. 커스텀의 경우 lsblk를 사용하여 볼륨 식별자를 결정합니다.

    gcloud compute instances attach-disk rescue --disk "$NEW_DISK"
    
  6. SSH를 통해 복구 인스턴스에 연결합니다.

    gcloud compute ssh rescue
    
  7. 복구 인스턴스에서 다음 단계를 실행합니다.

    1. 새 디스크의 루트 볼륨을 마운트합니다.

      export 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. 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. rc.local 스크립트를 새 디스크의 루트 볼륨으로 옮기고 권한을 설정합니다. 기존 rc.local 스크립트를 다른 위치로 옮깁니다. 완료되면 이 스크립트가 임시 스크립트로 대체됩니다.

      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. 새 디스크의 루트 볼륨을 마운트 해제합니다.

      sudo umount "$NEW_DISK_MOUNT_POINT" && sudo rmdir \
      "$NEW_DISK_MOUNT_POINT"
      
    5. 복구 인스턴스의 SSH 세션을 종료합니다.

  8. 복구 인스턴스에서 새 디스크를 분리합니다.

    gcloud compute instances detach-disk rescue --disk "$NEW_DISK"
    
  9. 대체 인스턴스로 사용할 새 인스턴스를 만듭니다. 대체 인스턴스를 만들 때 새 디스크를 부팅 디스크로 지정합니다. Cloud Console을 사용하여 대체 인스턴스를 만들 수 있습니다.

    1. VM 인스턴스 페이지로 이동합니다.

      VM 인스턴스 페이지로 이동

    2. 문제 인스턴스를 클릭한 다음 복제를 클릭합니다.
    3. 대체 인스턴스의 이름을 지정합니다. 부팅 디스크 섹션에서 변경을 클릭한 다음 기존 디스크를 클릭합니다. 새 디스크를 선택합니다.
    4. 만들기를 클릭합니다. 인스턴스가 생성되면 대체 인스턴스가 자동으로 시작됩니다.

    대체 인스턴스가 시작되면 임시 rc.local 스크립트가 실행되고 게스트 환경이 설치됩니다. 이 스크립트의 진행 상황을 보려면 임시 rc.local 스크립트가 생성하는 줄의 콘솔 로그를 검사합니다. 로그를 보려면 다음 명령어를 실행합니다.

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

    여기서 [REPLACEMENT_INSTANCE_NAME]은 대체 인스턴스에 할당한 이름입니다.

    임시 rc.local 스크립트가 완료되면 대체 인스턴스가 자동으로 재부팅됩니다. 두 번째 재부팅될 때 콘솔 로그를 검사하여 게스트 환경이 로드되는지 확인할 수 있습니다.

  10. SSH를 통해 인스턴스에 연결할 수 있는지 확인합니다.

    대체 인스턴스가 제대로 작동하면 문제가 있는 인스턴스를 중지하거나 삭제해도 됩니다.

Debian

  1. 사용 중인 운영체제 버전이 지원되는지 확인합니다.
  2. 복구 인스턴스로 사용할 새 인스턴스를 만듭니다. 이 인스턴스 이름을 rescue로 지정합니다. 이 복구 인스턴스는 문제가 있는 인스턴스와 동일한 Linux OS를 실행하지 않아도 됩니다. 이 예시에서는 복구 인스턴스에서 Debian 9을 사용합니다.

  3. 문제가 있는 인스턴스를 중지하고 부팅 디스크의 복사본을 만듭니다.

    1. 문제가 있는 인스턴스의 변수 이름을 설정합니다. 이렇게 하면 이후 단계에서 인스턴스를 쉽게 참조할 수 있습니다.

      export PROB_INSTANCE_NAME=INSTANCE_NAME
      

      여기서 INSTANCE_NAME은 문제가 있는 인스턴스의 이름입니다.

    2. 문제가 있는 인스턴스를 중지합니다.

      gcloud compute instances stop "$PROB_INSTANCE_NAME"
      
    3. 문제가 있는 인스턴스의 부팅 디스크 이름을 가져옵니다.

      export PROB_INSTANCE_DISK="$(gcloud compute instances describe \
      "$PROB_INSTANCE_NAME" --format='json' |  jq -r '.disks[] | \
      select(.boot == true) | .source')"
      
    4. 부팅 디스크의 스냅샷을 만듭니다.

      export DISK_SNAPSHOT="${PROB_INSTANCE_NAME}-snapshot"
      
      gcloud compute disks snapshot "$PROB_INSTANCE_DISK" \
      --snapshot-names "$DISK_SNAPSHOT"
      
    5. 스냅샷에서 새 디스크를 만듭니다.

      export NEW_DISK="${PROB_INSTANCE_NAME}-new-disk"
      
      gcloud compute disks create "$NEW_DISK" \
      --source-snapshot="$DISK_SNAPSHOT"
      
    6. 스냅샷을 삭제합니다.

      gcloud compute snapshots delete "$DISK_SNAPSHOT"
      
  4. 새 디스크를 복구 인스턴스에 연결하고 복구 인스턴스의 루트 볼륨을 마운트합니다. 이 절차에서는 추가 디스크를 하나만 연결하므로 새 디스크의 기기 식별자는 /dev/sdb가 됩니다. Debian은 기본적으로 디스크의 첫 번째 볼륨을 루트 볼륨으로 사용하므로 볼륨 식별자는 /dev/sdb1이 됩니다. 커스텀의 경우 lsblk를 사용하여 볼륨 식별자를 결정합니다.

    gcloud compute instances attach-disk rescue --disk "$NEW_DISK"
    
  5. SSH를 통해 복구 인스턴스에 연결합니다.

    gcloud compute ssh rescue
    
  6. 복구 인스턴스에서 다음 단계를 실행합니다.

    1. 새 디스크의 루트 볼륨을 마운트합니다.

      export 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. 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. rc.local 스크립트를 새 디스크의 루트 볼륨으로 옮기고 권한을 설정합니다. 기존 rc.local 스크립트를 다른 위치로 옮깁니다. 완료되면 이 스크립트가 임시 스크립트로 대체됩니다.

      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. 새 디스크의 루트 볼륨을 마운트 해제합니다.

      sudo umount "$NEW_DISK_MOUNT_POINT" && sudo rmdir "$NEW_DISK_MOUNT_POINT"

    5. 복구 인스턴스의 SSH 세션을 종료합니다.

  7. 복구 인스턴스에서 새 디스크를 분리합니다.

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

  8. 대체 인스턴스로 사용할 새 인스턴스를 만듭니다. 대체 인스턴스를 만들 때 새 디스크를 부팅 디스크로 지정합니다. Cloud Console을 사용하여 대체 인스턴스를 만들 수 있습니다.

    1. VM 인스턴스 페이지로 이동합니다.

      VM 인스턴스 페이지로 이동

    2. 문제 인스턴스를 클릭한 다음 복제를 클릭합니다.
    3. 대체 인스턴스의 이름을 지정합니다. 부팅 디스크 섹션에서 변경을 클릭한 다음 기존 디스크를 클릭합니다. 새 디스크를 선택합니다.
    4. 만들기를 클릭합니다. 인스턴스가 생성되면 대체 인스턴스가 자동으로 시작됩니다.

    대체 인스턴스가 시작되면 임시 rc.local 스크립트가 실행되고 게스트 환경이 설치됩니다. 이 스크립트의 진행 상황을 보려면 임시 rc.local 스크립트가 생성하는 줄의 콘솔 로그를 검사합니다. 로그를 보려면 다음 명령어를 실행합니다.

    gcloud compute instances get-serial-port-output REPLACEMENT_INSTANCE_NAME
    

    여기서 REPLACEMENT_INSTANCE_NAME은 대체 인스턴스에 할당한 이름입니다.

    임시 rc.local 스크립트가 완료되면 대체 인스턴스가 자동으로 재부팅됩니다. 두 번째 재부팅될 때 콘솔 로그를 검사하여 게스트 환경이 로드되는지 확인할 수 있습니다.

  9. SSH를 통해 인스턴스에 연결할 수 있는지 확인합니다.

    대체 인스턴스가 제대로 작동하면 문제가 있는 인스턴스를 중지하거나 삭제해도 됩니다.

Ubuntu

  1. 사용 중인 운영체제 버전이 지원되는지 확인합니다.
  2. 공개 저장소 GPG 키를 설치합니다.
  3. 복구 인스턴스로 사용할 새 인스턴스를 만듭니다. 이 인스턴스 이름을 rescue로 지정합니다. 이 복구 인스턴스는 문제가 있는 인스턴스와 동일한 Linux OS를 실행하지 않아도 됩니다. 이 예시에서는 복구 인스턴스에서 Debian 9을 사용합니다.

  4. 문제가 있는 인스턴스를 중지하고 부팅 디스크의 복사본을 만듭니다.

    1. 문제가 있는 인스턴스의 변수 이름을 설정합니다. 이렇게 하면 이후 단계에서 인스턴스를 쉽게 참조할 수 있습니다.

      export PROB_INSTANCE_NAME=INSTANCE_NAME
      

      여기서 INSTANCE_NAME은 문제가 있는 인스턴스의 이름입니다.

    2. 문제가 있는 인스턴스를 중지합니다.

      gcloud compute instances stop "$PROB_INSTANCE_NAME"
      
    3. 문제가 있는 인스턴스의 부팅 디스크 이름을 가져옵니다.

      export PROB_INSTANCE_DISK="$(gcloud compute instances describe \
      "$PROB_INSTANCE_NAME" --format='json' |  jq -r '.disks[] | \
      select(.boot == true) | .source')"
      
    4. 부팅 디스크의 스냅샷을 만듭니다.

      export DISK_SNAPSHOT="${PROB_INSTANCE_NAME}-snapshot"
      
      gcloud compute disks snapshot "$PROB_INSTANCE_DISK" \
      --snapshot-names "$DISK_SNAPSHOT"
      
    5. 스냅샷에서 새 디스크를 만듭니다.

      export NEW_DISK="${PROB_INSTANCE_NAME}-new-disk"
      
      gcloud compute disks create "$NEW_DISK" \
      --source-snapshot="$DISK_SNAPSHOT"
      
    6. 스냅샷을 삭제합니다.

      gcloud compute snapshots delete "$DISK_SNAPSHOT"
      
  5. 새 디스크를 복구 인스턴스에 연결하고 복구 인스턴스의 루트 볼륨을 마운트합니다. 이 절차에서는 추가 디스크를 하나만 연결하므로 새 디스크의 기기 식별자는 /dev/sdb가 됩니다. Ubuntu는 기본적으로 루트 볼륨의 라벨을 1로 지정하므로 볼륨 식별자는 /dev/sdb1이 됩니다. 커스텀의 경우 lsblk를 사용하여 볼륨 식별자를 결정합니다.

    gcloud compute instances attach-disk rescue --disk "$NEW_DISK"
    
  6. SSH를 통해 복구 인스턴스에 연결합니다.

    gcloud compute ssh rescue
    
  7. 복구 인스턴스에서 다음 단계를 실행합니다.

    1. 새 디스크의 루트 볼륨을 마운트합니다.

      export 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. 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. rc.local 스크립트를 새 디스크의 루트 볼륨으로 옮기고 권한을 설정합니다. 기존 rc.local 스크립트를 다른 위치로 옮깁니다. 완료되면 이 스크립트가 임시 스크립트로 대체됩니다.

      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. 새 디스크의 루트 볼륨을 마운트 해제합니다.

      sudo umount "$NEW_DISK_MOUNT_POINT" && sudo rmdir "$NEW_DISK_MOUNT_POINT"
      
    5. 복구 인스턴스의 SSH 세션을 종료합니다.

  8. 복구 인스턴스에서 새 디스크를 분리합니다.

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

  9. 대체 인스턴스로 사용할 새 인스턴스를 만듭니다. 대체 인스턴스를 만들 때 새 디스크를 부팅 디스크로 지정합니다. Cloud Console을 사용하여 대체 인스턴스를 만들 수 있습니다.

    1. VM 인스턴스 페이지로 이동합니다.

      VM 인스턴스 페이지로 이동

    2. 문제 인스턴스를 클릭한 다음 복제를 클릭합니다.
    3. 대체 인스턴스의 이름을 지정합니다. 부팅 디스크 섹션에서 변경을 클릭한 다음 기존 디스크를 클릭합니다. 새 디스크를 선택합니다.
    4. 만들기를 클릭합니다. 인스턴스가 생성되면 대체 인스턴스가 자동으로 시작됩니다.

    대체 인스턴스가 시작되면 임시 rc.local 스크립트가 실행되고 게스트 환경이 설치됩니다. 이 스크립트의 진행 상황을 보려면 임시 rc.local 스크립트가 생성하는 줄의 콘솔 로그를 검사합니다. 로그를 보려면 다음 명령어를 실행합니다.

    gcloud compute instances get-serial-port-output REPLACEMENT_INSTANCE_NAME
    

    여기서 REPLACEMENT_INSTANCE_NAME은 대체 인스턴스에 할당한 이름입니다.

    임시 rc.local 스크립트가 완료되면 대체 인스턴스가 자동으로 재부팅됩니다. 두 번째 재부팅될 때 콘솔 로그를 검사하여 게스트 환경이 로드되는지 확인할 수 있습니다.

  10. SSH를 통해 인스턴스에 연결할 수 있는지 확인합니다.

    대체 인스턴스가 제대로 작동하면 문제가 있는 인스턴스를 중지하거나 삭제해도 됩니다.

게스트 환경 검증

인스턴스를 시작할 때 콘솔에 표시되는 시스템 로그를 검사하거나 인스턴스에 연결되어 있는 동안 설치된 패키지의 목록을 나열하여 게스트 환경이 있는지 확인할 수 있습니다.

게스트 환경의 예상 콘솔 로그

다음 표에는 인스턴스가 시작될 때 게스트 환경이 작동 중인 인스턴스에서 표시되는 콘솔 로그의 예상 출력이 요약되어 있습니다.

운영체제 서비스 관리 예상 출력
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 및 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"
컨테이너 최적화 OS 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
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
Windows

GCEWindowsAgent: GCE Agent Started
GCEMetadataScripts: Starting startup scripts

인스턴스의 콘솔 로그를 보려면 다음 단계를 따르세요.

콘솔

  1. VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스 페이지로 이동

    1. 검사해야 하는 인스턴스를 클릭합니다.
    2. 인스턴스를 다시 시작하거나 재설정합니다.
    3. 로그에서 직렬 포트 1(콘솔)을 클릭합니다.
    4. 위 표를 참조하여 예상 출력을 검색합니다.

gcloud

  1. 인스턴스를 다시 시작하거나 재설정합니다.
  2. gcloud 명령줄 도구를 사용하여 연결하려면 gcloud compute get-serial-port-output 하위 명령어를 사용합니다. 예를 들면 다음과 같습니다.

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

    여기서, [INSTANCE_NAME]은 검사해야 하는 인스턴스의 이름입니다.

  3. 위 표를 참조하여 예상 출력을 검색합니다.

게스트 환경에 로드되는 서비스

다음 표에는 게스트 환경이 작동 중인 인스턴스에 로드되어야 하는 서비스가 요약되어 있습니다. 인스턴스에 연결한 후 서비스 목록을 나열하는 명령어를 실행해야 하므로, 이 검사는 인스턴스에 액세스할 수 있는 경우에만 수행할 수 있습니다.

운영체제 서비스 목록을 나열하는 명령어 예상 출력
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
컨테이너 최적화 OS

sudo systemctl list-unit-files \
| grep google

var-lib-google.mount                disabled
google-accounts-daemon.service      disabled
google-clock-skew-daemon.service    disabled
google-instance-setup.service       disabled
google-ip-forwarding-daemon.service disabled
google-network-setup.service        disabled
google-shutdown-scripts.service     disabled
google-startup-scripts.service      disabled
var-lib-google-remount.service      static 
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
Windows

Get-Service GCEAgent
Get-ScheduledTask GCEStartup

Running    GCEAgent   GCEAgent
\          GCEStartup Ready

게스트 환경에 설치되는 패키지

다음 표에는 게스트 환경이 작동 중인 인스턴스에 설치해야 하는 패키지가 요약되어 있습니다. 인스턴스에 연결한 후 설치된 패키지의 목록을 나열하는 명령어를 실행해야 하므로, 이 검사는 인스턴스에 액세스할 수 있는 경우에만 수행할 수 있습니다.

운영체제 패키지 목록을 나열하는 명령어 예상 출력
CentOS/RHEL 6 및 7

yum list installed | grep google-compute

google-compute-engine
google-compute-engine-oslogin.x86_64
python-google-compute-engine
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
Windows

googet installed

certgen
googet
google-compute-engine-auto-updater
google-compute-engine-driver-gga
google-compute-engine-driver-netkvm
google-compute-engine-driver-pvpanic
google-compute-engine-driver-vioscsi
google-compute-engine-metadata-scripts
google-compute-engine-powershell
google-compute-engine-sysprep
google-compute-engine-vss
google-compute-engine-windows

다음 단계

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

Compute Engine 문서