Antes de tener un homelab con LXCs, VMs y servicios corriendo, hay un primer paso aburrido pero necesario: instalar el hipervisor. En mi caso, Proxmox VE sobre un Lenovo M700 (i7-6700T, 32 GB de RAM, un SSD de 128 GB para sistema y un HDD de 1 TB para datos). Conectados al mini PC vienen una Coral TPU USB para inferencia de Frigate y un dongle Zigbee Sonoff para Home Assistant.
La instalación misma fue directa y no tiene mucho que contar — descargar el ISO, bootear desde USB, siguiente, siguiente, siguiente. Donde sí hay cosas interesantes es en lo que vino después.
El script de post-instalación de la comunidad
Proxmox VE viene configurado por defecto con el repositorio “enterprise”, que requiere licencia. Si lo dejas así, no puedes hacer apt update sin errores y pierdes acceso a las actualizaciones del repo de “no-subscription”. Hay un script mantenido por la comunidad que arregla esto y hace varios ajustes razonables más:
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/pve/post-pve-install.sh)"
Te pregunta interactivamente si quieres deshabilitar el repo enterprise, agregar el repo no-subscription, deshabilitar el nag de “no tienes licencia” cada vez que entras a la GUI, y un par de cosas más. Yo dije que sí a todo.
Instalando el runtime de la Coral TPU
Para que Frigate aproveche la Coral USB necesitas instalar la librería libedgetpu en el host. Google distribuye los paquetes en su propio repositorio:
# Agregar el repo de Coral
echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" \
| tee /etc/apt/sources.list.d/coral-edgetpu.list
# Importar la llave GPG (versión moderna, sin apt-key que está deprecado)
curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg \
| gpg --dearmour -o /etc/apt/trusted.gpg.d/coral.gpg
apt update
apt install libedgetpu1-std
Una nota importante: muchas guías por ahí usan apt-key add para importar la llave GPG. Eso está deprecado desde Debian 11 y va a desaparecer. La forma correcta hoy es escribir el keyring directamente a /etc/apt/trusted.gpg.d/, como hago arriba. Saqué esta receta del foro de Home Assistant sobre Frigate + Coral USB en Proxmox, que es de los pocos lugares donde estaba bien documentado.
Esto solo instala el runtime en el host. Para que Frigate (que corre en un LXC) realmente pueda usar la Coral, hay que pasarle el dispositivo USB al contenedor — pero eso ya es harina de otro costal y va en otro post.
El problema del ARC de ZFS comiéndose la RAM
Si instalas Proxmox usando ZFS como sistema de archivos para el rootfs (que es lo que hice), te vas a encontrar con que el ARC — el caché de lectura de ZFS — por defecto puede ocupar hasta la mitad de tu RAM total. En mi caso eso significa 16 GB de los 32 que tengo. Para un servidor de archivos puede tener sentido, pero para un homelab donde la RAM se va a repartir entre Home Assistant, Frigate, Vaultwarden, Nextcloud y compañía, es absurdo.
La solución es limitar el ARC a algo razonable. Yo lo dejé en 4 GB:
# 1. Limitar el ARC a 4 GB en la configuración de módulos del kernel
echo "options zfs zfs_arc_max=4294967296" > /etc/modprobe.d/zfs.conf
# 2. Aplicarlo inmediatamente sin reiniciar
echo 4294967296 > /sys/module/zfs/parameters/zfs_arc_max
# 3. Regenerar el initramfs para que el cambio persista en reboots
update-initramfs -u -k all
El número 4294967296 son 4 GB en bytes (4 × 1024³). Si quieres otro valor, calcula N * 1024 * 1024 * 1024.
Para verificar que quedó aplicado:
cat /etc/modprobe.d/zfs.conf
free -h
arc_size=$(cat /proc/spl/kstat/zfs/arcstats | grep "^size" | awk '{print $3}')
echo "ARC actual: $((arc_size/1024/1024/1024)) GB"
Los tres pasos son importantes y ninguno es opcional: el primero hace que el cambio persista, el segundo lo aplica ahora mismo (porque el primero solo entra en efecto al cargar el módulo, y el módulo ya está cargado), y el tercero asegura que el kernel lo lea desde el initramfs en el próximo arranque.
Limpiando swap
Después de cambiar el ARC, mi sistema tenía un montón de páginas en swap que ya no necesitaban estar ahí. Un truco rápido es desactivar y reactivar el swap, lo que fuerza que todo lo que está en disco vuelva a la RAM:
swapoff -a && swapon -a
free -h
Solo úsalo si tienes RAM libre suficiente para absorber lo que está en swap, obviamente. Si no, vas a OOM-killear cosas.
Lo que queda pendiente
Hasta acá llega lo que recuerdo bien. Mi homelab también tiene un disco HDD externo formateado y montado para almacenamiento de VMs y backups, y el dongle Zigbee USB pasado por completo a la VM de Home Assistant. Hice ambas cosas en el setup inicial, pero honestamente no tomé notas en su momento y no recuerdo los pasos exactos. Cada uno de esos temas merece su propio post hecho con calma — y aprovecho de prometer que los voy a escribir cuando los reconstruya, esta vez documentando mientras lo hago.
Lección que me llevo: documenta mientras configuras, no después. Tu yo del futuro (o el siguiente reinstall) te lo va a agradecer.