이 페이지에서는 Compute Engine에서 커스텀 이미지를 실행하는 가상 머신(VM) 인스턴스의 게스트 환경을 수동으로 설치하는 방법을 설명합니다.
대개 Google에서 제공하는 공개 이미지를 사용하여 만든 VM을 사용하는 경우에는 게스트 환경을 설치할 필요가 없습니다. 게스트 환경을 사용해야 하는 시기에 대한 자세한 내용은 수동으로 게스트 환경을 설치 또는 업데이트하는 경우를 참조하세요.
게스트 환경을 수동으로 설치하기 전에 게스트 환경 검증 절차를 수행하여 VM에서 게스트 환경이 실행 중인지 여부를 확인합니다. VM에서 게스트 환경을 사용할 수 있지만 오래된 경우 게스트 환경을 업데이트합니다.
시작하기 전에
- 이 가이드의 Google Cloud CLI 예시를 사용하려면 다음 안내를 따르세요.
- 로컬 도구를 설치하거나 Cloud Shell을 사용할 수 있습니다.
- 로컬 도구 사용
- Google Cloud CLI 설치
- jq 명령줄 JSON 프로세서 설치: 이 프로세서를 사용하여
gcloud
출력을 필터링할 수 있음
- gcloud CLI가 있고
jq
가 사전 설치된 Cloud Shell 사용: Cloud Shell 열기
- 로컬 도구 사용
- 기본 속성을 설정합니다.
gcloud config set compute/zone ZONE
gcloud config set compute/region REGION
gcloud config set project PROJECT
설치 방법
게스트 환경을 여러 방법으로 설치할 수 있습니다. 다음 옵션 중 하나를 선택합니다.
가져오기 도구. 권장되는 옵션입니다. 그러나 가져오기 도구는 게스트 환경을 설치할 뿐만 아니라 이미지에서 네트워크 구성, 부트로더 구성, Google Cloud CLI 설치와 같은 다른 구성 업데이트도 수행합니다. 가져오기 도구 사용 방법에 대한 안내는 부팅 가능한 이미지 만들기를 참조하세요.
가져오기 도구는 다양한 운영체제와 버전을 지원합니다. 자세한 내용은 운영체제 세부정보를 참조하세요.
수동 설치. 다음 중 하나를 선택합니다.
- SSH 또는 RDP를 통해 인스턴스에 연결하고 현재 위치에 게스트 환경 설치
- 부팅 디스크를 클론하고 시작 스크립트를 사용하여 게스트 환경 설치
게스트 환경 수동 설치는 다음 운영체제에서 지원됩니다.
- Ubuntu 16.04 이상
- CentOS 7 이상
- SUSE Linux Enterprise Server(SLES) 12 SP4 이상 및 15 SP1 이상
- Red Hat Enterprise Linux(RHEL) 7 이상
- Debian 9 이상
- Windows Server 2019
- Windows Server 2016
- Windows Server 2012 R2
- Windows Server 반기 채널 출시 버전
- Windows Server의 SQL Server
- Windows Bring Your Own License(사용자 라이선스 사용):
- Windows 8
- Windows 10
제한사항
가져오기 도구를 수동으로 설치하거나 사용하여 Fedora CoreOS 및 Container-Optimized 운영체제의 게스트 환경을 설치할 수 없습니다. 게스트 환경은 모든 공개 이미지의 핵심으로 포함되어 있으므로, 이 운영체제 중 하나가 필요한 경우에는 공개 이미지를 사용하는 것이 좋습니다.
게스트 환경 설치
현재 위치에 게스트 환경 설치
SSH를 통해 대상 인스턴스에 연결할 수 있는 경우에는 이 방법을 사용하여 게스트 환경을 설치합니다. 게스트 환경을 설치할 인스턴스에 연결할 수 없는 경우에는 부팅 디스크를 클론하고 시작 스크립트를 사용하여 게스트 환경을 설치합니다.
SSH 암호 기반 인증을 사용하여 연결할 수 있는 경우 가져온 이미지에 이 절차가 유용합니다. 함수 키 기반 SSH를 사용하는 사용자 계정이 하나 이상 있는 경우에도 이 방법을 사용하여 게스트 환경을 다시 설치할 수 있습니다.
CentOS/RHEL
- 사용 중인 운영체제 버전이 지원되는지 확인합니다.
CentOS/RHEL 버전을 확인하고 소스 저장소 파일
/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
패키지 목록을 업데이트합니다.
sudo yum makecache sudo yum updateinfo
게스트 환경 패키지를 설치합니다.
sudo yum install -y google-compute-engine google-osconfig-agent
인스턴스를 다시 시작하고 콘솔 로그를 검사하여 백업을 시작할 때 게스트 환경이 로드되는지 확인합니다.
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
를 만듭니다.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
패키지 목록을 업데이트합니다.
sudo apt update
게스트 환경 패키지를 설치합니다.
sudo apt install -y google-cloud-packages-archive-keyring sudo apt install -y google-compute-engine google-osconfig-agent
인스턴스를 다시 시작하고 콘솔 로그를 검사하여 백업을 시작할 때 게스트 환경이 로드되는지 확인합니다.
SSH를 통해 인스턴스에 연결할 수 있는지 확인합니다.
Ubuntu
사용 중인 운영체제 버전이 지원되는지 확인합니다.
Universe 저장소를 사용 설정합니다. Canonical은 게스트 환경용 패키지를 Universe 저장소에 게시합니다.
sudo apt-add-repository universe
패키지 목록을 업데이트합니다.
sudo apt update
게스트 환경 패키지를 설치합니다.
sudo apt install -y google-compute-engine google-osconfig-agent
인스턴스를 다시 시작하고 콘솔 로그를 검사하여 백업을 시작할 때 게스트 환경이 로드되는지 확인합니다.
SSH를 통해 인스턴스에 연결할 수 있는지 확인합니다.
SLES
사용 중인 운영체제 버전이 지원되는지 확인합니다.
퍼블릭 클라우드 모듈을 활성화합니다.
product=$(sudo SUSEConnect --list-extensions | grep -o "sle-module-public-cloud.*") [[ -n "$product" ]] && sudo SUSEConnect -p "$product"
패키지 목록을 업데이트합니다.
sudo zypper refresh
게스트 환경 패키지를 설치합니다.
sudo zypper install -y google-guest-{agent,configs,oslogin} \ google-osconfig-agent sudo systemctl enable /usr/lib/systemd/system/google-*
인스턴스를 다시 시작하고 콘솔 로그를 검사하여 백업을 시작할 때 게스트 환경이 로드되는지 확인합니다.
SSH를 통해 인스턴스에 연결할 수 있는지 확인합니다.
Windows
시작하기 전에 사용 중인 운영체제 버전이 지원되는지 확인합니다.
Windows 게스트 환경을 설치하려면 관리자 권한 PowerShell 버전 3.0 이상 프롬프트에서 다음 명령어를 실행하세요. 아래의 안내에 나온 Invoke-WebRequest
명령어를 실행하려면 PowerShell 버전 3.0 이상이 필요합니다.
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)를 제공하세요.새 콘솔 창을 열고
google-compute-engine-stable
저장소를 추가합니다.googet addrepo google-compute-engine-stable https://packages.cloud.google.com/yuck/repos/google-compute-engine-stable
Windows 게스트 환경의 코어 패키지를 설치합니다.
googet -noconfirm install google-compute-engine-windows ` google-compute-engine-sysprep google-compute-engine-metadata-scripts ` google-compute-engine-vss google-osconfig-agent
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에서 실행합니다.
CentOS/RHEL
사용 중인 운영체제 버전이 지원되는지 확인합니다.
복구 인스턴스로 사용할 새 인스턴스를 만듭니다. 이 인스턴스 이름을 rescue로 지정합니다. 이 복구 인스턴스는 문제가 있는 인스턴스와 동일한 Linux OS를 실행하지 않아도 됩니다. 이 예시에서는 복구 인스턴스에서 Debian 9을 사용합니다.
문제가 있는 인스턴스를 중지하고 부팅 디스크의 복사본을 만듭니다.
문제가 있는 인스턴스의 변수 이름을 설정합니다. 이렇게 하면 이후 단계에서 인스턴스를 쉽게 참조할 수 있습니다.
export PROB_INSTANCE_NAME=VM_NAME
VM_NAME을 문제가 있는 인스턴스의 이름으로 바꿉니다.
문제가 있는 인스턴스를 중지합니다.
gcloud compute instances stop "$PROB_INSTANCE_NAME"
문제가 있는 인스턴스의 부팅 디스크 이름을 가져옵니다.
export PROB_INSTANCE_DISK="$(gcloud compute instances describe \ "$PROB_INSTANCE_NAME" --format='json' | jq -r \ '.disks[] | select(.boot == true) | .source')"
부팅 디스크의 스냅샷을 만듭니다.
export DISK_SNAPSHOT="${PROB_INSTANCE_NAME}-snapshot" gcloud compute disks snapshot "$PROB_INSTANCE_DISK" \ --snapshot-names "$DISK_SNAPSHOT"
스냅샷에서 새 디스크를 만듭니다.
export NEW_DISK="${PROB_INSTANCE_NAME}-new-disk" gcloud compute disks create "$NEW_DISK" \ --source-snapshot="$DISK_SNAPSHOT"
스냅샷을 삭제합니다.
gcloud compute snapshots delete "$DISK_SNAPSHOT"
새 디스크를 복구 인스턴스에 연결하고 복구 인스턴스의 루트 볼륨을 마운트합니다. 이 절차에서는 추가 디스크를 하나만 연결하므로 새 디스크의 기기 식별자는 /dev/sdb가 됩니다. CentOS/RHEL은 기본적으로 디스크의 첫 번째 볼륨을 루트 볼륨으로 사용하므로 볼륨 식별자는 /dev/sdb1이 됩니다. 커스텀의 경우
lsblk
를 사용하여 볼륨 식별자를 결정합니다.gcloud compute instances attach-disk rescue --disk "$NEW_DISK"
-
gcloud compute ssh rescue
복구 인스턴스에서 다음 단계를 실행합니다.
새 디스크의 루트 볼륨을 마운트합니다.
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"
rc.local
스크립트를 만듭니다.cat <<'EOF' >/tmp/rc.local #!/bin/bash echo "== Installing Google guest environment for CentOS/RHEL ==" sleep 30 # Wait for network. echo "Determining CentOS/RHEL version..." eval $(grep VERSION_ID /etc/os-release) if [[ -z $VERSION_ID ]]; then echo "ERROR: Could not determine version of CentOS/RHEL." 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
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"
새 디스크의 루트 볼륨을 마운트 해제합니다.
sudo umount "$NEW_DISK_MOUNT_POINT" && sudo rmdir \ "$NEW_DISK_MOUNT_POINT"
복구 인스턴스의 SSH 세션을 종료합니다.
복구 인스턴스에서 새 디스크를 분리합니다.
gcloud compute instances detach-disk rescue --disk "$NEW_DISK"
대체 인스턴스로 사용할 인스턴스를 만듭니다. 대체 인스턴스를 만들 때 새 디스크를 부팅 디스크로 지정합니다. Google Cloud Console을 사용하여 대체 인스턴스를 만들 수 있습니다.
Google Cloud Console에서 VM 인스턴스 페이지로 이동합니다.
문제가 있는 인스턴스를 클릭한 다음 유사하게 만들기를 클릭합니다.
대체 인스턴스의 이름을 지정합니다. 부팅 디스크 섹션에서 변경을 클릭한 다음 기존 디스크를 클릭합니다. 새 디스크를 선택합니다.
만들기를 클릭합니다. 인스턴스가 생성되면 대체 인스턴스가 자동으로 시작됩니다.
대체 인스턴스가 시작되면 임시
rc.local
스크립트가 실행되고 게스트 환경이 설치됩니다. 이 스크립트의 진행 상황을 보려면 콘솔 로그에서 임시rc.local
스크립트가 생성하는 줄을 검사합니다. 로그를 보려면 다음 명령어를 실행합니다.gcloud compute instances get-serial-port-output REPLACEMENT_VM_NAME
REPLACEMENT_VM_NAME을 대체 인스턴스에 할당한 이름으로 바꿉니다.
임시
rc.local
스크립트가 완료되면 대체 인스턴스가 자동으로 재부팅됩니다. 두 번째 재부팅될 때 콘솔 로그를 검사하여 게스트 환경이 로드되는지 확인할 수 있습니다.SSH를 통해 인스턴스에 연결할 수 있는지 확인합니다.
Debian
사용 중인 운영체제 버전이 지원되는지 확인합니다.
복구 인스턴스로 사용할 새 인스턴스를 만듭니다. 이 인스턴스 이름을 rescue로 지정합니다. 이 복구 인스턴스는 문제가 있는 인스턴스와 동일한 Linux OS를 실행하지 않아도 됩니다. 이 예시에서는 복구 인스턴스에서 Debian 9을 사용합니다.
문제가 있는 인스턴스를 중지하고 부팅 디스크의 복사본을 만듭니다.
문제가 있는 인스턴스의 변수 이름을 설정합니다. 이렇게 하면 이후 단계에서 인스턴스를 쉽게 참조할 수 있습니다.
export PROB_INSTANCE_NAME=VM_NAME
VM_NAME을 문제가 있는 인스턴스의 이름으로 바꿉니다.
문제가 있는 인스턴스를 중지합니다.
gcloud compute instances stop "$PROB_INSTANCE_NAME"
문제가 있는 인스턴스의 부팅 디스크 이름을 가져옵니다.
export PROB_INSTANCE_DISK="$(gcloud compute instances describe \ "$PROB_INSTANCE_NAME" --format='json' | jq -r \ '.disks[] | select(.boot == true) | .source')"
부팅 디스크의 스냅샷을 만듭니다.
export DISK_SNAPSHOT="${PROB_INSTANCE_NAME}-snapshot" gcloud compute disks snapshot "$PROB_INSTANCE_DISK" \ --snapshot-names "$DISK_SNAPSHOT"
스냅샷에서 새 디스크를 만듭니다.
export NEW_DISK="${PROB_INSTANCE_NAME}-new-disk" gcloud compute disks create "$NEW_DISK" \ --source-snapshot="$DISK_SNAPSHOT"
스냅샷을 삭제합니다.
gcloud compute snapshots delete "$DISK_SNAPSHOT"
새 디스크를 복구 인스턴스에 연결하고 복구 인스턴스의 루트 볼륨을 마운트합니다. 이 절차에서는 추가 디스크를 하나만 연결하므로 새 디스크의 기기 식별자는 /dev/sdb가 됩니다. Debian은 기본적으로 디스크의 첫 번째 볼륨을 루트 볼륨으로 사용하므로 볼륨 식별자는 /dev/sdb1이 됩니다. 커스텀의 경우
lsblk
를 사용하여 볼륨 식별자를 결정합니다.gcloud compute instances attach-disk rescue --disk "$NEW_DISK"
-
gcloud compute ssh rescue
복구 인스턴스에서 다음 단계를 실행합니다.
새 디스크의 루트 볼륨을 마운트합니다.
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"
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
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"
새 디스크의 루트 볼륨을 마운트 해제합니다.
sudo umount "$NEW_DISK_MOUNT_POINT" && sudo rmdir "$NEW_DISK_MOUNT_POINT"
복구 인스턴스의 SSH 세션을 종료합니다.
복구 인스턴스에서 새 디스크를 분리합니다.
gcloud compute instances detach-disk rescue --disk "$NEW_DISK"
대체 인스턴스로 사용할 새 인스턴스를 만듭니다. 대체 인스턴스를 만들 때 새 디스크를 부팅 디스크로 지정합니다. Google Cloud Console을 사용하여 대체 인스턴스를 만들 수 있습니다.
Google Cloud Console에서 VM 인스턴스 페이지로 이동합니다.
문제가 있는 인스턴스를 클릭한 다음 유사하게 만들기를 클릭합니다.
대체 인스턴스의 이름을 지정합니다. 부팅 디스크 섹션에서 변경을 클릭한 다음 기존 디스크를 클릭합니다. 새 디스크를 선택합니다.
만들기를 클릭합니다. 인스턴스가 생성되면 대체 인스턴스가 자동으로 시작됩니다.
대체 인스턴스가 시작되면 임시
rc.local
스크립트가 실행되고 게스트 환경이 설치됩니다. 이 스크립트의 진행 상황을 보려면 콘솔 로그에서 임시rc.local
스크립트가 생성하는 줄을 검사합니다. 로그를 보려면 다음 명령어를 실행합니다.gcloud compute instances get-serial-port-output REPLACEMENT_VM_NAME
REPLACEMENT_VM_NAME을 대체 인스턴스에 할당한 이름으로 바꿉니다.
임시
rc.local
스크립트가 완료되면 대체 인스턴스가 자동으로 재부팅됩니다. 두 번째 재부팅될 때 콘솔 로그를 검사하여 게스트 환경이 로드되는지 확인할 수 있습니다.SSH를 통해 인스턴스에 연결할 수 있는지 확인합니다.
Ubuntu
사용 중인 운영체제 버전이 지원되는지 확인합니다.
복구 인스턴스로 사용할 새 인스턴스를 만듭니다. 이 인스턴스 이름을 rescue로 지정합니다. 이 복구 인스턴스는 문제가 있는 인스턴스와 동일한 Linux OS를 실행하지 않아도 됩니다. 이 예시에서는 복구 인스턴스에서 Debian 9을 사용합니다.
문제가 있는 인스턴스를 중지하고 부팅 디스크의 복사본을 만듭니다.
문제가 있는 인스턴스의 변수 이름을 설정합니다. 이렇게 하면 이후 단계에서 인스턴스를 쉽게 참조할 수 있습니다.
export PROB_INSTANCE_NAME=VM_NAME
VM_NAME을 문제가 있는 인스턴스의 이름으로 바꿉니다.
문제가 있는 인스턴스를 중지합니다.
gcloud compute instances stop "$PROB_INSTANCE_NAME"
문제가 있는 인스턴스의 부팅 디스크 이름을 가져옵니다.
export PROB_INSTANCE_DISK="$(gcloud compute instances describe \ "$PROB_INSTANCE_NAME" --format='json' | jq -r \ '.disks[] | select(.boot == true) | .source')"
부팅 디스크의 스냅샷을 만듭니다.
export DISK_SNAPSHOT="${PROB_INSTANCE_NAME}-snapshot" gcloud compute disks snapshot "$PROB_INSTANCE_DISK" \ --snapshot-names "$DISK_SNAPSHOT"
스냅샷에서 새 디스크를 만듭니다.
export NEW_DISK="${PROB_INSTANCE_NAME}-new-disk" gcloud compute disks create "$NEW_DISK" \ --source-snapshot="$DISK_SNAPSHOT"
스냅샷을 삭제합니다.
gcloud compute snapshots delete "$DISK_SNAPSHOT"
새 디스크를 복구 인스턴스에 연결하고 복구 인스턴스의 루트 볼륨을 마운트합니다. 이 절차에서는 추가 디스크를 하나만 연결하므로 새 디스크의 기기 식별자는 /dev/sdb가 됩니다. Ubuntu는 기본적으로 루트 볼륨의 라벨을 1로 지정하므로 볼륨 식별자는 /dev/sdb1이 됩니다. 커스텀의 경우
lsblk
를 사용하여 볼륨 식별자를 결정합니다.gcloud compute instances attach-disk rescue --disk "$NEW_DISK"
-
gcloud compute ssh rescue
복구 인스턴스에서 다음 단계를 실행합니다.
새 디스크의 루트 볼륨을 마운트합니다.
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"
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
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"
새 디스크의 루트 볼륨을 마운트 해제합니다.
sudo umount "$NEW_DISK_MOUNT_POINT" && sudo rmdir "$NEW_DISK_MOUNT_POINT"
복구 인스턴스의 SSH 세션을 종료합니다.
복구 인스턴스에서 새 디스크를 분리합니다.
gcloud compute instances detach-disk rescue --disk "$NEW_DISK"
대체 인스턴스로 사용할 새 인스턴스를 만듭니다. 대체 인스턴스를 만들 때 새 디스크를 부팅 디스크로 지정합니다. Google Cloud Console을 사용하여 대체 인스턴스를 만들 수 있습니다.
Google Cloud Console에서 VM 인스턴스 페이지로 이동합니다.
문제가 있는 인스턴스를 클릭한 다음 유사하게 만들기를 클릭합니다.
대체 인스턴스의 이름을 지정합니다. 부팅 디스크 섹션에서 변경을 클릭한 다음 기존 디스크를 클릭합니다. 새 디스크를 선택합니다.
만들기를 클릭합니다. 인스턴스가 생성되면 대체 인스턴스가 자동으로 시작됩니다.
대체 인스턴스가 시작되면 임시
rc.local
스크립트가 실행되고 게스트 환경이 설치됩니다. 이 스크립트의 진행 상황을 보려면 콘솔 로그에서 임시rc.local
스크립트가 생성하는 줄을 검사합니다. 로그를 보려면 다음 명령어를 실행합니다.gcloud compute instances get-serial-port-output REPLACEMENT_VM_NAME
REPLACEMENT_VM_NAME을 대체 인스턴스에 할당한 이름으로 바꿉니다.
임시
rc.local
스크립트가 완료되면 대체 인스턴스가 자동으로 재부팅됩니다. 두 번째 재부팅될 때 콘솔 로그를 검사하여 게스트 환경이 로드되는지 확인할 수 있습니다.SSH를 통해 인스턴스에 연결할 수 있는지 확인합니다.
게스트 환경 업데이트
게스트 환경이 오래되었다는 메시지가 표시되면 운영체제의 패키지를 업데이트합니다.
CentOS/RHEL
CentOS 및 RHEL 운영체제를 업데이트하려면 다음 명령어를 실행합니다.
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 Debian Ubuntu SLES Container-Optimized OS 89 이상 |
systemd | GCEGuestAgent Info: GCE Agent Started (version YYYYMMDD.NN) GCEMetadataScripts: 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
Google Cloud Console에서 VM 인스턴스 페이지로 이동합니다.
gcloud
게스트 환경에 로드되는 서비스
다음 표에는 게스트 환경이 작동 중인 인스턴스에 로드되어야 하는 서비스가 요약되어 있습니다. 인스턴스에 연결한 후 서비스 목록을 나열하는 명령어를 실행해야 하므로 이 검사는 인스턴스에 액세스할 수 있는 경우에만 수행할 수 있습니다.
운영체제 | 서비스를 나열하는 명령어 | 예상 출력 |
---|---|---|
CentOS/RHEL 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 | rpm -qa --queryformat '%{NAME}\n' \ |grep -iE google\|gce | 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 -iE '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 -iE "google" |
google-compute-engine-oslogin google-compute-engine google-guest-agent google-osconfig-agent |
SUSE(SLES) | rpm -qa --queryformat '%{NAME}\n' \ |grep -iE 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 |