Episode ini membahas live migration: memindahkan VM antar host tanpa downtime memakai protocol yang sudah diperluas, termasuk page-fault yang dilayani dari source di v53. Kalian menyiapkan shared storage dan network, menjalankan migrasi lewat API, serta memahami constraint kompatibilitas versi dan perangkat.

Snapshot yang kita pelajari di episode 10 memang menangkap state VM, tetapi ada jeda singkat saat VM di-pause. Untuk menjaga ketersediaan penuh — server yang melayani request tidak boleh berhenti sedetik pun — kita butuh live migration: memindahkan VM dari satu host ke host lain tanpa downtime yang dirasakan guest.
Analogi terbaiknya seperti memindahkan toko yang sedang ramai pelanggan ke gedung baru: semua barang dipindahkan sedikit demi sedikit sementara pelanggan tetap dilayani, dan begitu pindahannya nyaris selesai, baru ada perpindahan terakhir yang sekejap. Di episode 11 kita membedah bagaimana Cloud Hypervisor melakukan ini, apa saja prasyaratnya, dan batasan yang wajib kalian hormati di production.
Migrasi berjalan dalam beberapa fase:
Keberhasilan migrasi bergantung pada seberapa cepat dirty pages disalin dibanding laju perubahan memory — semakin lambat laju perubahan, semakin singkat jeda stop-and-copy.
Sejak v53.0 (12 Juli 2026), live migration memakai pendekatan post-copy dengan page-fault dilayani dari source. Artinya: alih-alih menunggu seluruh memory tersalin (yang bisa lama untuk VM dengan memory besar), target segera menjalankan VM dan meminta halaman yang dibutuhkan ke source saat terjadi page fault. Dampaknya: total waktu migrasi jauh lebih pendek, dengan biaya ketergantungan pada ketersediaan source selama masa transisi.
Note
Post-copy mengorbankan sesuatu: sampai seluruh halaman tersalin, target masih bergantung pada source. Jika source mati di tengah transisi, VM bisa kehilangan halaman yang belum disalin. Desain infra yang baik memastikan source hidup sampai migrasi dinyatakan selesai.
Migrasi memindahkan state mesin, bukan isi disk. Karena itu kedua host harus melihat disk yang sama — shared storage (NFS, iSCSI, Ceph RBD, atau distributed storage). Di praktik kita, siapkan NFS:
sudo mkdir -p /srv/vms
sudo mount -t nfs storage.internal:/exports/vms /srv/vmsKedua host mengakses ubuntu.raw dan file snapshot dari lokasi yang sama. Jika tidak, target tidak akan bisa membaca disk saat VM dipindahkan.
Source dan target harus saling terhubung, dan idealnya berada di bridge jaringan yang sama sehingga MAC dan IP guest tetap berlaku tanpa perlu rekonfigurasi network:
sudo ip link add name br0 type bridge
sudo ip link set br0 up
sudo ip link set eth0 master br0Jika jaringan berbeda, guest harus direkonfigurasi setelah migrasi — yang justru menghilangkan keunggulan "tanpa downtime".
Host tujuan memulai VM dalam mode "receive", menunggu migrasi datang:
cloud-hypervisor \
--kernel kernel-vmlinux \
--disk path=/srv/vms/ubuntu.raw \
--cpus boot=2 \
--memory size=2G,shared=on \
--net tap=ch0,ip=192.168.100.1,mac=a8:21:95:80:35:e6 \
--api-socket /tmp/target.sockPerhatikan bahwa ini VM biasa — migrasi nanti "menimpa" state-nya. shared=on di kedua sisi adalah wajib (sama seperti snapshot).
Dari host source, panggil endpoint migrasi lewat API:
curl --unix-socket /tmp/source.sock -X PUT \
-H "Content-Type: application/json" \
--data '{
"receiver_url": "http://192.168.100.2:5000",
"protocol": "extended"
}' \
http://localhost/api/v1/vm.migratereceiver_url: alamat yang dibuka target untuk menerima data migrasi.protocol: "extended": memakai protocol live migration yang diperluas — termasuk post-copy page-fault yang dilayani source di v53.Target mendengarkan di port tersebut dengan memakai socket API-nya:
curl --unix-socket /tmp/target.sock -X PUT \
-H "Content-Type: application/json" \
--data '{
"receiver_url": "http://192.168.100.2:5000",
"protocol": "extended"
}' \
http://localhost/api/v1/vm.migrateSaat migrasi selesai, VM di source otomatis berhenti dan eksekusi berlanjut penuh di target. Dari sisi guest, tidak ada proses yang sadar telah pindah host.
Di dalam guest, pastikan tidak ada gangguan berarti:
uptime -s
cat /proc/uptimeuptime -s tetap menunjukkan waktu boot awal — jika menunjukkan waktu migrasi, berarti VM baru saja di-reboot, bukan dimigrasi. Untuk uji yang lebih meyakinkan, jalankan ping terus-menerus dari host selama migrasi dan amati bahwa hanya ada jeda milidetik (bukan puluhan detik).
Aturan yang sama dengan snapshot berlaku: live migration tidak didukung antar versi Cloud Hypervisor yang berbeda. Kedua host harus menjalankan versi yang identik (atau dalam jendela kompatibilitas LTS yang dijamin). Ini konsekuensi dari format state yang melekat pada versi. Di production, pisahkan "release train" migrasi: upgrade semua host dalam satu gelombang, bukan bertahap antar versi besar.
Tidak semua device bisa dimigrasi dengan mudah:
Sebelum migrasi, periksa bahwa konfigurasi device kedua host benar-benar sejajar:
diff <(cat /srv/vms/guest.json) <(ssh target "cat /srv/vms/guest.json")Migrasi Windows punya tantangan tambahan terkait timer (TSC) dan device — pastikan kedua host memakai CPU dengan fitur yang identik, karena guest Windows sangat sensitif terhadap perbedaan fitur CPU yang diekspos.
Warning
Jangan mengandalkan "migrasi akan selalu berhasil" — jaringan lambat atau beban tulis tinggi membuat dirty pages terus bertambah dan migrasi bisa gagal di fase stop-and-copy. Pantau laju dirty memory (misal via perf kvm atau metrik VMM) dan lakukan migrasi uji rutin di luar jam puncak.
shared=on hanya di satu sisi: target gagal menerima memory. Set di kedua sisi.Inti yang harus dibawa pulang:
Di episode 12 selanjutnya kita akan membedah virtual I/O: virtio, IOMMU, dan security — cara kerja ring buffer virtio dan packed virtio, virtio-iommu untuk IOMMU paravirtualisasi, serta sandboxing Landlock dan seccomp yang melindungi host dari VMM itu sendiri. Keamanan VM dimulai dari bawah.