Proxmox에서 Cloud-Init 사용하기
안녕하세요. 팡킨입니다.
VM으로 서버를 운영하다 보면 가장 귀찮은 부분이 초기 OS 설치와 네트워크 설정이라고 생각합니다. 한두 번이면 몰라도 같은 작업을 몇 번 반복하다 보면 상당히 지겨워집니다.
Cloud-Init은 클라우드에서 특히 많이 사용하는 인스턴스 초기화 도구로 시스템이 부팅되는 동안 네트워크 설정과 SSH 공유키 설정, 유저 설정 등의 작업을 자동으로 수행합니다.
Proxmox에서도 Cloud-Init을 지원하며 Proxmox의 템플릿 기능과 함께 사용하면 쉽게 VM을 만들 수 있습니다.
Cloud-Init 템플릿 생성
많은 리눅스 배포판에서 바로 사용할 수 있는 Cloud-Init 이미지를 제공합니다. 아래 링크는 제가 테스트 해 본 이미지 다운로드 링크입니다.
- 우분투 24.04: https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img
- 데비안 12: https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-genericcloud-amd64.qcow2
- Rocky Linux 9: https://ftp.kaist.ac.kr/pub/rocky/9.5/images/x86_64/Rocky-9-GenericCloud-LVM.latest.x86_64.qcow2
만약 Cloud-Init 이미지를 제공하지 않는 배포판을 사용하시거나 커스텀을 원하신다면 일반 ISO를 이용해서 VM에 설치하고 원하시는 설정을 마친 후 Cloud-Init을 설치하고 템플릿을 뜨시면 됩니다.
사용하실 배포판를 결정하셨으면 Proxmox 호스트에 다운로드합니다. 위치는 어디든 관계 없습니다. 저는 예를 들기 위해 우분투로 하지만 다른 배포판으로 진행하셔도 됩니다.
wget https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img
다운로드 후 템플릿으로 만들 VM을 생성합니다. 저는 터미널에서 작업했지만 디스크 Import하는 부분을 제외하고는 웹에서 하셔도 됩니다. 원하시는 설정에 맞게 변경하셔도 됩니다.
qm create 9003 --cpu x86-64-v2-AES --cores 2 --memory 2048 --net0 virtio,bridge=vmbr0 --scsihw virtio-scsi-pci --name Ubuntu-24.04
VM이 생성되었으면 다운로드 받은 이미지를 이용해 디스크를 만듭니다. 경로는 절대 경로를 사용하셔야 합니다.
qm set 9003 --scsi0 local-lvm:0,import-from=/path/to/image
Cloud-Init 데이터를 VM에 전달할 때 사용할 드라이브를 연결합니다.
qm set 9003 --ide2 local-lvm:cloudinit
생성한 SCSI 디스크로 부팅하도록 설정합니다.
qm set 9003 --boot order=scsi0
대부분의 Cloud-Init 이미지는 시리얼 포트를 통해 콘솔을 출력한다고 합니다. 따라서 시리얼 포트를 만들어줍니다.
qm set 9003 --serial0 socket --vga serial0
사용하실 SSH 공개키를 지정합니다. SSH 키가 없으시다면 ssh-keygen 명령어로 생성 후 진행합니다.
qm set 9003 --sshkey ~/.ssh/id_rsa.pub
사용할 유저 이름을 지정합니다.
qm set 9003 --ciuser <USER_NAME>
이제 템플릿으로 전환합니다.
qm template 9003
템플릿 사용하기
이제 템플릿을 이용해 VM을 만들어보겠습니다. 지금부터는 Proxmox 웹 콘솔에서 작업합니다.
기본 디스크 크기가 너무 작기 때문에 늘려 주겠습니다. 생성한 템플릿 - 하드웨어 - 하드 디스크를 선택하고 디스크 Action - 크기 조정을 클릭합니다.

추가할 디스크 크기를 입력합니다. 입력한 숫자는 최종 용량이 아니라 기존 디스크 크기에서 추가될 크기이기 때문에 "최종 용량 - 기존 용량"으로 계산하여 입력합니다. 저는 기존 용량이 3.5기가이고 원하는 용량이 50기가이기 때문에 46.5기가를 지정하였습니다.

디스크 크기 조정을 클릭하면 변경된 디스크 크기를 확인할 수 있습니다.

이제 템플릿을 복제하겠습니다. 오른쪽 위 더보기를 클릭하고 복제를 클릭합니다.

VM ID와 이름을 지정하고, 모드를 Full Clone으로 변경합니다. 변경 후 복제 버튼을 클릭합니다.

복제가 완료되었으면 생성된 VM을 클릭하고 Cloud-Init - IP 구성을 클릭합니다.

IP를 지정합니다. 저는 DHCP를 이용하겠습니다.

OK 버튼을 클릭하고 이미지 재생성 버튼을 클릭합니다.

이제 VM의 전원을 켜고 콘솔 탭을 클릭하면 Cloud-Init이 네트워크와 패키지 업그레이드 등을 수행하는 것을 확인할 수 있습니다.

지정한 사용자로 SSH를 이용해 접속하면 OS가 정상적으로 설치된 것을 확인할 수 있습니다.

구성 완료
오늘은 Cloud-Init을 이용해서 VM을 설정하는 방법에 대해 알아보았습니다. 사실 Cloud-Init에는 userdata라는 것을 이용해 스크립트를 자동으로 실행하는 방법도 있으나 Proxmox에서는 지원하지 않습니다.
하지만 Proxmox hookscripts를 이용해 비슷한 작업을 할 수 있어 이것에 대해 알아봐도 좋을 것 같습니다.
https://pve.proxmox.com/pve-docs/pve-admin-guide.html#_hookscripts