¿Se puede instalar Proxmox en un VPS?
Verifique si su VPS permite virtualización anidada usando kvm-ok. Aprenda si su proveedor expone los flags vmx o svm para ejecutar Proxmox sin errores.
La respuesta corta
La virtualización anidada es un hypervisor ejecutándose dentro de una máquina virtual: su VPS ya es un invitado y usted desea que este aloje sus propios invitados. Solo funciona si el hypervisor de su proveedor expone deliberadamente las extensiones de virtualización de la CPU a su instancia; verifique /proc/cpuinfo para el flag vmx (Intel) o svm (AMD). Si ninguno aparece, ninguna configuración dentro del VPS resolverá el problema.
Una aclaración importante: Docker no necesita nada de esto. Los contenedores comparten el kernel de su VPS y nunca acceden a /dev/kvm. Si su objetivo es "ejecutar varios servicios en contenedores en mi servidor", ya tiene lo que necesita. La virtualización anidada es necesaria cuando requiere un segundo kernel: un laboratorio Proxmox, un invitado Windows, microVMs de Firecracker, un emulador de Android, un entorno de pruebas de Kubernetes con VMs reales, o runners de CI que arrancan imágenes de VM.
Qué se está anidando realmente
Tres capas:
- L0 — el hypervisor del proveedor, en el hardware físico. No tiene acceso a él.
- L1 — su VPS. Para L0, esto es solo un guest.
- L2 — la VM que desea ejecutar dentro de su VPS.
La virtualización de hardware es VT-x (el flag vmx) más EPT en Intel, y AMD-V / SVM (svm) más RVI/NPT en AMD. Un hypervisor utiliza estas instrucciones para entrar en guest mode y permitir que la CPU recorra dos page tables simultáneamente.
Ninguna fue diseñada para ser re-entrant, por lo que la anidación se emula: cuando L1 ejecuta una instrucción VMX, esta hace un trap a L0, el cual mantiene las shadow structures para L2 en nombre de L1. KVM realiza esto correctamente, pero L0 debe realizar trabajo adicional en cada exit; por este motivo, el proveedor debe habilitarlo explícitamente.
Para una L2 acelerada deben cumplirse dos condiciones:
- El módulo KVM de L0 debe estar cargado con
nested=1. - L0 debe asignar a su VPS un modelo de CPU que incluya el flag:
<cpu mode='host-passthrough'/>en libvirt,cpu: hosten Proxmox,-cpu hosten QEMU puro. Un modelo emulado genérico (qemu64,kvm64) ocultavmxincluso si la anidación está activada globalmente.
Verifique su VPS en un minuto
# 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/kvmUna instancia funcional imprime vmx o svm, kvm-ok indica KVM acceleration can be used, y /dev/kvm existe como root:kvm en modo 660. Si el flag está presente pero el nodo del dispositivo no, cargue el módulo manualmente y revise el log del kernel:
sudo modprobe kvm_intel # or kvm_amd
sudo dmesg | tail -n 20Un archivo se cita constantemente y suele interpretarse mal:
cat /sys/module/kvm_intel/parameters/nested # Y or NDentro de su VPS, este es el ajuste de su módulo KVM, y determina si un guest L2 puede realizar nesting de un tercer nivel. No indica si L0 habilitó el nesting para usted; /proc/cpuinfo y kvm-ok responden eso. El parámetro nested es el ajuste que se configura en una máquina de su propiedad:
echo 'options kvm_intel nested=1' | sudo tee /etc/modprobe.d/kvm-nested.conf
sudo modprobe -r kvm_intel && sudo modprobe kvm_intelNo se puede remover el módulo mientras una VM esté ejecutándose; apague los guests primero.
Por qué la mayoría de los proveedores de VPS lo mantienen desactivado
- Migración en vivo. Entregar
vmximplica exponer un modelo de CPU que tiene el flag. Un guest que dependa de esas funciones de CPU no puede migrarse de forma segura a una máquina cuya CPU no las tenga. Un host que vacía nodos mediante la migración de clientes pierde esta capacidad en cuanto habilita el nesting. - Superficie de ataque. Las rutas de VMX/SVM anidadas están entre el código más complejo de la capa de virtualización del kernel, con un historial de CVE correspondiente.
- L0 podría no ser KVM. Si
systemd-detect-virtimprimevmware,xenomicrosoft, las reglas de nesting pertenecen a esa stack, no a KVM.
¿No aparece el flag en su instancia? Contacte con soporte (algunos lo habilitan por VM), elija un plan que documente el nesting o cámbiese a un servidor dedicado. El resto de este documento asume acceso root en una máquina que muestra el flag.
Ejecución de un guest L2 con 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'No es necesaria una sesión gráfica. La instalación por serial tarda un tiempo, así que iníciela dentro de una shell persistente: el mismo flujo de trabajo de tmux que mantiene vivas las sesiones de Claude Code en un VPS mantiene una consola virt-install conectada tras una desconexión de SSH. Si se rechaza --os-variant debian13, su osinfo-db es anterior al lanzamiento; ejecute osinfo-query os y elija un nombre existente. --cpu host-passthrough redirige vmx hacia el L2, necesario solo si el L2 debe virtualizar a su vez. Asegure el arranque del guest con virsh autostart guest1.
El bus virtio en disco y NIC no es decorativo: los dispositivos emulados IDE y e1000 generan traps en el hypervisor con mucha más frecuencia que las colas virtio, y en entornos de nesting cada trap tiene un doble costo.
Networking: la parte que los tutoriales omiten
Su VPS tiene una IP pública y se encuentra detrás de un fabric que filtra direcciones MAC desconocidas. Esto tiene dos consecuencias.
Bridging de invitados L2 a la red pública generalmente no funcionará. Si coloca br0 en la NIC pública y asigna una MAC propia al invitado, verá que el ARP sale pero no recibe respuesta; el switch del proveedor descarta los frames de una MAC que no le ha asignado. Si este es su problema, deje de depurar el bridge; este es el comportamiento esperado.
Use la red NAT en su lugar. libvirt incluye default: virbr0, 192.168.122.0/24 y asignaciones de dnsmasq; la conectividad de salida funciona de inmediato. Para la entrada, termine el TLS en L1 y use un proxy; las rutas de certificados a continuación provienen de emitir un certificado Let's Encrypt con Certbot en 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;
}
}Asigne primero una concesión estática al invitado (virsh net-edit default) para que la dirección en ese proxy_pass se mantenga fija.
Las interfaces de gestión no deben estar en internet: VNC en el puerto 5900 y la interfaz web de Proxmox en el 8006 deben estar en loopback, accesibles mediante un túnel SSH (ssh -N -L 8006:127.0.0.1:8006 you@your-vps) o a través de una VPN WireGuard auto-hospedada hacia el VPS, lo que sitúa a todo el rango de invitados 192.168.122.0/24 a un salto privado de distancia. Mantenga el firewall restrictivo: sudo ufw allow 22,80,443/tcp, nada más. Si los invitados pierden la conectividad de salida inmediatamente después de habilitar ufw, el culpable habitual es DEFAULT_FORWARD_POLICY="DROP" en /etc/default/ufw; cámbielo a ACCEPT y recargue ufw.
Proxmox en un VPS
Proxmox VE 9 utiliza Debian 13 como base. Se instala en un VPS con Debian añadiendo el repositorio pve-no-subscription y el paquete proxmox-ve. Obtenga las líneas del repositorio y del keyring de la documentación oficial de Proxmox; usar una URL de un blog antiguo causará errores en la instalación.
Los paquetes no son la parte difícil. Proxmox requiere que vmbr0 esté conectado mediante un bridge a una NIC física, lo cual causa el problema de filtrado de MAC mencionado anteriormente. La configuración funcional en un VPS es un vmbr0 con NAT o enrutado sin puertos físicos asignados. Los invitados deben usar un rango privado y se deben usar reglas DNAT o un reverse proxy en el host para el tráfico público. Si los servicios públicos son contenedores en lugar de VMs, Traefik gestionando múltiples apps desde un Docker Compose realiza la misma función de enrutamiento con certificados automáticos. Realice un snapshot con /etc/network/interfaces primero: una definición de bridge incorrecta puede bloquear el acceso a una máquina si no tiene acceso a la consola.
Rendimiento real
El anidamiento es más lento que el nivel único. El motivo es específico: el coste no reside en el acceso a memoria, sino en las salidas (exits). Con EPT/NPT activado, L0 mantiene tablas de páginas en sombra para L2 y las lecturas de memoria ordinarias funcionan a velocidad de hardware. Lo costoso es cada operación que sale del modo guest —I/O, interrupciones de temporizador, MMIO, interrupciones entre procesadores— ya que una salida de L2 es gestionada por L0 y puede reflejarse de nuevo a través de L1. El trabajo limitado por CPU con datos ya en RAM es similar al rendimiento nativo; cualquier proceso dominado por syscalls, paquetes y E/S de disco experimenta el impacto de las capas.
En resumen: use dispositivos virtio en todo lugar. Su archivo qcow2 reside en un disco que el proveedor ya ha virtualizado: dos capas de aprovisionamiento fino superpuestas, donde cache=none en el disco del guest evita que los mismos bloques ocupen dos cachés de páginas simultáneamente. No incluimos cifras de benchmarks: mida su propia carga de trabajo en su propia instancia.
Modos de fallo y los strings que verá
INFO: /dev/kvm does not exist / KVM acceleration can NOT be used de kvm-ok. El módulo no está cargado o el flag no está expuesto. Verifique /proc/cpuinfo primero.
kvm: disabled by bios en dmesg. En bare metal, active el interruptor VT-x/SVM en el firmware. En un VPS, esto significa que L0 no está entregando las extensiones; ninguna configuración en el guest lo solucionará.
modprobe: ERROR: could not insert 'kvm_intel': Operation not supported. La CPU que detecta el kernel no tiene vmx — nuevamente, es una decisión de L0.
Could not access KVM kernel module: Permission denied. Problema de permisos, no de hardware. ls -l /dev/kvm debería mostrar el grupo kvm y el modo 660; añádase a ese grupo e inicie una nueva sesión de shell, ya que la pertenencia a un grupo no se aplica a una sesión ya activa.
kvm: Device or resource busy al iniciar QEMU. Otro módulo de hipervisor tiene el control de la CPU: ejecute lsmod, busque vboxdrv o módulos de VMware junto a kvm_intel, y descarregue el que no necesite.
/var/run/libvirt/libvirt-sock: No such file or directory de virsh. El daemon está detenido: sudo systemctl enable --now libvirtd.
Proxmox: KVM virtualisation configured, but not available. Un guest tiene activada la aceleración KVM en un host que no puede proporcionarla. Corrija el nesting o desactive la opción y acepte la emulación.
Android emulator: x86_64 emulation currently requires hardware acceleration! /dev/kvm de nuevo — generalmente es un problema de grupo.
Sin error alguno, y todo funciona con extrema lentitud. QEMU sin un flag de acelerador utiliza TCG, su emulador por software. Funciona correctamente pero es lento: un arranque de segundos pasa a durar minutos. Pase -accel kvm explícitamente para que QEMU termine con un error en lugar de emular silenciosamente.
Un guest desaparece durante la ejecución. Revise dmesg en busca de Out of memory: Killed process ... qemu-system-x86_64. Un guest L2 es un proceso en L1, y el OOM killer lo trata como cualquier otro. La RAM de L2 consume la asignación fija de L1; no hay préstamo de recursos desde el host.
Operación: backups, actualizaciones y límites
Backups. Copiar el archivo qcow2 de un guest en ejecución produce una imagen corrupta. Use virsh shutdown guest1 y copie, o realice un snapshot externo (virsh snapshot-create-as guest1 snap1 --disk-only --atomic) para que las escrituras se redirijan a un overlay mientras copia la base estática; después, incorpore los cambios con virsh blockcommit. Mueva las copias fuera del VPS; un snapshot en el mismo disco no ofrece protección.
Upgrades. apt full-upgrade instala nuevos módulos kvm_intel/kvm_amd, pero el kernel en ejecución mantiene los antiguos hasta que se reinicie. Mantenga instalado el kernel anterior y ejecute kvm-ok tras cada cambio de kernel: un host que reinicie sin vmx solo requiere una entrada de arranque para volver a funcionar.
Límites de escalabilidad. Una IP pública significa que cada servicio L2 accede al mundo mediante un proxy o una regla DNAT en L1. La migración en vivo no está disponible. Bajo contención de CPU, la ruta de nested exit es lo primero en verse afectado. Un hypervisor con varios guests consume la RAM disponible; las VMs anidadas no pueden usar overcommit para superar una asignación fija. Cuando un laboratorio crece más allá de eso, la solución no es añadir más niveles de anidamiento; es un equipo dedicado donde usted es L0 y estas limitaciones no aplican.
FAQ
¿Necesito virtualización anidada para ejecutar Docker en un VPS?
No. Los contenedores comparten el kernel de su VPS y nunca abren /dev/kvm. Una instancia estándar sin los flags vmx o svm ejecuta Docker y Docker Compose correctamente. La virtualización anidada solo es necesaria cuando requiere un segundo kernel: un laboratorio Proxmox, un guest de Windows, microVMs de Firecracker, un emulador de Android o runners de CI que arrancan imágenes de VM.
¿Cómo compruebo si mi VPS soporta virtualización anidada?
Ejecute grep -o -E 'vmx|svm' /proc/cpuinfo | sort -u y luego kvm-ok del paquete cpu-checker. Una instancia compatible imprime vmx (Intel) o svm (AMD). kvm-ok reporta KVM acceleration can be used, y /dev/kvm existe con el grupo kvm y modo 660. Ignore /sys/module/kvm_intel/parameters/nested para esta pregunta; ese archivo describe su propio módulo KVM, no lo que el hipervisor del proveedor le ha expuesto.
¿Por qué la mayoría de los proveedores de VPS desactivan la virtualización anidada?
Exponer vmx implica entregar al guest un modelo de CPU que incluye dicho flag. Un guest que dependa de esas funciones de CPU no puede migrarse en vivo a una máquina cuya CPU no las tenga. Los proveedores que mueven clientes entre nodos para optimizar recursos no permiten esto. Los paths de código de VMX/SVM anidado también tienen un historial extenso de CVE. Algunos hosts lo habilitan por VM bajo petición, y otros lo documentan como una función planificada.
Mi VM anidada no tiene red en el bridge público. ¿Cuál es el problema?
El switch del proveedor descarta tramas de una dirección MAC que nunca le asignó. Un guest L2 conectado mediante bridge a la NIC pública envía ARP pero no recibe respuesta. Deje de depurar br0; use la red NAT de libvirt default (virbr0, 192.168.122.0/24), asigne una lease estática al guest y publique el tráfico público mediante un reverse proxy o una regla DNAT en el propio VPS.
¿Qué tan lenta es una VM anidada?
El impacto ocurre en los VM exits, no en el acceso a memoria. Con EPT/NPT activo, las lecturas y escrituras ordinarias dentro de L2 funcionan a velocidad de hardware. Sin embargo, el I/O, las interrupciones de timer, MMIO e IPIs son gestionados por L0 y pueden retornar a través de L1. Las tareas dependientes de CPU con datos ya en RAM rinden de forma similar al rendimiento nativo; las cargas de trabajo con alta carga de syscalls, paquetes o disco perciben cada capa. Use dispositivos virtio en todo lugar y cache=none en los discos del guest, luego mida su propia carga de trabajo.