터미널 스크립트 실행, 부팅 매개변수 업데이트, 바이너리 전송, GPU 드라이버 설치 등 가상 머신 이미지를 맞춤설정하려면 맞춤설정 레시피 (imagebuilder.yaml)의 spec.steps 블록 내에서 특정 도우미 작업을 정의하면 됩니다.
개요
Image Builder 빌드의 실행 단계에서 오케스트레이터는 맞춤설정 레시피 (spec.steps)에 선언된 단계를 임시 작업자 VM에서 순차적으로 실행합니다.
각 단계는 해당 작업 유형에 맞게 조정된 name, action, inputs 블록을 지정해야 합니다. Image Builder는 다음 맞춤설정 작업을 지원합니다.
Shell: 작업자 게스트 OS에서 인라인 터미널 스크립트 또는 명령어를 실행합니다.UpdateKernelCommandLine: 부팅 매개변수와 커널 명령줄 플래그를 수정합니다.FileCopy: Cloud Storage 또는 로컬 작업 공간에서 VM으로 구성 파일, 스크립트 또는 애셋을 전송합니다.InstallGPU: NVIDIA GPU 드라이버를 다운로드, 컴파일, 등록합니다.
셸 작업
Shell 작업을 사용하면 임시 작업자 VM의 게스트 OS에서 인라인 터미널 스크립트 또는 단일 셸 명령어를 실행하여 패키지 업데이트, 사용자 계정 구성, 소프트웨어 컴파일과 같은 맞춤설정을 실행할 수 있습니다.
steps.inputs 아래에 다음 입력 중 하나를 지정합니다.
inlineScript(문자열): 실행할 원시 다중 행 셸 명령어입니다.command(문자열): 단일 시스템 명령어 문자열 또는 바이너리 파일 실행 파일의 상대 경로입니다.
샘플 구성
다음 탭에는 인라인 스크립트를 실행하는 경우와 단일 명령어를 실행하는 경우의 샘플 단계 구성이 나와 있습니다.
인라인 스크립트 실행
다음 구성은 apt를 사용하여 패키지를 업데이트하는 여러 줄 스크립트를 실행합니다.
- name: "Update guest packages and configure groups"
action: Shell
inputs:
inlineScript: |
#!/bin/bash
apt-get update -y
apt-get install -y fail2ban build-essential
groupadd -r adminusers
단일 명령어 실행
다음 구성은 활성 운영체제 커널 버전을 확인하기 위해 단일 셸 명령어를 실행합니다.
- name: "Log kernel identifier"
action: Shell
inputs:
command: "uname -a"
특수 동작
Shell 작업을 실행하면 맞춤설정 프로비저너가 다음 섹션에 설명된 대로 보안 감사 및 자동 시스템 재부팅을 관리합니다.
보안 감사
민감한 토큰, 보안 비밀, 독점 코드가 실행 로그에 유출되지 않도록 맞춤설정 프로비저닝 도구는 대화형 디버깅이 사용 설정되지 않는 한 (debug: true) 스크립트의 원시 행을 출력하지 않습니다. 대신 스크립트 페이로드의 SHA-256 무결성 해시를 빌드 로그에 기록합니다. 이 해시는 이미지에서 실행된 코드의 정확한 변경 불가능한 감사 추적을 제공합니다.
시스템 재부팅 (종료 코드 3010)
커널 패치 업데이트나 저장소 파티션 조정과 같은 일부 셸 작업에는 후속 단계를 실행하기 전에 시스템 재부팅이 필요합니다.
맞춤설정 중에 시스템 재부팅을 요청하려면 셸 스크립트가 exit 3010 명령어로 끝나야 합니다. 맞춤설정 프로비저너가 종료 코드 3010를 수신하면 다음과 같이 재부팅 수명 주기를 처리합니다.
- 프로비저너가 종료 코드
3010를 감지하고 실행을 일시중지하며 단계 진행률 색인을 표시합니다. - 프로비저너가 작업자 VM을 재부팅합니다.
- VM이 다시 시작되면 프로비저너가 작업공간을 마운트하고 대기열의 다음 단계에서 파이프라인을 자동으로 재개합니다.
재부팅 예:
다음 예에서는 패키지를 업데이트하고 재부팅을 요청하는 단계 구성을 보여줍니다.
- name: "Install core updates and request reboot"
action: Shell
inputs:
inlineScript: |
#!/bin/bash
echo "Applying configuration package upgrades..."
apt-get dist-upgrade -y
# Terminate with return code 3010 to trigger a system reboot
exit 3010
- name: "Post-reboot verification"
action: Shell
inputs:
command: "uname -r"
UpdateKernelCommandLine 작업
UpdateKernelCommandLine 작업은 콘솔 로그를 구성하거나 커널 매개변수를 조정하는 등 시스템 부팅 시 커널에 전달된 명령줄 플래그를 찾거나, 바꾸거나, 삽입하거나, 삭제합니다.
steps.inputs 맵에서 다음 속성을 지정합니다.
oldArguments(문자열, 필수): 부트로더 구성 내에서 찾거나 삭제하거나 대체할 정확한 명령줄 인수입니다.newArguments(문자열, 선택사항): 대상 플래그 대신 작성할 대체 인수입니다.newArguments속성을 생략하면 Image Builder가oldArguments속성에 구성된 파라미터를 부팅 라인에서 완전히 삭제합니다.
샘플 구성
다음 탭에는 커널 부팅 인수를 대체하거나 삭제하는 샘플 단계 구성이 나와 있습니다.
부팅 인수 바꾸기
다음 구성은 커널 로그 수준 키 loglevel=4를 찾아 더 자세한 매개변수 loglevel=6 console=ttyS0로 대체합니다.
- name: "Configure detailed boot logging"
action: UpdateKernelCommandLine
inputs:
oldArguments: "loglevel=4"
newArguments: "loglevel=6 console=ttyS0"
부팅 인수 삭제
다음 구성은 quiet 매개변수를 검색하고 부팅 인수에서 삭제하여 시작 확인 단계에서 상세 로깅을 사용 설정합니다.
- name: "Enable verbose startup diagnostics"
action: UpdateKernelCommandLine
inputs:
oldArguments: "quiet"
OS별 실행 세부정보
다음 탭에서는 소스 게스트 운영체제에 따라 맞춤설정 프로비저너가 이미지 수정을 처리하는 방법을 설명합니다.
Container-Optimized OS(COS)
COS는 읽기 전용 파티션 레이아웃을 사용하므로 표준 구성 도구를 생략합니다. 맞춤설정 프로비저닝 도구는 다음을 실행합니다.
- 활성 부팅 기기 경로를 확인합니다.
- 부팅 기기의 파티션 12(EFI 파티션)를 마운트합니다.
/efi/boot/grub.cfg내에서 부트로더 매개변수를 직접 업데이트합니다.- 파티션 12를 안전하게 마운트 해제합니다.
Ubuntu
Ubuntu 이미지에서 맞춤설정 프로비저너는 다음을 실행합니다.
/etc/default/grub및/etc/default/grub.d/*.cfg아래의 파일을 엽니다.GRUB_CMDLINE_LINUX블록 아래에 타겟 인수를 삽입하거나 수정하거나 삭제합니다.- 패키지 명령어
update-grub를 실행하여 부트로더 구성을 다시 생성합니다.
FileCopy 작업
FileCopy 작업은 원격 버킷이나 로컬 저장소에서 구성 파일, 바이너리 또는 인증서를 맞춤 이미지로 복사합니다. 맞춤설정 프로비저너는 소스 파일을 다운로드하거나 읽고, 작업자 VM의 지정된 게스트 경로에 파일을 쓰고, 권한을 구성합니다.
steps.inputs 아래에 다음 입력을 지정합니다.
destination(문자열, 필수): 파일이 생성되는 게스트 OS의 절대 경로입니다.permissions(문자열, 필수): 대상 구성 권한의 8진수 표현입니다(예:"0755"또는"0644").- 다음 소스 속성 중 하나를 지정합니다.
gcsSourcePath(문자열): 소스 파일의 Cloud Storage URI입니다.gs://BUCKET_NAME/OBJECT_NAME형식을 따라야 합니다.localSourcePath(문자열): 로컬 작업공간 저장소 폴더 내 파일의 상대 경로입니다. 보안을 위해../를 사용한 경로 순회가 차단됩니다.
샘플 구성
다음 탭에서는 Cloud Storage에서 파일을 복사하는 경우와 로컬 작업공간에서 복사하는 경우의 샘플 단계 구성을 보여줍니다.
Cloud Storage
다음 구성은 Cloud Storage 버킷의 구성 템플릿을 게스트 VM 이미지에 복사합니다.
- name: "Import licensing configuration"
action: FileCopy
inputs:
gcsSourcePath: "gs://enterprise-configs-bucket/licensing/license.key"
destination: "/etc/app/license.key"
permissions: "0600"
로컬 작업공간
다음 구성은 이전 Cloud Build 단계에서 컴파일된 애플리케이션 스크립트를 복사합니다.
- name: "Deploy setup automation daemon"
action: FileCopy
inputs:
localSourcePath: "bin/setup-daemon"
destination: "/usr/local/bin/setup-daemon"
permissions: "0755"
OS별 가이드라인
다음 탭에서는 타겟 게스트 운영체제에 따른 파일 위치 가이드라인을 설명합니다.
Container-Optimized OS(COS)
COS 이미지에는 보안을 위해 읽기 전용 파티션 레이아웃이 포함되어 있습니다. /usr/ 또는 /bin/과 같은 일부 표준 시스템 타겟은 쓰기 금지되어 있습니다.
COS에서 파일 대상을 구성할 때는 다음 사항에 유의하세요.
/var또는/home과 같이 쓰기 가능한 상태 저장 위치 내에만 파일을 지정합니다.- 적절한 경로를 확인하려면 공식 Container-Optimized OS 디스크 및 파일 시스템 참조를 참고하세요.
Ubuntu
Ubuntu 이미지에는 표준 Linux 읽기-쓰기 루트 파티션 레이아웃 (/)이 있습니다. 사용자 프로필 또는 대상 폴더에 작업자 VM에 대한 적절한 구성 권한이 있는 경우 /etc, /usr/local/bin, /var 또는 /home과 같은 표준 시스템 경로 내에 파일 대상을 지정할 수 있습니다.
InstallGPU 작업
InstallGPU 작업을 사용하여 머신러닝, 데이터 과학 또는 과학 워크로드에 최적화된 VM 이미지를 빌드합니다. Image Builder는 맞춤 이미지에서 NVIDIA GPU 드라이버를 다운로드, 컴파일, 등록합니다. 기본 이미지 유형과 타겟 하드웨어에 따라 사전 컴파일된 드라이버를 설치하거나 맞춤 드라이버 .run 파일을 컴파일할 수 있습니다.
steps.inputs 아래에 다음 입력 중 하나를 지정합니다.
version(문자열): 타겟 NVIDIA 드라이버 버전 번호입니다(예:"595.129.03").version만 지정하면 오케스트레이터가 공식 NVIDIA 저장소(https://us.download.nvidia.com/tesla/<version>)에서 드라이버를 다운로드합니다.gcsRunfile(문자열):gs://BUCKET_NAME/OBJECT_NAME.run형식을 사용해야 하는 맞춤 NVIDIA 드라이버 설치 프로그램 파일의 Cloud Storage 경로입니다.sourceRunfile(문자열): 로컬 작업공간 저장소 폴더 내 설치 프로그램.run파일의 상대 경로입니다.
샘플 구성
다음 탭에서는 특정 사전 패키지 드라이버 버전을 설치하는 경우와 맞춤 실행 파일을 설치하는 경우의 샘플 단계 구성을 보여줍니다.
표준 버전 다운로드
다음 구성은 공식 저장소에서 지정된 NVIDIA 드라이버 버전을 다운로드하고 설치합니다.
- name: "Configure default NVIDIA drivers"
action: InstallGPU
inputs:
version: "<var>DRIVER_VERSION</var>"
Cloud Storage 실행 파일
다음 구성은 Cloud Storage 버킷에서 직접 맞춤 NVIDIA 드라이버 .run 설치 프로그램을 배포합니다.
- name: "Deploy custom GPU driver from Cloud Storage"
action: InstallGPU
inputs:
gcsRunfile: "gs://<var>BUCKET_NAME</var>/drivers/NVIDIA-Linux-aarch64-<var>DRIVER_VERSION</var>.run"
로컬 작업공간 실행 파일
다음 구성은 로컬 저장소 작업 공간에서 맞춤 NVIDIA 드라이버 .run 설치 프로그램을 배포합니다.
- name: "Deploy custom GPU driver from workspace"
action: InstallGPU
inputs:
sourceRunfile: "drivers/NVIDIA-Linux-x86_64-<var>DRIVER_VERSION</var>.run"
구성 방법
다음 탭에서는 맞춤 이미지에서 NVIDIA GPU 드라이버를 구성하는 데 지원되는 방법을 설명합니다.
사전 컴파일된 드라이버
사전 패키지된 드라이버 버전을 사용하여 드라이버를 처음부터 컴파일하는 컴퓨팅 오버헤드와 빌드 시간을 방지하는 것이 좋습니다.
Container-Optimized OS (COS): Google에서 사전 패키징한 드라이버 버전을 지정하면 맞춤설정 프로비저닝 도구가 게스트 도구
cos-extensions install gpu를 실행하여 활성화합니다.COS 출시에서 지원되는 사전 컴파일된 드라이버 버전 목록을 보려면 실행 중인 COS 인스턴스에서
sudo cos-extensions list를 실행하거나 GPU 드라이버 버전 식별을 참고하세요.Ubuntu: Ubuntu에서 빌드 시간을 절약하려면 NVIDIA 드라이버가 사전 설치된 공개
ubuntu-os-accelerator-images프로젝트에서 사전 구성된 기본 이미지를 선택하는 것이 좋습니다.사용 가능한 액셀러레이터 이미지를 나열하려면
gcloudCLI에서 다음 명령어를 실행합니다.gcloud compute images list \ --project=ubuntu-os-accelerator-images \ --no-standard-images
맞춤 실행 파일
Google 또는 Canonical에서 사전 컴파일하지 않은 맞춤 드라이버 버전을 설치해야 하는 경우 다음과 같이 컴파일을 위한 직접 설치 프로그램 실행 파일을 지정할 수 있습니다.
- Ubuntu: 게스트 내 컴파일을 실행합니다. 맞춤설정 프로비저너는 일치하는 커널 헤더(
linux-headers-$(uname -r))를 자동으로 설치하고, 작업자 VM에서 NVIDIA 드라이버.run파일을 컴파일하고, Dynamic Kernel Module Support (DKMS)에 등록합니다. DKMS에 등록하면 사소한 커널 업데이트 전반에서 드라이버가 활성 상태로 유지됩니다. - Container-Optimized OS (COS): 컴파일 동작은 소스 기본 VM 이미지의 CPU 아키텍처에 따라 다릅니다.
- ARM64 이미지: ARM64 COS VM은 게스트 내 헤더 컴파일을 지원하지 않으므로 Image Builder는 빌드 컨테이너 내에서 맞춤 드라이버
.run유틸리티를 자동으로 교차 컴파일하고 결과 번들을 작업자 VM의/var/lib/nvidia에 설치합니다. - x86-64 이미지: 작업자 VM에서 직접 게스트 내 컴파일을 실행합니다.
- ARM64 이미지: ARM64 COS VM은 게스트 내 헤더 컴파일을 지원하지 않으므로 Image Builder는 빌드 컨테이너 내에서 맞춤 드라이버
다음 단계
- 이미지 맞춤설정 파일 스키마에서 최상위 스키마 블록을 검토합니다.
- Cloud Build 구성 파일 스키마에서 파이프라인 오케스트레이션 매개변수를 구성합니다.
- 튜토리얼에 따라 Image Builder 파이프라인을 만드세요.