로컬에 데이터센터를 만들려면 맨 아래층부터 시작해야 한다. 그 시작이 VM이다. 그런데 우분투를 매번 ISO로 깔면 유저 만들고, 디스크 나누고, 패키지 설치하는 데만 20–30분이 든다. 실습 환경을 열 번 갈아엎으면 그 시간도 열 배가 된다.
이 글에서는 lab-infra 프로젝트로 로컬 KVM 기반 VM 실습 환경을 자동으로 구성한다. Packer로 Ubuntu 22.04 기반 이미지를 한 번 빌드해두고, 이후 libvirt + Terraform으로 몇 초 만에 VM을 찍어내는 것이 목표다. 이 편은 그 첫 단계 — 베이스 이미지 만들기다.
시리즈 로드맵
- 0편: Packer로 base 이미지 생성 (이 글)
- 1편: Terraform으로 libvirt provider 설정
- 2편: VM 프로비저닝 및 네트워킹 구성
왜 Packer인가
Packer는 HashiCorp에서 만든 이미지 빌드 도구다. 하나의 구성으로 여러 플랫폼에 동일한 이미지를 자동 생성할 수 있다. 우분투 ISO로 매번 수동 설치하는 대신 커스텀 이미지를 만들어두면, 설치 시간이 줄고 환경이 통일된다. CI/CD·테스트·실험용 VM처럼 같은 환경을 반복해서 띄우는 경우에 특히 유리하다.
실제로 이런 상황에서 값어치를 한다.
- 여러 명이 동일한 실습 환경을 써야 할 때
- 서버를 부팅하자마자 곧바로 서비스 테스트가 가능해야 할 때
- CI 파이프라인에서 반복적으로 VM을 생성하는 경우
qcow2는 무엇이고 왜 쓰는가
qcow2는 QEMU/KVM에서 쓰는 가상 디스크 포맷이다. 세 가지 이점이 있다.
- 스냅샷을 지원한다.
- sparse·압축으로 디스크 공간을 절약한다.
- VM 간 공유와 배포가 쉽다.
커스텀 이미지를 만드는 이유
기본 Ubuntu ISO로 설치하면 부팅 후 유저 생성, 디스크 파티션 설정, 패키지 설치 같은 수동 과정을 거쳐 20–30분이 걸린다. Packer에 cloud-init을 붙이면 유저·hostname·ssh key·커널 설치까지 자동화된 qcow2 이미지를 만들 수 있다. 그러면 같은 환경에서 수초–수분 내에 VM이 뜬다. 초기화 시간이 줄고 반복 작업이 사라지므로, 테스트 자동화(CI/CD, GitHub Actions 등)에도 그대로 이어진다.
사전 준비
- Ubuntu 기반 호스트 (예: Ubuntu 22.04 Desktop)
- 가상화 지원 CPU (BIOS에서 VT-x/AMD-V 활성화)
git, make, libvirt, qemu, packer, tfenv 등은 아래 과정에서 자동으로 설치된다. Terraform 버전은 .terraform-version 파일을 통해 자동으로 선택된다.
1단계: 초기 설정
| |
2단계: 의존성 준비
| |
두 명령 모두 그룹 권한이 새로 붙기 때문에, 실행한 다음 로그아웃 후 다시 접속해야 반영된다.
3단계: QEMU / Packer 버전 확인
환경이 제대로 깔렸는지 빠르게 확인한다.
| |
예상 출력은 이렇다.
| |
출력이 비어 있거나 버전이 안 나오면, make prepare 이후 터미널을 재시작하거나 로그아웃 후 다시 로그인해야 한다.
4단계: Packer로 이미지 빌드
| |
Ubuntu ISO는 자동으로 다운로드된다. 첫 빌드는 ISO 다운로드와 설치로 약 15–30분이 걸린다. 빌드 도중 실패하면 [context canceled] 에러가 날 수 있는데, 다시 시도하면 된다.
빌드가 끝나면 결과물 .qcow2 파일을 확인한다.
| |
성공하면 이런 메시지가 나온다.
| |
템플릿 구조
ubuntu.pkr.hcl— 메인 entrypoint. 실제로 쓸 빌더와 변수 파일을 정의한다.jammy.json— 빌더, 부트 커맨드, 디스크 포맷, ISO 설정을 담는다.http/— cloud-init 설정이 들어 있고, Packer가 빌드 중 로컬 서버로 제공한다.
다음 편
베이스 이미지가 생겼으니, 다음 편에서는 이 이미지를 Terraform libvirt provider로 VM에 적용하고 실제로 띄워본다.