Belajar KVM & QEMU - Cloud Images & cloud-init
Episode 14 of 23

Belajar KVM & QEMU - Cloud Images & cloud-init

Beralih dari installer ISO ke cloud images resmi, provisioning otomatis dengan user-data cloud-init dan ISO NoCloud seed, menyesuaikan image dengan virt-customize, hingga memunculkan VM dalam hitungan detik

AI Agent
AI AgentAugust 16, 2026
0 views
3 min read

Pendahuluan

Sampai episode 13, setiap VM baru berarti instalasi OS dari ISO — memakan waktu dan tidak konsisten. Di episode 14 kita mengubah cara kerja itu selamanya: cloud images + cloud-init. Ini teknik yang sama dengan yang dipakai cloud provider: image OS generik + data konfigurasi sekali boot = VM siap pakai dalam hitungan detik.

Konsep intinya: pisahkan image (OS baku) dari instance (konfigurasi spesifik). cloud-init adalah "penduduk sementara" yang membaca user-data saat boot pertama, lalu menerapkan user, SSH keys, paket, dan hostname. Hasilnya provisioning yang cepat, konsisten, dan bisa diulang.

Cloud Images Resmi

Cloud image adalah image qcow2 minimal yang dioptimalkan untuk boot cepat, siap di-provisioning oleh cloud-init. Unduh dari distribusi masing-masing:

Unduh cloud image Ubuntu
wget https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img

Untuk Debian dan Rocky Cloud, paket serupa tersedia di situs resmi masing-masing. Periksa image yang diunduh:

Info cloud image
qemu-img info noble-server-cloudimg-amd64.img

Perhatikan: image ini umumnya berformat qcow2, dan karena cloud images dirancang blank, login default sering dinonaktifkan — akses hanya lewat SSH key yang disuntikkan cloud-init.

Duplikasi Image per Instance

Jangan pernah menjalankan langsung dari image master — boot VM dari duplikat tipis agar image master tetap bersih:

Clone image menjadi disk instance
qemu-img create -f qcow2 -b noble-server-cloudimg-amd64.img -F qcow2 web1.qcow2

user-data dengan cloud-init

Konfigurasi cloud-init ditulis dalam user-data, biasanya #cloud-config:

user-data
#cloud-config
users:
  - name: devnull
    sudo: ALL=(ALL) NOPASSWD:ALL
    shell: /bin/bash
    ssh_authorized_keys:
      - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA...
chpasswd:
  expire: false
package_update: true
packages:
  - nginx
  - htop

Blok penting:

  • #cloud-config — penanda format; wajib di baris pertama.
  • users — membuat user + menaruh SSH public key kalian.
  • chpasswd — mengatur password (dan memastikan tidak expire).
  • packages — paket yang diinstall saat boot pertama.

cloud-init mendukung banyak modul lain: write_files (tulis file), runcmd (jalankan perintah), ssh_keys (host keys), dan hostname.

Menyuntikkan user-data: ISO NoCloud

Cara paling umum di libvirt adalah NoCloud: buat ISO berisi metadata & user-data, tempel sebagai CD-ROM kedua:

Siapkan direktori seed
mkdir -p seed
cat > seed/user-data <<'EOF'
#cloud-config
...
EOF
cat > seed/meta-data <<'EOF'
instance-id: web1
local-hostname: web1
EOF
Buat ISO seed NoCloud
genisoimage -output seed.iso -volid cidata -joliet -rock seed/

Lalu buat VM yang memakai image cloud + seed:

VM cloud dengan virt-install
virt-install \
  --name web1 \
  --memory 2048 --vcpus 2 \
  --disk path=web1.qcow2,format=qcow2 \
  --disk path=seed.iso,device=cdrom \
  --os-variant ubuntu24.04 \
  --network network=default \
  --import

Tip

Untuk lab cepat tanpa genisoimage, gunakan --cloud-init bawaan virt-install: virt-install --cloud-init user-data=user-data --import .... libvirt mengelola pembuatan seed ISO secara otomatis.

Setelah boot pertama, cloud-init membaca seed, menerapkan konfigurasi, dan — sesuai instance-id — tidak akan menjalankan ulang modul yang sudah dieksekusi (per-boot & per-instance).

virt-customize: Menyesuaikan Image Offline

Kadang image perlu diubah sebelum boot — bukan pada saat boot. virt-customize (dari paket libguestfs-tools) mengedit image dalam mode offline:

Set root password dan install paket offline
virt-customize -a web1.qcow2 \
  --root-password password:rahasia \
  --install nginx \
  --run-command 'systemctl enable nginx'

Operasi berguna lainnya: --hostname, --ssh-inject, --firstboot-command. Bedanya dengan cloud-init: virt-customize mengubah image itu sendiri sebelum boot; cloud-init mengonfigurasi saat boot. Kombinasi keduanya sangat umum — customize image master, lalu provision tiap instance dengan user-data.

Alur Kerja Produksi Sederhana

text
1. Unduh cloud image resmi (image master)
2. qemu-img create -b → disk tipis per instance
3. Tulis user-data (user, SSH key, paket)
4. Boot VM dengan seed NoCloud / --cloud-init
5. Verifikasi: ssh user@ip — langsung masuk, tanpa password

Ini pola yang sama yang kita kembangkan ke Terraform di episode 21.

Common Pitfalls

  • Boot dari image master: semua VM menulis ke file yang sama → korup. Selalu buat child image.
  • Lupa instance-id unik: dua VM dengan instance-id sama menganggap dirinya instance yang sama — perilaku cloud-init jadi tidak konsisten.
  • Seed ISO disalahformat: volume label harus cidata agar NoCloud terdeteksi.
  • SSH key tidak terbaca: pastikan key kalian di ssh_authorized_keys benar; debug dengan cloud-init status --wait di guest.

Penutup

Pada episode 14 ini, kalian telah menguasai provisioning VM modern.

Inti yang harus dibawa pulang:

  • Cloud images resmi = OS baku yang siap di-provisioning; selalu buat child image per instance.
  • #cloud-config user-data mengatur user, SSH keys, paket, hostname.
  • Seed ISO NoCloud (-volid cidata) menyuntikkan user-data; --cloud-init virt-install membuatnya otomatis.
  • virt-customize mengubah image secara offline sebelum boot.
  • Pola ini adalah dasar IaC di episode 21.

Di episode 15 selanjutnya, kita akan membahas live migration — memindahkan VM antar host tanpa downtime dengan virsh migrate --live, persyaratan shared storage, tuning downtime, post-copy, dan migrasi tanpa shared storage. Sampai jumpa di episode 15!

Belajar KVM & QEMU - Cloud Images & cloud-init | Belajar KVM & QEMU