Bisakah VPS Menjalankan Proxmox dengan Nested
Sebagian besar provider VPS menyembunyikan flag vmx. Periksa dengan kvm-ok dalam satu menit, lalu kenali error yang muncul saat menjalankan KVM atau Proxmox.
Jawaban singkat
Nested virtualization adalah hypervisor yang berjalan di dalam mesin virtual: VPS Anda sudah berperan sebagai guest, dan Anda ingin VPS tersebut menjadi host bagi guest miliknya sendiri. Fitur ini hanya berfungsi jika hypervisor milik provider memang mengekspos ekstensi virtualisasi CPU ke instance Anda. Periksa /proc/cpuinfo untuk melihat flag vmx (Intel) atau svm (AMD). Jika tidak ada satu pun yang muncul, tidak ada konfigurasi di dalam VPS yang dapat memperbaikinya.
Perlu ditegaskan terlebih dahulu: Docker tidak memerlukan semua ini. Container menggunakan kernel VPS Anda secara bersama-sama dan tidak pernah mengakses /dev/kvm. Jika tujuan sebenarnya adalah "menjalankan beberapa service dalam container di server saya", Anda sudah memiliki semua yang diperlukan. Nesting diperlukan jika Anda ingin menggunakan kernel kedua, lab Proxmox, guest Windows, microVM Firecracker, emulator Android, lingkungan pengujian Kubernetes yang berisi VM sungguhan, atau runner CI yang melakukan boot image VM.
Apa yang sebenarnya dibuat bertingkat
Ada tiga lapisan:
- L0, hypervisor milik provider, yang berjalan langsung pada mesin fisik. Anda tidak memiliki akses ke lapisan ini.
- L1, VPS Anda. Bagi L0, VPS ini hanya sebuah guest.
- L2, VM yang ingin Anda jalankan di dalam VPS.
Virtualisasi hardware menggunakan VT-x (flag vmx) dan EPT pada Intel, serta AMD-V / SVM (svm) dan RVI/NPT pada AMD. Hypervisor menggunakan instruksi tersebut untuk masuk ke mode guest dan memungkinkan CPU menelusuri dua page table sekaligus.
Keduanya tidak dirancang untuk digunakan secara rekursif. Karena itu, nesting diemulasikan: ketika L1 menjalankan instruksi VMX seperti VMLAUNCH atau VMRESUME, instruksi tersebut melakukan trap ke L0. L0 kemudian mengelola struktur shadow untuk L2 atas nama L1. Pada CPU yang mendukung VMCS shadowing, VMREAD dan VMWRITE dari L1 dapat dilayani tanpa exit. Hal ini mengurangi sebagian besar overhead tersebut, tetapi tidak menghilangkannya sepenuhnya. KVM dapat menangani proses ini dengan baik, tetapi L0 tetap harus melakukan pekerjaan tambahan pada setiap exit. Karena itu, provider harus mengaktifkannya secara eksplisit.
Jika L0 menggunakan KVM, dua kondisi berikut harus terpenuhi agar L2 dapat menggunakan akselerasi:
- Modul KVM pada L0 dimuat dengan
nested=1. - L0 memberikan model CPU kepada VPS Anda yang membawa flag tersebut:
<cpu mode='host-passthrough'/>pada libvirt,cpu: hostpada Proxmox, dan-cpu hostpada QEMU mentah. Model yang diemulasikan secara generik (qemu64,kvm64) menyembunyikanvmxmeskipun nesting diaktifkan secara global.
Hypervisor lain memiliki opsi masing-masing. Sebagai contoh, Hyper-V mengemulasikan ekstensi virtualisasi untuk hypervisor bertingkat di dalam VM-nya, tetapi hanya pada VM yang nesting-nya diaktifkan satu per satu.
Periksa VPS Anda dalam satu menit
# 1. Are you in a VM, and under what?
systemd-detect-virt # kvm, vmware, xen, microsoft, or "none" on metal
# 2. Does the CPU expose the extensions to you?
grep -o -E 'vmx|svm' /proc/cpuinfo | sort -u
lscpu | grep -i -E 'virtual|hypervisor'
# 3. The definitive check
sudo apt update && sudo apt install -y cpu-checker
kvm-ok
# 4. The device node the whole stack depends on
ls -l /dev/kvmInstance yang dapat digunakan menampilkan vmx atau svm, kvm-ok menunjukkan KVM acceleration can be used, dan /dev/kvm tersedia dengan mode root:kvm 660. Jika flag tersebut ada tetapi node perangkat tidak tersedia, muat modul secara manual lalu baca log kernel:
sudo modprobe kvm_intel # or kvm_amd
sudo dmesg | tail -n 20Ada satu file yang sering dikutip dan banyak disalahartikan:
cat /sys/module/kvm_intel/parameters/nested # Y or NDi dalam VPS Anda, file tersebut berisi pengaturan modul KVM milik Anda. Pengaturan ini menentukan apakah guest L2 dapat menjalankan guest tingkat ketiga secara bertingkat. File tersebut tidak menunjukkan apakah L0 mengaktifkan nesting untuk Anda. /proc/cpuinfo dan kvm-ok memberikan jawaban itu. Parameter nested adalah pengaturan yang Anda ubah pada mesin yang sepenuhnya Anda miliki:
echo 'options kvm_intel nested=1' | sudo tee /etc/modprobe.d/kvm-nested.conf
sudo modprobe -r kvm_intel && sudo modprobe kvm_intelPenghapusan modul ditolak saat VM masih berjalan, jadi matikan guest terlebih dahulu. Jika mesin tersebut adalah host Proxmox, mengaktifkan nested virtualization di Proxmox VE 9 mencakup perubahan modprobe.d yang sama serta pengaturan cpu: host per-VM yang membuat flag tersebut terlihat di dalam guest.
Mengapa sebagian besar host VPS menonaktifkannya
- Migrasi langsung. Memberikan
vmxkepada Anda berarti mengekspos model CPU yang membawa flag tersebut. Guest yang bergantung pada fitur CPU itu tidak dapat dimigrasikan dengan aman ke mesin yang CPU-nya tidak memiliki fitur tersebut. Host yang mengosongkan node dengan memigrasikan pelanggan harus mengorbankan kemampuan itu ketika mengaktifkan nesting. - Permukaan serangan. Jalur nested VMX/SVM termasuk kode paling kompleks dalam lapisan virtualisasi kernel, dengan riwayat CVE yang sebanding.
- L0 mungkin bukan KVM. Jika
systemd-detect-virtmenampilkanvmware,xen, ataumicrosoft, aturan nesting ditentukan oleh stack tersebut, bukan oleh KVM.
Tidak ada flag pada instance Anda? Hubungi dukungan karena beberapa penyedia dapat mengaktifkannya per-VM, pilih paket yang mendokumentasikan dukungan nesting, atau pindah ke server khusus. Bagian selanjutnya mengasumsikan Anda memiliki akses root pada mesin yang menampilkan flag tersebut.
Menjalankan guest L2 dengan libvirt
sudo apt install -y qemu-system-x86 libvirt-daemon-system virtinst ovmf
sudo systemctl enable --now libvirtd
sudo usermod -aG libvirt,kvm "$USER" # log out and back in
virt-install \
--name guest1 \
--memory 2048 \
--vcpus 2 \
--cpu host-passthrough \
--disk path=/var/lib/libvirt/images/guest1.qcow2,size=20,format=qcow2,bus=virtio \
--network network=default,model=virtio \
--os-variant debian13 \
--location https://deb.debian.org/debian/dists/trixie/main/installer-amd64/ \
--graphics none \
--console pty,target_type=serial \
--extra-args 'console=ttyS0,115200n8'Sesi grafis tidak diperlukan. Instalasi serial berjalan selama beberapa waktu, jadi jalankan di dalam shell persisten: alur kerja tmux yang menjaga sesi Claude Code tetap aktif di VPS yang sama mempertahankan konsol virt-install tetap terhubung meskipun koneksi SSH terputus. Jika --os-variant debian13 ditolak, berarti osinfo-db Anda lebih lama daripada rilis tersebut. Jalankan osinfo-query os, lalu pilih nama yang tersedia. --cpu host-passthrough meneruskan vmx ke L2. Fitur ini hanya diperlukan jika L2 juga harus melakukan virtualisasi. Buat guest aman untuk proses boot dengan virsh autostart guest1.
Bus virtio pada disk dan NIC bukan sekadar hiasan: perangkat IDE dan e1000 yang diemulasikan menyebabkan trap ke hypervisor jauh lebih sering daripada antrean virtio. Dalam nesting, exit yang tidak dapat diselesaikan sendiri oleh L0 diteruskan ke L1. Penanganannya dapat memicu exit tambahan di L1.
Jaringan: bagian yang sering dilewati tutorial
VPS Anda memiliki satu IP publik dan berada di belakang fabric yang memfilter alamat MAC yang tidak dikenal. Dua konsekuensi berikut berlaku.
Bridging guest L2 ke jaringan publik biasanya tidak akan berfungsi. Tempatkan br0 pada NIC publik, berikan MAC sendiri kepada guest, lalu Anda akan melihat ARP keluar tanpa balasan apa pun karena switch provider menjatuhkan frame dari MAC yang tidak pernah mereka sewakan kepada Anda. Jika gejalanya seperti itu, hentikan proses debug bridge. Itulah mekanismenya.
Gunakan jaringan NAT. libvirt menyediakan default: virbr0, 192.168.122.0/24, serta lease dnsmasq, sehingga koneksi keluar langsung berfungsi. Untuk koneksi masuk, lakukan terminasi TLS pada L1 lalu teruskan koneksi melalui proxy. Path sertifikat di bawah ini berasal dari menerbitkan sertifikat Let's Encrypt dengan Certbot pada Nginx:
server {
listen 443 ssl;
server_name lab.example.com;
ssl_certificate /etc/letsencrypt/live/lab.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/lab.example.com/privkey.pem;
location / {
proxy_pass http://192.168.122.50:8080;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}Tetapkan lease statis untuk guest terlebih dahulu (virsh net-edit default) agar alamat pada proxy_pass tetap sama.
Jangan tempatkan antarmuka manajemen di Internet. VNC pada 5900 dan UI web Proxmox pada 8006 harus terikat ke loopback dan diakses melalui tunnel SSH (ssh -N -L 8006:127.0.0.1:8006 you@your-vps) atau melalui VPN WireGuard yang di-host sendiri ke VPS, sehingga seluruh rentang guest 192.168.122.0/24 hanya berjarak satu hop privat. Batasi firewall, sudo ufw allow 22,80,443/tcp, dan jangan izinkan yang lain. Jika guest kehilangan konektivitas keluar segera setelah Anda mengaktifkan ufw, penyebab yang biasanya adalah DEFAULT_FORWARD_POLICY="DROP" dalam /etc/default/ufw. Atur nilainya ke ACCEPT, lalu muat ulang ufw.
Proxmox pada VPS
Proxmox VE 9 menggunakan Debian 13 sebagai sistem dasarnya. Karena itu, Proxmox dapat diinstal pada VPS Debian dengan menambahkan repositori pve-no-subscription dan paket proxmox-ve. Ambil baris repositori dan keyring dari dokumentasi resmi Proxmox yang terbaru. URL yang disalin dari tulisan blog lama dapat menyebabkan instalasi gagal. Sebelum menghabiskan waktu untuk konfigurasi jaringan di bawah, tentukan terlebih dahulu apakah Proxmox memang sesuai dijalankan pada perangkat keras sewaan. Perbandingan biaya dan kemampuan antara perangkat Proxmox di rumah dan VPS sewaan membahas pertanyaan tersebut dengan perhitungan daya dan perangkat keras yang sudah tersedia.
Paket bukan bagian yang sulit. Proxmox mengharuskan vmbr0 dijembatankan ke NIC fisik. Konfigurasi ini langsung menghadapi kendala pemfilteran MAC yang dijelaskan di atas. Konfigurasi yang berfungsi pada VPS adalah vmbr0 yang menggunakan NAT atau routing tanpa port fisik terpasang, dengan guest pada rentang jaringan privat. Gunakan aturan DNAT atau reverse proxy pada host untuk layanan yang perlu diakses publik. Jika layanan yang menghadap publik berupa container, bukan VM, Traefik yang meneruskan beberapa aplikasi dari satu file Docker Compose dapat menjalankan fungsi routing yang sama dengan sertifikat otomatis. Buat snapshot /etc/network/interfaces terlebih dahulu. Definisi bridge yang salah dapat mengunci akses Anda ke mesin yang mungkin tidak menyediakan akses console.
Performa secara jujur
Nested lebih lambat daripada satu tingkat, dan mekanismenya spesifik, bukan menyebar: biaya muncul pada exit dan translasi alamat, bukan pada instruksi biasa. Jika EPT/NPT tersedia, L0 menggabungkan page table L1 untuk L2 dan page table miliknya sendiri ke dalam satu shadow table. Dengan demikian, TLB hit berjalan pada kecepatan hardware. TLB miss membutuhkan biaya lebih besar: hardware menelusuri page table guest dan shadow table secara bersamaan. Setiap perubahan yang dibuat L1 pada table miliknya sendiri juga memaksa terjadinya exit agar L0 dapat menyinkronkan kembali shadow table. Operasi yang mahal adalah setiap operasi yang keluar dari guest mode, seperti I/O, interupsi timer, MMIO, dan interupsi antarprosesor. Hal ini terjadi karena exit dari L2 ditangani oleh L0 dan dapat diteruskan kembali melalui L1. Beban kerja yang dibatasi CPU dengan working set kecil memiliki performa yang mendekati native. Working set besar harus membayar biaya TLB miss. Beban kerja yang didominasi syscall, paket, dan disk I/O akan lebih merasakan dampak berlapis tersebut.
Jadi, gunakan perangkat virtio di mana pun. Selain itu, file qcow2 Anda berada pada disk yang telah divirtualisasi oleh provider. Dua lapisan thin provisioning bertumpuk. Dalam kondisi ini, cache=none pada disk guest mencegah blok yang sama berada secara bersamaan di dua page cache. Tidak ada angka benchmark di sini. Ukur workload Anda sendiri pada instance Anda sendiri.
Mode kegagalan dan string yang akan Anda lihat
INFO: /dev/kvm does not exist / KVM acceleration can NOT be used dari kvm-ok. Modul tidak dimuat, atau flag tersebut tidak tersedia. Periksa /proc/cpuinfo terlebih dahulu.
kvm: disabled by bios di dmesg. Pada bare metal, ubah toggle VT-x/SVM di firmware. Di dalam VPS, ini berarti L0 tidak meneruskan ekstensi tersebut kepada Anda. Tidak ada perintah yang Anda jalankan di guest yang dapat mengubahnya.
modprobe: ERROR: could not insert 'kvm_intel': Operation not supported. CPU yang dilihat kernel Anda tidak memiliki vmx. Ini juga merupakan keputusan L0.
Could not access KVM kernel module: Permission denied. Masalahnya adalah izin, bukan perangkat keras. ls -l /dev/kvm seharusnya menampilkan group kvm dan mode 660. Tambahkan akun Anda ke group tersebut, lalu mulai login shell baru karena keanggotaan group tidak berlaku pada session yang sudah berjalan.
kvm: Device or resource busy saat QEMU dimulai. Modul hypervisor lain sedang menggunakan CPU. Jalankan lsmod, lalu cari vboxdrv atau modul VMware di samping kvm_intel. Bongkar modul yang tidak ingin Anda gunakan.
/var/run/libvirt/libvirt-sock: No such file or directory dari virsh. Daemon tidak berjalan: sudo systemctl enable --now libvirtd.
Proxmox: KVM virtualisation configured, but not available. Guest mengaktifkan akselerasi KVM pada host yang tidak dapat menyediakannya. Perbaiki nesting, atau nonaktifkan opsi tersebut dan gunakan emulasi.
Emulator Android: x86_64 emulation currently requires hardware acceleration! /dev/kvm lagi. Biasanya masalahnya adalah group.
Tidak ada error sama sekali, tetapi semuanya sangat lambat. QEMU tanpa flag akselerator akan beralih ke TCG, yaitu emulator perangkat lunaknya. Emulasi ini berfungsi dengan benar, tetapi lambat. Boot yang biasanya selesai dalam hitungan detik dapat memerlukan waktu beberapa menit. Teruskan -accel kvm secara eksplisit agar QEMU berhenti dengan error, bukan diam-diam menggunakan emulasi.
Guest menghilang saat sedang berjalan. Periksa dmesg untuk mencari Out of memory: Killed process ... qemu-system-x86_64. Guest L2 merupakan proses pada L1, sehingga OOM killer memperlakukannya seperti proses lain. RAM L2 berasal dari alokasi tetap L1 dan tidak dapat meminjam RAM dari host.
Mengoperasikannya: pencadangan, upgrade, dan batasan
Pencadangan. Menyalin qcow2 guest yang sedang berjalan berisiko menghasilkan image yang tidak konsisten karena guest terus menulis saat proses penyalinan berlangsung. Jalankan virsh shutdown guest1, tunggu hingga virsh domstate guest1 melaporkan shut off (perintah shutdown dapat selesai saat guest masih dalam proses berhenti), lalu salin image tersebut. Alternatifnya, buat snapshot eksternal (virsh snapshot-create-as guest1 snap1 --disk-only --atomic) agar penulisan dialihkan ke overlay saat Anda menyalin base yang kini statis, lalu gabungkan kembali dengan virsh blockcommit guest1 vda --active --pivot. Simpan salinan di luar VPS. Snapshot pada disk yang sama tidak melindungi dari kegagalan disk.
Upgrade. apt full-upgrade memasang modul kvm_intel/kvm_amd yang baru, tetapi kernel yang sedang berjalan tetap menggunakan modul lama hingga Anda melakukan reboot. Pertahankan kernel sebelumnya dan jalankan kembali kvm-ok setiap kali kernel berubah. Jika host tidak dapat kembali berjalan tanpa vmx, Anda masih memiliki satu entri boot yang dapat dipilih untuk memulihkannya.
Batas skalabilitasnya. Satu IP publik berarti setiap layanan L2 terhubung ke dunia luar melalui proxy atau aturan DNAT pada L1. Live migration tidak tersedia. Saat CPU mengalami contention, jalur nested exit adalah bagian pertama yang terdampak. Hypervisor dengan beberapa guest menggunakan RAM yang sudah Anda alokasikan. VM nested tidak dapat mengatasi alokasi tetap dengan overcommit. Jika lab melampaui kemampuan tersebut, solusinya bukan menambah lapisan nested. Gunakan server khusus sehingga Anda menjadi L0 dan tidak satu pun batasan ini berlaku.
FAQ
Apakah saya memerlukan nested virtualization untuk menjalankan Docker pada VPS?
Tidak. Container menggunakan kernel VPS Anda dan tidak pernah membuka /dev/kvm, sehingga instance biasa tanpa flag vmx atau svm dapat menjalankan Docker dan Docker Compose dengan baik. Nesting hanya diperlukan jika Anda ingin menjalankan kernel kedua: lab Proxmox, guest Windows, microVM Firecracker, emulator Android, atau runner CI yang melakukan boot image VM.
Bagaimana cara memeriksa apakah VPS saya mendukung nested virtualization?
Jalankan grep -o -E 'vmx|svm' /proc/cpuinfo | sort -u, lalu kvm-ok dari package cpu-checker. Instance yang dapat digunakan akan menampilkan vmx (Intel) atau svm (AMD), kvm-ok melaporkan KVM acceleration can be used, dan /dev/kvm tersedia dengan group kvm serta mode 660. Abaikan /sys/module/kvm_intel/parameters/nested untuk pertanyaan ini. File tersebut menjelaskan modul KVM Anda sendiri, bukan kemampuan yang diekspos hypervisor provider kepada Anda.
Mengapa sebagian besar provider VPS menonaktifkan nested virtualization?
Mengekspos vmx berarti memberikan model CPU kepada guest yang membawa flag tersebut. Guest yang bergantung pada fitur CPU itu tidak dapat dimigrasikan secara live ke mesin yang CPU-nya tidak memiliki fitur tersebut. Provider yang mengosongkan node dengan memindahkan customer harus mengorbankan kemampuan itu. Jalur kode nested VMX/SVM juga memiliki riwayat CVE yang panjang. Sebagian host tetap mengaktifkannya per-VM berdasarkan permintaan, sedangkan provider lain mencantumkan nesting sebagai fitur paket.
Nested VM saya tidak memiliki jaringan pada public bridge. Apa masalahnya?
Switch provider menjatuhkan frame dari alamat MAC yang tidak pernah disewakan kepada Anda. Akibatnya, guest L2 yang di-bridge ke NIC publik mengirim ARP, tetapi tidak menerima respons. Hentikan debugging br0. Gunakan jaringan NAT libvirt default (virbr0, 192.168.122.0/24), berikan static lease kepada guest, lalu publikasikan layanan apa pun yang bersifat publik melalui reverse proxy atau aturan DNAT pada VPS itu sendiri.
Seberapa lambat nested VM?
Dampaknya terlihat pada VM exit dan translasi alamat. Saat EPT/NPT aktif, instruksi dan hit TLB di dalam L2 berjalan dengan kecepatan hardware. Namun, TLB miss harus menelusuri page table tambahan, sedangkan I/O, interupsi timer, MMIO, dan IPI ditangani oleh L0 dan dapat diteruskan kembali melalui L1. Beban kerja yang terikat CPU dengan working set kecil akan mendekati performa native. Working set besar di memori serta beban kerja yang intensif pada syscall, packet, dan disk akan merasakan dampak setiap lapisan. Gunakan perangkat virtio di semua tempat dan cache=none pada disk guest, lalu ukur beban kerja Anda sendiri.