게스트 환경 설치


이 페이지에서는 Compute Engine에서 커스텀 이미지를 실행하는 가상 머신(VM) 인스턴스의 게스트 환경을 수동으로 설치하는 방법을 설명합니다.

대개 Google에서 제공하는 공개 이미지를 사용하여 만든 VM을 사용하는 경우에는 게스트 환경을 설치할 필요가 없습니다. 게스트 환경을 사용해야 하는 시기에 대한 자세한 내용은 수동으로 게스트 환경을 설치 또는 업데이트하는 경우를 참조하세요.

게스트 환경을 수동으로 설치하기 전에 게스트 환경 검증 절차를 수행하여 VM에서 게스트 환경이 실행 중인지 여부를 확인합니다. VM에서 게스트 환경을 사용할 수 있지만 오래된 경우 게스트 환경을 업데이트합니다.

시작하기 전에

  • 아직 인증을 설정하지 않았다면 설정합니다. 인증은 Google Cloud 서비스 및 API에 액세스하기 위해 ID를 확인하는 프로세스입니다. 로컬 개발 환경에서 코드 또는 샘플을 실행하려면 다음 옵션 중 하나를 선택하여 Compute Engine에 인증하면 됩니다.

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

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. Set a default region and zone.

설치 방법

게스트 환경을 여러 방법으로 설치할 수 있습니다. 다음 옵션 중 하나를 선택합니다.

지원되는 운영체제

정식 버전 (GA) 수명 주기 또는 확장 지원 수명 주기 단계에 있는 OS 이미지 버전을 사용하는 VM에 게스트 환경을 수동으로 설치할 수 있습니다. Compute Engine의 OS 이미지 버전 및 수명 주기 단계 목록을 검토하려면 운영체제 세부정보를 참고하세요.

제한사항

가져오기 도구를 수동으로 설치하거나 사용하여 Fedora CoreOS 및 Container-Optimized 운영체제의 게스트 환경을 설치할 수 없습니다. 게스트 환경은 모든 공개 이미지의 핵심으로 포함되어 있으므로, 이 운영체제 중 하나가 필요한 경우에는 공개 이미지를 사용하는 것이 좋습니다.

게스트 환경 설치

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

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

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

CentOS/RHEL/Rocky

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

    eval $(grep VERSION_ID /etc/os-release)
    sudo tee /etc/yum.repos.d/google-cloud.repo << EOM
    [google-compute-engine]
    name=Google Compute Engine
    baseurl=https://packages.cloud.google.com/yum/repos/google-compute-engine-el${VERSION_ID/.*}-x86_64-stable
    enabled=1
    gpgcheck=1
    repo_gpgcheck=0
    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. 게스트 환경 패키지를 설치합니다.

    sudo yum install -y google-compute-engine google-osconfig-agent
    
  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를 만듭니다.

    eval $(grep VERSION_CODENAME /etc/os-release)
    sudo tee /etc/apt/sources.list.d/google-cloud.list << EOM
    deb http://packages.cloud.google.com/apt google-compute-engine-${VERSION_CODENAME}-stable main
    deb http://packages.cloud.google.com/apt google-cloud-packages-archive-keyring-${VERSION_CODENAME} main
    EOM
    
  4. 패키지 목록을 업데이트합니다.

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

    sudo apt install -y google-cloud-packages-archive-keyring
    sudo apt install -y google-compute-engine google-osconfig-agent
    
  6. 인스턴스를 다시 시작하고 콘솔 로그를 검사하여 백업을 시작할 때 게스트 환경이 로드되는지 확인합니다.

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

Ubuntu

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

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

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

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

    sudo apt install -y google-compute-engine google-osconfig-agent
    
  5. 인스턴스를 다시 시작하고 콘솔 로그를 검사하여 백업을 시작할 때 게스트 환경이 로드되는지 확인합니다.

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

SLES

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

  2. 퍼블릭 클라우드 모듈을 활성화합니다.

    product=$(sudo SUSEConnect --list-extensions | grep -o "sle-module-public-cloud.*")
    [[ -n "$product" ]] && sudo SUSEConnect -p "$product"
    
  3. 패키지 목록을 업데이트합니다.

    sudo zypper refresh
  4. 게스트 환경 패키지를 설치합니다.

    sudo zypper install -y google-guest-{agent,configs,oslogin} \
    google-osconfig-agent
    sudo systemctl enable /usr/lib/systemd/system/google-*
    
  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.18.3/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 google-osconfig-agent
    
  4. Windows 게스트 환경의 옵션 패키지를 설치합니다.

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

    googet 명령어 사용

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

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

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

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

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

인스턴스에 연결하여 게스트 환경을 수동으로 설치할 수 없는 경우 이 절차를 수행하여 게스트 환경을 설치합니다. 이 절차에는 다음과 같은 Google Cloud Console 또는 Cloud Shell에서 완료할 수 있는 단계가 포함되어 있습니다.

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

이 절차는 Cloud Shell에서 실행합니다. Cloud Shell을 사용하지 않는 경우 jq 명령줄 JSON 프로세서를 설치합니다. 이 프로세서를 사용하여 gcloud CLI 출력을 필터링할 수 있습니다. Cloud Shell에는 jq가 사전 설치되어 있습니다.

CentOS/RHEL/Rocky

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

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

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

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

      export PROB_INSTANCE_NAME=VM_NAME

      VM_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가 됩니다. CentOS/RHEL/Rocky Linux는 기본적으로 디스크의 첫 번째 볼륨을 루트 볼륨으로 사용하므로 볼륨 식별자는 /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 -o nouuid "$DEV" "$NEW_DISK_MOUNT_POINT"
      
    2. rc.local 스크립트를 만듭니다.

      cat <<'EOF' >/tmp/rc.local
      #!/bin/bash
      echo "== Installing Google guest environment for CentOS/RHEL/Rocky Linux =="
      sleep 30 # Wait for network.
      echo "Determining CentOS/RHEL/Rocky Linux version..."
      eval $(grep VERSION_ID /etc/os-release)
      if [[ -z $VERSION_ID ]]; then
        echo "ERROR: Could not determine version of CentOS/RHEL/Rocky Linux."
        exit 1
      fi
      echo "Updating repo file..."
      tee "/etc/yum.repos.d/google-cloud.repo" << EOM
      [google-compute-engine]
      name=Google Compute Engine
      baseurl=https://packages.cloud.google.com/yum/repos/google-compute-engine-el${VERSION_ID/.*}-x86_64-stable
      enabled=1
      gpgcheck=1
      repo_gpgcheck=0
      gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
      https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
      EOM
      echo "Running yum makecache..."
      yum makecache
      echo "Running yum updateinfo..."
      yum updateinfo
      echo "Running yum install google-compute-engine..."
      yum install -y google-compute-engine
      rpm -q google-compute-engine
      if [[ $? -ne 0 ]]; then
        echo "ERROR: Failed to install ${pkg}."
      fi
      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
      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 세션을 종료합니다.

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

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

    1. Google Cloud Console에서 VM 인스턴스 페이지로 이동합니다.

      VM 인스턴스로 이동

    2. 문제가 있는 인스턴스를 클릭한 다음 유사하게 만들기를 클릭합니다.

    3. 대체 인스턴스의 이름을 지정합니다. 부팅 디스크 섹션에서 변경을 클릭한 다음 기존 디스크를 클릭합니다. 새 디스크를 선택합니다.

    4. 만들기를 클릭합니다. 인스턴스가 생성되면 대체 인스턴스가 자동으로 시작됩니다.

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

    gcloud compute instances get-serial-port-output REPLACEMENT_VM_NAME

    REPLACEMENT_VM_NAME을 대체 인스턴스에 할당한 이름으로 바꿉니다.

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

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

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

Debian

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

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

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

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

      export PROB_INSTANCE_NAME=VM_NAME

      VM_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
      echo "== Installing Google guest environment for Debian =="
      export DEBIAN_FRONTEND=noninteractive
      sleep 30 # Wait for network.
      echo "Determining Debian version..."
      eval $(grep VERSION_CODENAME /etc/os-release)
      if [[ -z $VERSION_CODENAME ]]; then
       echo "ERROR: Could not determine Debian version."
       exit 1
      fi
      echo "Adding GPG key for Google cloud repo."
      curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
      echo "Updating repo file..."
      tee "/etc/apt/sources.list.d/google-cloud.list" << EOM
      deb http://packages.cloud.google.com/apt google-compute-engine-${VERSION_CODENAME}-stable main
      deb http://packages.cloud.google.com/apt google-cloud-packages-archive-keyring-${VERSION_CODENAME} main
      EOM
      echo "Running apt update..."
      apt update
      echo "Installing packages..."
      for pkg in google-cloud-packages-archive-keyring google-compute-engine; do
       echo "Running apt install ${pkg}..."
       apt install -y ${pkg}
       if [[ $? -ne 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
      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. 대체 인스턴스로 사용할 새 인스턴스를 만듭니다. 대체 인스턴스를 만들 때 새 디스크를 부팅 디스크로 지정합니다. Google Cloud Console을 사용하여 대체 인스턴스를 만들 수 있습니다.

    1. Google Cloud Console에서 VM 인스턴스 페이지로 이동합니다.

      VM 인스턴스로 이동

    2. 문제가 있는 인스턴스를 클릭한 다음 유사하게 만들기를 클릭합니다.

    3. 대체 인스턴스의 이름을 지정합니다. 부팅 디스크 섹션에서 변경을 클릭한 다음 기존 디스크를 클릭합니다. 새 디스크를 선택합니다.

    4. 만들기를 클릭합니다. 인스턴스가 생성되면 대체 인스턴스가 자동으로 시작됩니다.

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

    gcloud compute instances get-serial-port-output REPLACEMENT_VM_NAME

    REPLACEMENT_VM_NAME을 대체 인스턴스에 할당한 이름으로 바꿉니다.

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

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

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

Ubuntu

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

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

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

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

      export PROB_INSTANCE_NAME=VM_NAME

      VM_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가 됩니다. Ubuntu는 기본적으로 루트 볼륨의 라벨을 1로 지정하므로 볼륨 식별자는 /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
      echo "== Installing a Linux guest environment for Ubuntu =="
      sleep 30 # Wait for network.
      echo "Running apt update..."
      apt update
      echo "Installing packages..."
      echo "Running apt install google-compute-engine..."
      apt install -y google-compute-engine
      if [[ $? -ne 0 ]]; then
       echo "ERROR: Failed to install ${pkg}."
      fi
      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
      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. 대체 인스턴스로 사용할 새 인스턴스를 만듭니다. 대체 인스턴스를 만들 때 새 디스크를 부팅 디스크로 지정합니다. Google Cloud Console을 사용하여 대체 인스턴스를 만들 수 있습니다.

    1. Google Cloud Console에서 VM 인스턴스 페이지로 이동합니다.

      VM 인스턴스로 이동

    2. 문제가 있는 인스턴스를 클릭한 다음 유사하게 만들기를 클릭합니다.

    3. 대체 인스턴스의 이름을 지정합니다. 부팅 디스크 섹션에서 변경을 클릭한 다음 기존 디스크를 클릭합니다. 새 디스크를 선택합니다.

    4. 만들기를 클릭합니다. 인스턴스가 생성되면 대체 인스턴스가 자동으로 시작됩니다.

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

    gcloud compute instances get-serial-port-output REPLACEMENT_VM_NAME

    REPLACEMENT_VM_NAME을 대체 인스턴스에 할당한 이름으로 바꿉니다.

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

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

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

게스트 환경 업데이트

게스트 환경이 오래되었다는 메시지가 표시되면 운영체제의 패키지를 업데이트합니다.

CentOS/RHEL/Rocky

CentOS, RHEL, Rocky Linux 운영체제를 업데이트하려면 다음 명령어를 실행합니다.

sudo yum makecache
sudo yum install google-compute-engine google-compute-engine-oslogin \
google-guest-agent google-osconfig-agent

Debian

Debian 운영체제를 업데이트하려면 다음 명령어를 실행합니다.

sudo apt update
sudo apt install google-compute-engine google-compute-engine-oslogin \
google-guest-agent google-osconfig-agent

Ubuntu

Ubuntu 운영체제를 업데이트하려면 다음 명령어를 실행합니다.

sudo apt update
sudo apt install google-compute-engine google-compute-engine-oslogin \
google-guest-agent google-osconfig-agent

SLES

SLES 운영체제를 업데이트하려면 다음 명령어를 실행합니다.

sudo zypper refresh
sudo zypper install google-guest-{agent,configs,oslogin} \
google-osconfig-agent

Windows

Windows 운영체제를 업데이트하려면 다음 명령어를 실행합니다.

googet update

게스트 환경 검증

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

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

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

운영체제 서비스 관리 예상 출력
CentOS/RHEL/Rocky Linux
Debian
Ubuntu
SLES
Container-Optimized OS 89 이상
systemd
google_guest_agent: GCE Agent Started (version YYYYMMDD.NN)
google_metadata_script_runner: Starting startup scripts (version YYYYMMDD.NN)
OSConfigAgent Info: OSConfig Agent (version YYYYMMDD.NN)
Container-Optimized OS 85 이하 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
GCEGuestAgent: GCE Agent Started (version YYYYMMDD.NN)
GCEMetadataScripts: Starting startup scripts (version YYYYMMDD.NN)
OSConfigAgent Info: OSConfig Agent (version YYYYMMDD.NN)

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

Console

  1. Google Cloud 콘솔에서 VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스로 이동

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

gcloud

  1. 인스턴스를 다시 시작하거나 재설정합니다.
  2. gcloud compute instances get-serial-port-output 하위 명령어를 사용하여 Google Cloud CLI를 통해 연결하세요. 예를 들면 다음과 같습니다.

    gcloud compute instances get-serial-port-output VM_NAME

    VM_NAME을 검사해야 하는 인스턴스의 이름으로 바꿉니다.

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

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

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

운영체제 서비스를 나열하는 명령어 예상 출력
CentOS/RHEL/Rocky Linux
Debian
sudo systemctl list-unit-files \
| grep google | grep enabled
google-disk-expand.service             enabled
google-guest-agent.service             enabled
google-osconfig-agent.service          enabled
google-shutdown-scripts.service        enabled
google-startup-scripts.service         enabled
google-oslogin-cache.timer             enabled
Ubuntu
sudo systemctl list-unit-files \
| grep google | grep enabled
google-guest-agent.service             enabled
google-osconfig-agent.service          enabled
google-shutdown-scripts.service        enabled
google-startup-scripts.service         enabled
google-oslogin-cache.timer             enabled
컨테이너 최적화 OS
sudo systemctl list-unit-files \
| grep google
var-lib-google.mount                   disabled
google-guest-agent.service             disabled
google-osconfig-agent.service          disabled
google-osconfig-init.service           disabled
google-oslogin-cache.service           static
google-shutdown-scripts.service        disabled
google-startup-scripts.service         disabled
var-lib-google-remount.service         static
google-oslogin-cache.timer             disabled 
SLES 12 이상
sudo systemctl list-unit-files \
| grep google | grep enabled
google-guest-agent.service              enabled
google-osconfig-agent.service           enabled
google-shutdown-scripts.service         enabled
google-startup-scripts.service          enabled
google-oslogin-cache.timer              enabled 
Windows
Get-Service GCEAgent
Get-ScheduledTask GCEStartup
Running    GCEAgent   GCEAgent
\          GCEStartup Ready

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

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

운영체제 패키지를 나열하는 명령어 예상 출력
CentOS/RHEL/Rocky Linux
rpm -qa --queryformat '%{NAME}\n' \
| grep -iE 'google|gce'
google-osconfig-agent
google-compute-engine-oslogin
google-guest-agent
gce-disk-expand
google-cloud-sdk
google-compute-engine
Debian
apt list --installed \
| grep -i google
gce-disk-expand
google-cloud-packages-archive-keyring
google-cloud-sdk
google-compute-engine-oslogin
google-compute-engine
google-guest-agent
google-osconfig-agent
Ubuntu
apt list --installed \
| grep -i google
google-compute-engine-oslogin
google-compute-engine
google-guest-agent
google-osconfig-agent
SUSE(SLES)
rpm -qa --queryformat '%{NAME}\n' \
| grep -i google
google-guest-configs
google-osconfig-agent
google-guest-oslogin
google-guest-agent
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
google-osconfig-agent

다음 단계