Problema

Instalar Proxmox VE por primera vez en un servidor de escritorio o workstation suele generar dudas sobre la arquitectura de almacenamiento, la configuración de red y la estrategia de backups. El patrón típico es: un hardware potente (CPU multi‑core, RAM DDR5, SSD NVMe) se combina con una única unidad para el sistema operativo y otra para datos, pero la distribución de particiones, el tipo de filesystem y la forma de exponer la red a las máquinas virtuales pueden quedar sin una guía clara. El resultado frecuente son cuellos de botella de I/O, pérdida de datos tras reinicios inesperados o dificultad para migrar VMs entre nodos.

Causa

  1. Elección de filesystem sin considerar redundancia – Usar ext4 en un solo disco para datos críticos expone a fallos de hardware.
  2. Bridge de red mal aislado – Conectar todas las VMs al mismo bridge sin VLAN o firewall interno genera conflictos de IP y exposición innecesaria.
  3. Instalación del host en el mismo disco que las VMs – El sistema operativo compite por I/O con las máquinas virtuales, reduciendo el rendimiento de los servicios (SIEM, Home Assistant, Jellyfin, etc.).
  4. Ausencia de snapshots o backups automáticos – En entornos de pruebas, los cambios frecuentes hacen que la restauración manual sea costosa.
  5. Configuración de CPU y memoria sin afinación – Proxmox permite asignar sockets y cores; una asignación genérica puede saturar la CPU host o dejar recursos sin usar.

Solución

1. Separar el boot del almacenamiento de datos

  • Boot SSD (500 GB – 1 TB): Instalar Proxmox en una unidad dedicada. Formatear con ext4 o btrfs (sin RAID).
  • Pool de datos (4 TB NVMe): Crear un pool ZFS con raid0 (si solo hay un disco) o raid1/raidz1 si se añaden discos laterales. ZFS brinda checksums, snapshots y compresión automática, ideal para logs de SIEM y bases de datos pequeñas.

2. Configurar ZFS como backend de almacenamiento

  1. Durante la instalación, elige “ZFS (RAID 0)” para el disco de datos.
  2. Después de la instalación, crea datasets específicos:
    • tank/vms – para discos de máquinas virtuales (compression=lz4).
    • tank/containers – para LXC (compression=off para evitar overhead).
    • tank/backups – para backups (compression=zstd).

Esto permite limitar el I/O por dataset y aplicar cuotas si es necesario.

3. Red de gestión y tráfico de VMs

  • Bridge vmbr0: Conecta la NIC física a vmbr0 y asigna una IP estática para el host (ej. 192.168.10.10/24).
  • Bridge vmbr1: Crea un segundo bridge sin IP para tráfico interno de VMs. Asigna VLANs si tu switch lo soporta (ej. VLAN 10 para Home Assistant, VLAN 20 para SIEM).
  • Firewall de Proxmox: Activa el firewall a nivel de nodo y de VM. Define reglas de “allow‑established” y bloquea puertos no usados.

4. Plantillas y contenedores

  • Usa plantillas LXC oficiales (ubuntu-22.04-standard, debian-11-standard) para servicios ligeros como Home Assistant o Zentyal.
  • Reserva al menos 2 GB de RAM y 1 vCPU para cada contenedor; ajusta según carga.
  • Para aplicaciones que requieren GPU o acceso directo al hardware (ej. Frigate con aceleración de video), crea VMs con passthrough PCIe.

5. Backups automáticos

  • Configura vzdump con mode=snapshot y compress=zstd.
  • Programa backups diarios a tank/backups y una replicación semanal a un USB externo o a un NAS mediante rsync.
  • Habilita retención: 7 copias diarias, 4 semanales, 12 mensuales.

6. Afinación de CPU y memoria

  • En la pestaña “Options” de cada VM, define cores y sockets acorde al número de hilos físicos.
  • Habilita NUMA si la CPU tiene múltiples dies (Ryzen 9 9955HX tiene 2 dies).
  • Usa “Ballooning” para ajustar RAM dinámicamente y evitar sobreasignación.

7. Monitoreo básico

  • Instala prometheus-node-exporter en el host y habilita el plugin de Proxmox en Grafana.
  • Configura alertas para uso de I/O > 80 % en tank o temperatura > 80 °C del CPU.

Cuándo aplicar esta solución

  • Entornos homelab con un solo nodo donde se pretende ejecutar varios servicios críticos (SIEM, AD, Home Assistant).
  • Hardware con al menos un SSD NVMe para el pool de datos y otro SSD para el boot.
  • Necesidad de snapshots y restauraciones rápidas (p.ej., pruebas de actualizaciones de Home Assistant).
  • No se requiere alta disponibilidad multi‑nodo; la solución está pensada para un solo host.

No es adecuada cuando:

  • Solo se dispone de discos HDD; ZFS en HDD pierde gran parte de su ventaja.
  • Se planea un clúster con migración en vivo; entonces se necesita Ceph o DRBD.
  • El presupuesto es extremadamente limitado y no se puede separar discos.

Código

# Crear pool ZFS en el disco de datos (asumiendo /dev/nvme0n1)
zpool create -f -o ashift=12 tank /dev/nvme0n1

# Datasets con compresión y cuotas opcionales
zfs create -o compression=lz4 tank/vms
zfs create -o compression=off tank/containers
zfs create -o compression=zstd tank/backups

# Configurar bridge vmbr1 sin IP (edita /etc/network/interfaces)
cat <<EOF >> /etc/network/interfaces
auto vmbr1
iface vmbr1 inet manual
    bridge_ports none
    bridge_stp off
    bridge_fd 0
EOF
systemctl restart networking

# Programar backup diario con vzdump
cat <<EOF > /etc/vzdump.conf
dumpdir /tank/backups
mode snapshot
compress zstd
mailnotification always
mailto [email protected]
EOF

Verificación

  1. Pool ZFS: zpool status -v tank debe mostrar el disco sin errores y los datasets listados.
  2. Bridge: brctl show debe listar vmbr0 con la NIC física y vmbr1 sin puertos.
  3. VMs: Inicia una VM de prueba y verifica que el disco provenga de tank/vms (qm list muestra el storage).
  4. Backup: Ejecuta vzdump 101 --mode snapshot --compress zstd y confirma que el archivo aparece en /tank/backups.
  5. Monitoreo: Accede a Grafana y verifica que los métricos de node_exporter aparecen y que las alertas no están disparadas.

Notas adicionales

  • Wear leveling: En SSD NVMe, habilita ssd_spread en ZFS solo si el controlador muestra desgaste rápido; de lo contrario, usa la configuración por defecto.
  • Actualizaciones: Proxmox se actualiza con apt update && apt full-upgrade. Después de una actualización del kernel, reinicia y verifica que el pool ZFS sigue montado.
  • Seguridad: Cambia el puerto por defecto del web UI (8006) y usa autenticación de dos factores si el entorno lo permite.
  • Escalabilidad: Si en el futuro añades discos, convierte el pool a raidz1 con zpool add y migra los datasets; esto evita una re‑instalación completa.