Problema
En entornos homelab o pequeñas oficinas es frecuente combinar la capacidad de virtualización de Proxmox con la necesidad de ofrecer servicios de almacenamiento (NAS) a varios clientes. El patrón típico es:
- Un servidor con una HBA (Host Bus Adapter) que expone discos SAS/NVMe directamente al hardware.
- Proxmox como hipervisor, con varias VMs que deben acceder a esos discos sin pasar por el sistema de archivos del host.
- Un requerimiento de autenticación centralizada, ya sea LDAP (Active Directory) o un proveedor OIDC, para que los usuarios accedan al NAS mediante SMB/NFS.
Los síntomas habituales son:
- La VM de NAS no ve los discos asignados, o aparecen como “unallocated” en el gestor de discos.
- Los intentos de montar recursos SMB/NFS fallan por falta de credenciales válidas.
- Los cambios en la configuración de la HBA o del directorio de usuarios provocan reinicios inesperados del host.
El reto consiste en lograr que la HBA sea pasada al contenedor o VM de forma segura, y que la capa de autenticación sea gestionada por Proxmox o por la propia VM sin romper la integración de red.
Causa
1. Passthrough incompleto de la HBA
Proxmox necesita habilitar IOMMU (VT‑d/AMD‑V) y marcar la HBA como “hostpci0”. Si la BIOS tiene la opción de “ACS override” desactivada, el host puede agrupar varios dispositivos bajo el mismo “IOMMU group”, impidiendo que la HBA se aísle correctamente. El resultado es que la VM recibe un “virtual function” sin acceso físico a los discos.
2. Configuración de red conflictiva
Cuando se combina LDAP u OIDC, normalmente se usan puertos 389/636 (LDAP) o 443 (OIDC). Si la VM de NAS comparte la misma interfaz de red que el host y no se separan VLAN o puentes, el tráfico de autenticación puede ser interceptado o bloqueado por reglas de firewall de Proxmox.
3. Falta de mapeo de usuarios en el NAS
Los sistemas de archivos como ZFS o LVM en la VM esperan usuarios locales (UID/GID). Si el LDAP/OIDC no está sincronizado, los permisos de exportación SMB/NFS no coinciden y los clientes reciben “access denied”.
4. Incompatibilidad de versiones de los controladores
Algunas HBA modernas requieren firmware o controladores que solo están disponibles en kernels más recientes que el que corre Proxmox por defecto. Un driver desactualizado no reconoce la HBA y la pasa como dispositivo genérico, lo que impide la detección de discos.
Solución
Paso 1 – Preparar el host para IOMMU
- Verifica que la CPU soporte VT‑d (Intel) o AMD‑V (AMD) y que esté habilitado en la BIOS.
- Añade
intel_iommu=onoamd_iommu=onal archivo/etc/default/grub:GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on" - Ejecuta
update-gruby reinicia.
Paso 2 – Identificar la HBA y su IOMMU group
lspci -nnk | grep -i -A3 "storage"
Busca la línea que muestra el ID del dispositivo (por ejemplo 00:1f.2). Luego:
find /sys/kernel/iommu_groups/ -type l -name "*00:1f.2*"
Anota el número de grupo; si el grupo contiene otros dispositivos críticos (NIC, GPU), considera usar ACS override o mover la HBA a otro slot.
Paso 3 – Configurar passthrough en Proxmox
Edita la VM que actuará como NAS (ID 101 por ejemplo) y añade la línea:
qm set 101 -hostpci0 00:1f.2,pcie=1
Si la HBA necesita reset después de arrancar, agrega ,reset=1. Guarda y arranca la VM.
Paso 4 – Aislar la red de autenticación
Crea un puente dedicado (vmbr1) conectado a una VLAN reservada para LDAP/OIDC. En la VM de NAS asigna una interfaz a ese puente:
qm set 101 -net1 virtio,bridge=vmbr1
En el firewall de Proxmox permite tráfico a los puertos 389, 636 y 443 solo en vmbr1.
Paso 5 – Configurar LDAP/OIDC dentro de la VM
En la VM (ejemplo Ubuntu 22.04) instala sssd y realmd:
apt-get update && apt-get install -y sssd realmd
realm join --user=admin example.com
Para OIDC, instala keycloak o usa openidc-client y configura PAM:
apt-get install -y libpam-oidc
Asegúrate de que los UID/GID del directorio coincidan con los que usarás en SMB/NFS. Puedes mapearlos en /etc/sssd/sssd.conf con ldap_id_mapping = True.
Paso 6 – Crear pools de almacenamiento en la VM
Dentro de la VM, detecta los discos pasados:
lsblk
Crea un pool ZFS (ejemplo tank):
zpool create tank /dev/sdb /dev/sdc
zfs create -o mountpoint=/export/tank/data tank/data
Exporta el dataset vía SMB con Samba:
apt-get install -y samba
cat >> /etc/samba/smb.conf <<EOF
[tank]
path = /export/tank/data
read only = no
force user = %U
valid users = @nasusers
EOF
systemctl restart smbd
Los grupos nasusers provienen del LDAP, por lo que cualquier usuario autenticado podrá montar el recurso.
Paso 7 – Sincronizar credenciales entre Proxmox y la VM (opcional)
Si prefieres que Proxmox gestione la autenticación y la pase a la VM, habilita “Realm” en la UI de Proxmox (Datacenter → Permissions → Realms) y configura un “LDAP” o “OIDC” realm. Luego, asigna permisos a los usuarios del realm para acceder a la VM y a los recursos de almacenamiento.
Cuándo aplicar esta solución
- Escenario típico: Un servidor Proxmox con una HBA dedicada y la necesidad de exponer discos a VMs que actúan como NAS, mientras se mantiene una política de autenticación centralizada.
- Señales: La VM no detecta discos, los clientes SMB/NFS fallan por “access denied”, o el host muestra mensajes de IOMMU conflict.
- No aplicar: Si el entorno solo necesita compartir archivos a través de NFS y no requiere aislamiento de hardware, usar un contenedor LXC con bind‑mounts es más sencillo. Tampoco es necesario si la infraestructura de autenticación ya está integrada en el NAS (por ejemplo, FreeNAS con su propio LDAP).
Código
# Paso 1: habilitar IOMMU
sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="/GRUB_CMDLINE_LINUX_DEFAULT="intel_iommu=on /' /etc/default/grub
update-grub && reboot
# Paso 2: identificar HBA y grupo IOMMU
lspci -nnk | grep -i -A3 "storage"
find /sys/kernel/iommu_groups/ -type l -name "*00:1f.2*"
# Paso 3: asignar passthrough a la VM 101
qm set 101 -hostpci0 00:1f.2,pcie=1,reset=1
# Paso 4: crear puente de red dedicado
cat >> /etc/network/interfaces <<EOF
auto vmbr1
iface vmbr1 inet static
address 192.168.100.1/24
bridge_ports none
bridge_stp off
bridge_fd 0
EOF
systemctl restart networking
qm set 101 -net1 virtio,bridge=vmbr1
# Paso 5: unir la VM al dominio LDAP
apt-get update && apt-get install -y sssd realmd
realm join --user=admin example.com
# Paso 6: crear pool ZFS y exportar vía Samba
zpool create tank /dev/sdb /dev/sdc
zfs create -o mountpoint=/export/tank/data tank/data
apt-get install -y samba
cat >> /etc/samba/smb.conf <<EOF
[tank]
path = /export/tank/data
read only = no
force user = %U
valid users = @nasusers
EOF
systemctl restart smbd
Verificación
- Comprobar IOMMU:
dmesg | grep -i iommudebe mostrar “enabled”. - Verificar que la VM ve los discos: dentro de la VM,
lsblkdebe listar/dev/sdby/dev/sdc. - Test de autenticación LDAP:
id usuario_ldapdebe devolver UID/GID correctos. - Montar SMB desde un cliente:
El montaje debe completarse sin errores.
sudo mount -t cifs //nas.example.com/tank /mnt -o username=usuario_ldap,domain=EXAMPLE - Revisar logs:
journalctl -u smbdyjournalctl -u sssdpara detectar fallos.
Notas adicionales
- ACS override: En placas madre que no exponen grupos IOMMU aislados, el kernel permite
options vfio-pci ids=XXXX:YYYY,disable_idle_d3=1yecho 1 > /sys/bus/pci/devices/0000:00:1f.2/driver_override. Usa con precaución; puede afectar la estabilidad del host. - Backup del pool ZFS: Configura snapshots automáticos (
zfs snapshot -r tank@$(date +%F-%H%M)) y replica a otro nodo conzfs send/receive. - Performance tip: Si la HBA soporta multipath, instala
multipath-toolsdentro de la VM y habilitamultipath.confpara balancear I/O entre discos. - Seguridad: Limita los puertos LDAP/OIDC al rango de IP de la VM de NAS mediante reglas de firewall en Proxmox (
pve-firewall). - Actualizaciones: Después de actualizar el kernel del host, verifica que el módulo
vfio-pcisigue cargado; de lo contrario, el passthrough dejará de funcionar.