Episode ini membahas penambahan resource secara live: menambah vCPU dan memory lewat API socket tanpa restart, refleksinya di guest via ACPI, serta device passthrough VFIO untuk GPU dan perangkat lain. Kalian juga mengenal vfio-user yang masih eksperimental dan praktik aman melakukan hotplug di production.

Setelah networking siap di episode 7, sekarang kita bicara kelincahan operasional: kemampuan mengubah resource VM tanpa mematikannya. Di dunia cloud, "restart untuk tambah RAM" adalah kemewahan yang tidak selalu bisa dibeli — apalagi saat workload produksi sedang melayani ribuan request.
Hotplug di Cloud Hypervisor dibangun di atas mekanisme kernel (ACPI) dan dioperasikan lewat API socket. Di episode 8 kita menambah vCPU dan memory secara live, memverifikasinya di dalam guest, lalu membahas level tertinggi fleksibilitas: device passthrough dengan VFIO untuk memberikan perangkat fisik langsung ke VM.
Untuk mengoperasikan VM yang sedang berjalan, aktifkan kontrol API saat start:
cloud-hypervisor \
--kernel kernel-vmlinux \
--disk path=os.raw \
--cpus boot=2,max=16 \
--memory size=2G,hotplug_size=12G,hotplugged_size=0 \
--api-socket /tmp/ch.sock \
--serial tty--api-socket /tmp/ch.sock membuka Unix socket sebagai remote control. Seluruh operasi hotplug, snapshot, dan live migration dilakukan lewat socket ini menggunakan curl (Cloud Hypervisor memakai API HTTP over Unix socket).
curl --unix-socket /tmp/ch.sock http://localhost/api/v1/vm.infovm.info menampilkan konfigurasi VM saat ini — mulai dari vCPU, memory, hingga device yang terpasang. Ini titik awal semua operasi runtime.
curl --unix-socket /tmp/ch.sock -X PUT \
-H "Content-Type: application/json" \
--data '{"desired_vcpus": 6}' \
http://localhost/api/v1/vm.resizedesired_vcpus: 6 menaikkan jumlah vCPU dari 2 menjadi 6 tanpa menghentikan VM. Batas atasnya adalah max yang diset saat start (max=16 pada contoh di atas). Jika ingin menurunkan lagi, set desired_vcpus ke angka yang lebih kecil.
Di dalam guest, vCPU baru muncul sebagai CPU online setelah sistem operasi memproses notifikasi ACPI. Verifikasi:
nproc
lscpu | grep "^CPU(s):"
cat /sys/devices/system/cpu/onlineKadang CPU baru butuh diaktifkan eksplisit (tergantung distro dan kernel config). Jika nproc belum berubah, cek apakah CPU terdeteksi tapi offline:
ls /sys/devices/system/cpu/cpu6/
echo 1 | sudo tee /sys/devices/system/cpu/cpu6/onlineMemory di-hotplug lewat perangkat ACPI yang bisa "dicolokkan" ke guest. Dengan hotplug_size=12G di konfigurasi, kita punya ruang untuk menambahkan:
curl --unix-socket /tmp/ch.sock -X PUT \
-H "Content-Type: application/json" \
--data '{"desired_ram": 6442450944}' \
http://localhost/api/v1/vm.resizedesired_ram: 6442450944 (6 GB) menaikkan RAM dari 2 GB menjadi 6 GB. Angka dalam bytes — jebakan yang sama seperti config JSON di episode 5.
Di dalam guest, memory tambahan muncul sebagai memory block baru. Verifikasi dengan:
free -h
grep -c "online" /sys/devices/system/memory/memory*/stateJika total memory di free -h belum berubah, cek apakah block memory yang baru masih offline:
echo online | sudo tee /sys/devices/system/memory/memory*/stateImportant
Hotplug memory tidak selalu langsung terlihat di guest tanpa ruang untuk memory block baru (misal karena memulai VM dengan size yang tidak kelipatan block memory 128 MB, atau karena zona memory tidak memungkinkan). Praktik aman: selalu mulai dengan size kelipatan 128 MB dan uji hotplug di lab sebelum production.
Kebalikan dari menambah, virtio-balloon memungkinkan host menarik memory yang tidak terpakai guest:
curl --unix-socket /tmp/ch.sock -X PUT \
-H "Content-Type: application/json" \
--data '{"desired_size": 536870912}' \
http://localhost/api/v1/vm.resizedesired_size: 536870912 (512 MB) menekan guest untuk mengembalikan memory ke host. Ini dasar oversubscription memory: jalankan banyak VM dari memory fisik yang terbatas, lalu tarik kembali saat beban menurun.
Terkadang virtio tidak cukup — workload butuh perangkat fisik secara langsung: GPU untuk rendering/AI, NIC khusus, atau FPGA. VFIO (Virtual Function I/O) memungkinkan perangkat PCI host dilepas dari host dan diberikan utuh ke VM. Guest berkomunikasi langsung dengan hardware, tanpa emulasi, dengan bantuan IOMMU.
Pertama, lepas device dari driver host dan bind ke vfio-pci:
echo 0000:01:00.0 | sudo tee /sys/bus/pci/devices/0000:01:00.0/driver/unbind
echo vfio-pci | sudo tee /sys/bus/pci/devices/0000:01:00.0/driver_override
echo 0000:01:00.0 | sudo tee /sys/bus/pci/drivers_probeLalu sajikan ke VM dengan --device:
cloud-hypervisor \
--kernel kernel-vmlinux \
--disk path=os.raw \
--device path=/sys/bus/pci/devices/0000:01:00.0 \
--cpus boot=4 \
--memory size=8G--device path=... menyerahkan device vfio ke guest. Di dalam guest, device muncul sebagai perangkat PCI biasa dengan driver yang sesuai.
intel_iommu=on atau amd_iommu=on di kernel cmdline host).shared=on untuk passthrough, karena device fisik membaca memory guest secara DMA.ls -l /sys/kernel/iommu_groups/ | headWarning
Passthrough adalah operasi berisiko tinggi: satu device yang salah lepas bisa membuat host kehilangan NIC-nya. Selalu uji pada host lab, dan pisahkan NIC manajemen host dari device yang akan di-passthrough.
vfio-user adalah protokol eksperimental yang menyediakan device PCI virtual dari proses lain — seperti VFIO, tetapi device-nya disimulasikan di userspace, bukan hardware fisik. Ini membuka pintu untuk "passthrough" software-defined: device (misal NVMe atau GPU virtual) dijalankan di proses terpisah dan dihubungkan ke VM.
Keuntungannya: isolasi yang lebih baik (error di device process tidak meruntuhkan VMM) dan memori lebih aman. Karena masih eksperimental, gunakan dengan hati-hati dan perhatikan status di roadmap resmi (episode 17).
max: menambah vCPU/memory di atas batas yang diset di awal akan ditolak API. Set max dan hotplug_size sejak awal.CONFIG_ACPI_HOTPLUG_CPU/CONFIG_ACPI_HOTPLUG_MEMORY dan acpid berjalan.free di guest.vm.info untuk memastikan request hotplug benar-benar diterima VMM.Tip
Kombinasikan hotplug dengan monitoring: tambah resource berdasarkan metrik (episode 20), bukan tebakan. Automation yang memanggil API resize saat threshold tercapai adalah pola autoscaling VM yang sering dipakai di production.
Inti yang harus dibawa pulang:
--api-socket) adalah remote control untuk operasi runtime via HTTP.desired_vcpus dan desired_ram di /api/v1/vm.resize menambah resource secara live.nproc, free, dan sysfs.desired_size) menarik kembali memory idle ke host.shared=on.Di episode 9 selanjutnya kita akan menyiapkan cloud images & cloud-init — mengunduh Ubuntu/Fedora/Debian cloud image, mengonversinya ke raw, mem-boot via direct maupun UEFI, dan melakukan bootstrap otomatis (password, SSH key, packages) dengan cloud-init user-data dan metadata. VM kalian akan siap dipakai tanpa interaksi manual!