Linux 게스트 환경 설치

이 페이지에서는 Compute Engine용 Linux 게스트 환경의 설치 방법을 설명합니다. Google에서 제공하는 공개 이미지를 사용하여 만든 Linux 인스턴스에는 OS의 관리자가 설치한 게스트 환경이 포함됩니다. 이러한 이미지의 전체 목록을 포함하여 Google에서 제공하는 공개 이미지에 대한 자세한 내용은 공개 이미지를 참조하세요.

게스트 환경은 주요 Compute Engine 기능을 제공하는 Linux Compute Engine 인스턴스의 프로세스 및 구성 집합입니다.

다음과 같은 조직에서 특정 Linux 배포용 게스트 환경 패키지를 빌드하고 유지관리합니다.

  • Canonical:
  • Google:
    • CentOS/RHEL(Red Hat Enterprise Linux) 6 및 7
    • Debian 9
  • SUSE:
    • SAP용 SLES, SLES 12, SLES 15

CoreOS는 게스트 환경 기능을 지원하기 위해 다음 기능을 제공합니다.

시작하기 전에

목차

게스트 환경 설치

다음 옵션 중 하나를 사용하여 게스트 환경을 설치합니다.

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

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

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

CentOS/RHEL

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
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

패키지 목록을 업데이트합니다.

sudo yum makecache
sudo yum updateinfo

게스트 환경 패키지를 설치합니다.

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

인스턴스를 다시 시작하고 콘솔 로그를 검사하여 백업을 시작할 때 게스트 환경이 로드되는지 확인합니다.

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

Debian

공개 저장소 GPG 키를 설치합니다.

curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

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

패키지 목록을 업데이트합니다.

sudo apt-get update

게스트 환경 패키지를 설치합니다.

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

인스턴스를 다시 시작하고 콘솔 로그를 검사하여 백업을 시작할 때 게스트 환경이 로드되는지 확인합니다.

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

Ubuntu

Canonical은 게스트 환경을 위한 패키지를 Universe 저장소에 게시합니다. 먼저 Universe 저장소를 사용 설정하세요.

sudo apt-add-repository universe

패키지 목록을 업데이트합니다.

sudo apt-get update

게스트 환경 패키지를 설치합니다.

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

인스턴스를 다시 시작하고 콘솔 로그를 검사하여 백업을 시작할 때 게스트 환경이 로드되는지 확인합니다.

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

부팅 디스크 복제 및 시작 스크립트 사용

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

  1. 필요한 경우 새 디스크를 연결할 수 있는 다른 인스턴스를 만듭니다. 여기서는 이러한 다른 인스턴스를 복구 인스턴스라고 합니다.

  2. 게스트 환경을 다시 설치해야 하는 인스턴스를 중지합니다. 여기서는 이 인스턴스를 문제 인스턴스라고 합니다.

  3. 인스턴스가 중지되어 있는 동안 문제 인스턴스에서 부팅 디스크의 스냅샷을 만듭니다.

  4. 이 스냅샷에서 새 영구 디스크를 만듭니다.

  5. 새 디스크를 복구 인스턴스에 연결하고 루트 볼륨을 마운트합니다. 게스트 환경을 루트 볼륨에 설치할 용도의 임시 rc.local 스크립트를 복사합니다.

  6. 복구 인스턴스에서 새 디스크를 분리하고 새 디스크를 사용하여 대체 인스턴스를 만듭니다.

  7. 대체 인스턴스를 시작합니다.

  8. 대체 인스턴스가 처음으로 부팅되고 임시 rc.local 스크립트가 실행됩니다. 이 스크립트는 게스트 환경을 설치하고 자동으로 삭제되며 머신을 재부팅합니다.

  9. 대체 인스턴스가 작동하는지 확인합니다.

  10. 원할 경우 문제 인스턴스를 중지하거나 삭제합니다.

Cloud Shell을 사용하여 이 절차를 실행합니다.

CentOS/RHEL

  1. 복구 인스턴스로 사용할 새 인스턴스를 만듭니다. 알기 쉽게 하기 위해 이 인스턴스의 이름을 rescue라고 지정합니다. 이 인스턴스가 문제 인스턴스와 동일한 Linux OS를 실행할 필요는 없습니다. Google에서 Debian 9를 복구 인스턴스로 사용하여 이 절차를 확인했습니다.

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

    1. 문제 인스턴스의 변수 이름을 설정합니다. 이렇게 하면 이 절차의 다음 단계를 더 쉽게 진행할 수 있습니다. INSTANCE_NAME을 문제 인스턴스의 이름으로 바꿉니다.
      PROB_INSTANCE_NAME=INSTANCE_NAME
    2. 문제 인스턴스를 중지합니다.
      gcloud compute instances stop "$PROB_INSTANCE_NAME"
    3. 부팅 디스크의 이름을 결정합니다.
      PROB_INSTANCE_DISK="$(gcloud compute instances describe "$PROB_INSTANCE_NAME" 
      --format='json' | jq -r '.disks[] | select(.boot == true) | .source')"
    4. 부팅 디스크의 스냅샷을 만듭니다.
      DISK_SNAPSHOT="${PROB_INSTANCE_NAME}-snapshot"
      gcloud compute disks snapshot "$PROB_INSTANCE_DISK" --snapshot-names "$DISK_SNAPSHOT"
    5. 스냅샷에서 새 디스크를 만듭니다.
      NEW_DISK="${PROB_INSTANCE_NAME}-new-disk"
      gcloud compute disks create "$NEW_DISK" --source-snapshot="$DISK_SNAPSHOT"
    6. 스냅샷을 삭제합니다.
      gcloud compute snapshots delete "$DISK_SNAPSHOT"
  3. 새 디스크를 복구 인스턴스에 연결하고 루트 볼륨을 마운트합니다. 이 절차에서는 추가 디스크 하나만 연결하므로 새 디스크의 기기 식별자는 /dev/sdb가 됩니다. CentOS/RHEL은 기본적으로 디스크의 첫 번째 볼륨을 루트 볼륨으로 사용하므로 볼륨 식별자는 /dev/sdb1이 됩니다. (커스텀의 경우 lsblk를 사용하여 볼륨 식별자를 결정합니다.)

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

  4. SSH를 사용하여 복구 인스턴스에 연결합니다.

    gcloud compute ssh rescue

  5. 복구 인스턴스를 사용하여 다음 단계를 진행합니다.

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

      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 세션을 종료합니다.

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

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

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

      VM 인스턴스 페이지로 이동

    2. 문제 인스턴스를 클릭한 다음 복제를 클릭합니다.
    3. 대체 인스턴스의 이름을 지정합니다. 부팅 디스크 섹션에서 변경을 클릭한 다음 기존 디스크를 클릭합니다. 새 디스크를 선택합니다.
    4. 만들기를 클릭합니다. 대체 인스턴스가 만들어진 후 시작됩니다.
  8. 대체 인스턴스가 시작되면 부팅하는 동안 임시 rc.local 스크립트가 실행되어 Linux 게스트 환경이 설치됩니다. 이 스크립트의 진행 상황을 보려면 임시 rc.local 스크립트가 생성하는 행의 콘솔 로그를 검사합니다. 예를 들면 다음과 같이 gcloud를 사용하여 확인할 수 있습니다. REPLACEMENT_INSTANCE_NAME을 대체 인스턴스에 할당한 이름으로 변경합니다.

    gcloud compute instances get-serial-port-output REPLACEMENT_INSTANCE_NAME
  9. 임시 rc.local 스크립트가 완료되면 대체 인스턴스가 다시 한 번 자동으로 재부팅됩니다. 두 번째 재부팅부터 콘솔 로그를 검사하여 게스트 환경이 로드되는지 확인할 수 있습니다. SSH를 사용하여 인스턴스에 연결할 수 있는지 확인합니다.

  10. 대체 인스턴스가 제대로 작동하는 것을 확인했으면 문제 인스턴스를 중지하거나 삭제해도 됩니다.

Debian

  1. 복구 인스턴스로 사용할 새 인스턴스를 만듭니다. 알기 쉽게 하기 위해 이 인스턴스의 이름을 rescue라고 지정합니다. 이 인스턴스가 문제 인스턴스와 동일한 Linux OS를 실행할 필요는 없습니다. Google에서 Debian 9를 복구 인스턴스로 사용하여 이 절차를 확인했습니다.

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

    1. 문제 인스턴스의 변수 이름을 설정합니다. 이렇게 하면 이 절차의 다음 단계를 더 쉽게 진행할 수 있습니다. INSTANCE_NAME을 문제 인스턴스의 이름으로 바꿉니다.
      PROB_INSTANCE_NAME=INSTANCE_NAME
    2. 문제 인스턴스를 중지합니다.
      gcloud compute instances stop "$PROB_INSTANCE_NAME"
    3. 부팅 디스크의 이름을 결정합니다.
      PROB_INSTANCE_DISK="$(gcloud compute instances describe "$PROB_INSTANCE_NAME" 
      --format='json' | jq -r '.disks[] | select(.boot == true) | .source')"
    4. 부팅 디스크의 스냅샷을 만듭니다.
      DISK_SNAPSHOT="${PROB_INSTANCE_NAME}-snapshot"
      gcloud compute disks snapshot "$PROB_INSTANCE_DISK" --snapshot-names "$DISK_SNAPSHOT"
    5. 스냅샷에서 새 디스크를 만듭니다.
      NEW_DISK="${PROB_INSTANCE_NAME}-new-disk"
      gcloud compute disks create "$NEW_DISK" --source-snapshot="$DISK_SNAPSHOT"
    6. 스냅샷을 삭제합니다.
      gcloud compute snapshots delete "$DISK_SNAPSHOT"
  3. 새 디스크를 복구 인스턴스에 연결하고 루트 볼륨을 마운트합니다. 이 절차에서는 추가 디스크 하나만 연결하므로 새 디스크의 기기 식별자는 /dev/sdb가 됩니다. Debian은 기본적으로 디스크의 첫 번째 볼륨을 루트 볼륨으로 사용하므로 볼륨 식별자는 /dev/sdb1이 됩니다. (커스텀의 경우 lsblk를 사용하여 볼륨 식별자를 결정합니다.)

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

  4. SSH를 사용하여 복구 인스턴스에 연결합니다.

    gcloud compute ssh rescue

  5. 복구 인스턴스를 사용하여 다음 단계를 진행합니다.

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

      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 세션을 종료합니다.

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

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

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

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

      VM 인스턴스 페이지로 이동

    2. 문제 인스턴스를 클릭한 다음 복제를 클릭합니다.
    3. 대체 인스턴스의 이름을 지정합니다. 부팅 디스크 섹션에서 변경을 클릭한 다음 기존 디스크를 클릭합니다. 새 디스크를 선택합니다.
    4. 만들기를 클릭합니다. 대체 인스턴스가 만들어진 후 시작됩니다.
  8. 대체 인스턴스가 시작되면 부팅하는 동안 임시 rc.local 스크립트가 실행되어 Linux 게스트 환경이 설치됩니다. 이 스크립트의 진행 상황을 보려면 임시 rc.local 스크립트가 생성하는 행의 콘솔 로그를 검사합니다. 예를 들면 다음과 같이 gcloud를 사용하여 확인할 수 있습니다. REPLACEMENT_INSTANCE_NAME을 대체 인스턴스에 할당한 이름으로 변경합니다.

    gcloud compute instances get-serial-port-output REPLACEMENT_INSTANCE_NAME

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

  10. 대체 인스턴스가 제대로 작동하는 것을 확인했으면 문제 인스턴스를 중지하거나 삭제해도 됩니다.

Ubuntu

  1. 복구 인스턴스로 사용할 새 인스턴스를 만듭니다. 알기 쉽게 하기 위해 이 인스턴스의 이름을 rescue라고 지정합니다. 이 인스턴스가 문제 인스턴스와 동일한 Linux OS를 실행할 필요는 없습니다. Google에서 Debian 9를 복구 인스턴스로 사용하여 이 절차를 확인했습니다.

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

    1. 문제 인스턴스의 변수 이름을 설정합니다. 이렇게 하면 이 절차의 다음 단계를 더 쉽게 진행할 수 있습니다. INSTANCE_NAME을 문제 인스턴스의 이름으로 바꿉니다.
      PROB_INSTANCE_NAME=INSTANCE_NAME
    2. 문제 인스턴스를 중지합니다.
      gcloud compute instances stop "$PROB_INSTANCE_NAME"
    3. 부팅 디스크의 이름을 결정합니다.
      PROB_INSTANCE_DISK="$(gcloud compute instances describe "$PROB_INSTANCE_NAME" 
      --format='json' | jq -r '.disks[] | select(.boot == true) | .source')"
    4. 부팅 디스크의 스냅샷을 만듭니다.
      DISK_SNAPSHOT="${PROB_INSTANCE_NAME}-snapshot"
      gcloud compute disks snapshot "$PROB_INSTANCE_DISK" --snapshot-names "$DISK_SNAPSHOT"
    5. 스냅샷에서 새 디스크를 만듭니다.
      NEW_DISK="${PROB_INSTANCE_NAME}-new-disk"
      gcloud compute disks create "$NEW_DISK" --source-snapshot="$DISK_SNAPSHOT"
    6. 스냅샷을 삭제합니다.
      gcloud compute snapshots delete "$DISK_SNAPSHOT"
  3. 새 디스크를 복구 인스턴스에 연결하고 루트 볼륨을 마운트합니다. 이 절차에서는 추가 디스크 하나만 연결하므로 새 디스크의 기기 식별자는 /dev/sdb가 됩니다. Ubuntu에서는 기본적으로 루트 볼륨의 라벨이 1로 지정되므로 볼륨 식별자는 /dev/sdb1이 됩니다. (커스텀의 경우 lsblk를 사용하여 볼륨 식별자를 결정합니다.)

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

  4. SSH를 사용하여 복구 인스턴스에 연결합니다.

    gcloud compute ssh rescue

  5. 복구 인스턴스를 사용하여 다음 단계를 진행합니다.

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

      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 세션을 종료합니다.

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

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

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

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

      VM 인스턴스 페이지로 이동

    2. 문제 인스턴스를 클릭한 다음 복제를 클릭합니다.
    3. 대체 인스턴스의 이름을 지정합니다. 부팅 디스크 섹션에서 변경을 클릭한 다음 기존 디스크를 클릭합니다. 새 디스크를 선택합니다.
    4. 만들기를 클릭합니다. 대체 인스턴스가 만들어진 후 시작됩니다.
  8. 대체 인스턴스가 시작되면 부팅하는 동안 임시 rc.local 스크립트가 실행되어 Linux 게스트 환경이 설치됩니다. 이 스크립트의 진행 상황을 보려면 임시 rc.local 스크립트가 생성하는 행의 콘솔 로그를 검사합니다. 예를 들면 다음과 같이 gcloud를 사용하여 확인할 수 있습니다. REPLACEMENT_INSTANCE_NAME을 대체 인스턴스에 할당한 이름으로 변경합니다.

    gcloud compute instances get-serial-port-output REPLACEMENT_INSTANCE_NAME

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

  10. 대체 인스턴스가 제대로 작동하는 것을 확인했으면 문제 인스턴스를 중지하거나 삭제해도 됩니다.

게스트 환경 검증

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

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

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

운영체제 서비스 관리 예상 출력
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"
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

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

콘솔

  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
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

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

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

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

yum list installed | grep google-compute

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

다음 단계

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

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

Compute Engine 문서