Proxmox TASK ERROR: Dónde leer logs y encontrar la causa raíz rápido

¿Te fue útil?

“TASK ERROR” es la manera de Proxmox de decir que algo falló, mientras se niega cortésmente a decir qué falló en la interfaz. En producción, eso no es un mensaje — es una invitación a perder toda la tarde.

La buena noticia: Proxmox es predecible. La mala noticia: tienes que saber qué log pertenece a qué daemon y cómo seguir las migas de una tarea hasta el subsistema correcto — almacenamiento, red, clúster o configuración del invitado — sin adivinar.

Guion de diagnóstico rápido (primeras/segundas/terceras comprobaciones)

Cuando una tarea de Proxmox falla, no “empiezas a leer logs”. Ejecutas una secuencia corta y brutal que reduce el radio de impacto en minutos. El truco es dejar de tratar “TASK ERROR” como un único problema. Es un envoltorio alrededor de un subproceso, y ese subproceso tiene un hogar.

Primera comprobación: captura el comando real de la tarea y el contexto de salida

  • Abre la tarea en la interfaz y copia el UPID. Se parece a una larga cadena separada por dos puntos.
  • En el nodo donde se ejecutó, lee el log de la tarea desde disco (/var/log/pve/tasks/) y busca el comando que realmente falló y la primera línea de error concreta.
  • Si el log está truncado o es vago, salta al journal de systemd del daemon que lo ejecutó: normalmente pvedaemon, a veces pveproxy, a veces pvescheduler.

Segunda comprobación: decide qué subsistema es el propietario del fallo

La mayoría de fallos de tarea caen en uno de cinco cubos:

  1. Almacenamiento: ZFS, LVM, Ceph, NFS, iSCSI, problemas de permisos, “sin espacio”, rarezas de montaje de dataset.
  2. Clúster: flaps en el enlace de corosync, sin quórum, estado pmxcfs obsoleto.
  3. Invitado: errores en la línea de comandos de QEMU, discos faltantes, config inválida, problemas LXC AppArmor/cgroup.
  4. Red: bridges rotos, desajuste de MTU, firewall, sockets de migración bloqueados.
  5. Host: kernel, hardware, deriva de tiempo, OOM, I/O bloqueado, corrupción de sistema de archivos.

Si no puedes identificar el cubo en 3 minutos, estás leyendo el log equivocado.

Tercera comprobación: confirma con un “comando de verdad” por cubo

Ejecuta un comando que no pueda fingir éxito:

  • Verdad de almacenamiento: pvesm status, zpool status, ceph -s, df -h
  • Verdad de clúster: pvecm status, journalctl -u corosync
  • Verdad de invitado: qm start --debug o pct start --debug
  • Verdad de red: ss -tulpn + comprobaciones de puertos de migración + ip -d link
  • Verdad de host: dmesg -T, journalctl -p err..alert, smartctl

Una vez que tienes “salida verdadera”, dejas de debatir y empiezas a arreglar.

Una realidad cruda: la mayoría de incidentes “TASK ERROR” de Proxmox no son “bugs de Proxmox”. Son higiene de almacenamiento o clúster que se muestran en el peor momento posible.

Cómo están cableadas las tareas de Proxmox (y por qué la UI miente por omisión)

Proxmox VE es una colección de daemons que coordinan trabajo:

  • pvedaemon: ejecuta la mayoría de tareas a nivel de nodo solicitadas vía API/UI (arrancar VM, crear contenedor, migraciones, acciones de almacenamiento).
  • pveproxy: el frontend API/UI; maneja autenticación y despacho, pero rara vez es la fuente del fallo real.
  • pvescheduler: lanza trabajos programados como backups.
  • pvestatd: recopila métricas; es útil cuando el gráfico de la UI se ve mal, no cuando falla una tarea.
  • pmxcfs: el sistema de archivos de clúster montado en /etc/pve. Si está descontento, todo se vuelve “raro” de una manera única en Proxmox.

Una tarea en Proxmox es básicamente: “ejecutar un comando, capturar stdout/stderr, almacenarlo, mostrar una vista filtrada en la UI.” La UI a menudo enfatiza la última línea y oculta la línea anterior que contiene el error real. Por eso vas al log de tarea crudo y al journal del daemon.

Además: el error que ves puede ser el envoltorio fallando, no la operación subyacente. Ejemplo: una migración falla con “connection timed out”, pero la causa raíz es un bloqueo de almacenamiento en el nodo destino porque el sistema de archivos objetivo está en modo solo-lectura. El envoltorio de la migración dice la verdad, pero no la verdad útil.

Idea parafraseada de Werner Vogels: “You build it, you run it.” En el mundo Proxmox eso se traduce en: adjuntas almacenamiento, depuras almacenamiento.

Broma #1: El mensaje de error de la UI de Proxmox es como un parte meteorológico que solo dice “ocurrió algo de tiempo”. Técnicamente correcto, operativamente inútil.

Ubicaciones de logs que importan (y las que no)

El archivo de historial de tareas (empieza aquí)

Proxmox almacena logs de tareas en el nodo bajo:

  • /var/log/pve/tasks/ — los logs canónicos de tareas, organizados por nodo y fecha
  • /var/log/pve/tasks/index — índice de tareas; útil para greps

El flujo de trabajo más rápido: toma el UPID desde la UI, luego haz grep por él en /var/log/pve/tasks/ o usa el archivo del visor de tareas directamente. Buscas:

  • la primera línea de error concreta (no la última)
  • la invocación exacta del comando (qemu, vzdump, zfs, rbd, ssh, rsync)
  • cualquier mención de “permission denied”, “no space”, “I/O error”, “quorum”, “timeout”, “dataset not found”

Journal de systemd (los logs adultos)

Los logs de tareas son buenos, pero los daemons suelen registrar más contexto en el journal del sistema. Estas unidades importan:

  • pvedaemon — la mayoría de detalles de ejecución de tareas
  • pveproxy — problemas de API/autenticación, tickets, desconexiones websocket
  • pvescheduler — disparadores programados de vzdump y replicación
  • corosync — membresía del clúster, estado de enlaces, cambios de quórum
  • pve-cluster (pmxcfs) — sistema de archivos de clúster y sincronización de configuración
  • ceph-* — si usas Ceph, ya sabes por dónde va esto

Logs del kernel y de almacenamiento (donde están los cadáveres)

Cuando el almacenamiento está involucrado, el kernel suele delatar:

  • dmesg / journalctl -k — errores de I/O, resets, tareas colgadas, mensajes de ZFS
  • /var/log/syslog (o journal en instalaciones más nuevas) — contexto a nivel de servicio
  • ZFS: zpool status, zpool events (los eventos son oro durante flaps)
  • Ceph: ceph -s, logs de OSD vía systemd

Logs en los que debes dejar de confiar demasiado

  • La UI por sí sola. Es un resumen, no una herramienta de causa raíz.
  • /var/log/pveproxy/access.log como primer recurso para errores de tarea. Si la autenticación funciona y las tareas se lanzan, pveproxy rara vez es la culpable.
  • Greps aleatorios por /var/log sin un identificador. Encontrarás palabras alarmantes y no aprenderás nada.

Tareas prácticas: comandos, significado de la salida y qué decisión tomar

El objetivo aquí es la rapidez. Cada tarea abajo incluye: comando(s), qué significa la salida y la decisión que tomas a partir de ello. Ejecútalos en el nodo que ejecutó la tarea fallida salvo que se indique lo contrario.

Task 1: Identificar el UPID y sacar el log crudo de la tarea

cr0x@server:~$ grep -R "UPID:" -n /var/log/pve/tasks/index | tail -n 3
/var/log/pve/tasks/index:98122:UPID:pve1:0000A1B2:01F4C3D2:676D2C8B:vzdump:101:root@pam:
/var/log/pve/tasks/index:98123:UPID:pve1:0000A1B7:01F4C3D8:676D2C91:qmstart:104:root@pam:
/var/log/pve/tasks/index:98124:UPID:pve1:0000A1C0:01F4C3E0:676D2C9A:vmmigrate:104:root@pam:

Significado: Tienes UPID recientes. Copia el relevante desde la UI idealmente; el grep del índice es un recurso alternativo.

Decisión: Usa el UPID para localizar el archivo de log específico y léelo de arriba hacia abajo, no al revés.

Task 2: Leer el archivo de log de tarea para ese UPID

cr0x@server:~$ UPID="UPID:pve1:0000A1B2:01F4C3D2:676D2C8B:vzdump:101:root@pam:"; grep -R "$UPID" -n /var/log/pve/tasks/ | head
/var/log/pve/tasks/9/98122:UPID:pve1:0000A1B2:01F4C3D2:676D2C8B:vzdump:101:root@pam:
cr0x@server:~$ sed -n '1,160p' /var/log/pve/tasks/9/98122
UPID:pve1:0000A1B2:01F4C3D2:676D2C8B:vzdump:101:root@pam:
INFO: starting new backup job: vzdump 101 --storage backup-nfs --mode snapshot --compress zstd
INFO: Running hook script 'backup-hook.pl'.
INFO: backup mode: snapshot
INFO: ionice priority: 7
INFO: creating vzdump archive '/mnt/pve/backup-nfs/dump/vzdump-qemu-101-2025_12_26-02_00_01.vma.zst'
ERROR: qemu-img: Could not open '/dev/zvol/rpool/data/vm-101-disk-0': Permission denied
INFO: aborting backup job
TASK ERROR: command 'vzdump 101 --storage backup-nfs --mode snapshot --compress zstd' failed: exit code 255

Significado: La línea útil es Permission denied al abrir un zvol. La última línea es solo el envoltorio.

Decisión: Pivotar hacia permisos ZFS / acceso a dispositivo / AppArmor / configuración de almacenamiento, no “ajustes del backup”.

Task 3: Sacar contexto desde el daemon para la misma ventana temporal

cr0x@server:~$ journalctl -u pvedaemon --since "2025-12-26 01:55" --until "2025-12-26 02:05" | tail -n 30
Dec 26 02:00:01 pve1 pvedaemon[1123]: starting task UPID:pve1:0000A1B2:01F4C3D2:676D2C8B:vzdump:101:root@pam:
Dec 26 02:00:02 pve1 pvedaemon[1123]:  starting task vzdump 101
Dec 26 02:00:05 pve1 pvedaemon[1123]: command 'qemu-img info /dev/zvol/rpool/data/vm-101-disk-0' failed: Permission denied
Dec 26 02:00:05 pve1 pvedaemon[1123]: end task UPID:pve1:0000A1B2:01F4C3D2:676D2C8B:vzdump:101:root@pam: TASK ERROR: exit code 255

Significado: Confirma el subcomando que falla y que ocurre bajo pvedaemon, no alguna capa misteriosa de la UI.

Decisión: Investigar por qué qemu-img no puede abrir la ruta del zvol.

Task 4: Barrido rápido de errores a nivel sistema (no lo sobrepienses)

cr0x@server:~$ journalctl -p err..alert --since "1 hour ago" | tail -n 25
Dec 26 02:00:05 pve1 kernel: audit: type=1400 apparmor="DENIED" operation="open" profile="lxc-container-default-cgns" name="/dev/zvol/rpool/data/vm-101-disk-0" pid=22871 comm="qemu-img" requested_mask="r" denied_mask="r"
Dec 26 02:00:05 pve1 pvedaemon[1123]: command 'qemu-img info /dev/zvol/rpool/data/vm-101-disk-0' failed: Permission denied

Significado: Denegación de AppArmor. Eso no es “aleatorio”; es una razón directa del error de permiso.

Decisión: Arreglar el perfil de AppArmor / confinamiento del contenedor / desajuste tras una actualización que cause la denegación.

Task 5: Confirmar el estado del almacenamiento desde la perspectiva de Proxmox

cr0x@server:~$ pvesm status
Name        Type     Status           Total            Used       Available        %
local       dir      active        98317312        21938176        71340544    22.31%
local-zfs   zfspool  active       402653184       312475648        90177536    77.60%
backup-nfs  nfs      active      1048576000       612368384       436207616    58.40%

Significado: El almacenamiento está “active” según PVE. Eso no garantiza que los dispositivos ZFS subyacentes sean accesibles bajo confinamiento, pero descarta “almacenamiento offline” como causa primaria.

Decisión: Mantener el foco en la ruta de acceso al dispositivo y la capa de seguridad, no en fallos de montaje NFS.

Task 6: Validar salud de ZFS y buscar errores de I/O

cr0x@server:~$ zpool status -x
all pools are healthy

Significado: No hay fallos evidentes a nivel de pool. Esto no es, por ahora, una historia de disco fallando.

Decisión: No empieces a reemplazar hardware porque falló un backup. Sigue rastreando la denegación real.

Task 7: Buscar eventos ZFS alrededor del momento del fallo (útil durante flaps)

cr0x@server:~$ zpool events -v | tail -n 12
Dec 26 01:58:44.120782 sysevent.fs.zfs.config_sync
Dec 26 01:58:44.120790 sysevent.fs.zfs.history_event
    history_event: zfs create rpool/data/vm-104-disk-0
Dec 26 02:00:03.908111 sysevent.fs.zfs.vdev_check
    pool: rpool

Significado: Nada alarmante. Los eventos están tranquilos, lo que respalda “política/permiso” sobre “almacenamiento muriendo”.

Decisión: Deja de escarbar en ZFS hasta que tengas una razón clara.

Task 8: Re-ejecutar la operación del invitado en modo debug

cr0x@server:~$ qm start 101 --debug
start VM 101: UPID:pve1:0000A1D0:01F4C410:676D2D12:qmstart:101:root@pam:
QEMU command line: /usr/bin/kvm -id 101 -name vm101 -no-shutdown ...
kvm: -drive file=/dev/zvol/rpool/data/vm-101-disk-0,if=none,id=drive-scsi0,format=raw: Could not open '/dev/zvol/rpool/data/vm-101-disk-0': Permission denied
TASK ERROR: start failed: QEMU exited with code 1

Significado: No es solo un problema de backups. El arranque de la VM falla por la misma razón. Es evidencia fuerte de una regresión en la política/acceso del host.

Decisión: Tratar como “la VM no puede acceder a su dispositivo de bloque”. Escalar prioridad.

Task 9: Confirmar propiedad y permisos del nodo de dispositivo (sí, es básico—hazlo)

cr0x@server:~$ ls -l /dev/zvol/rpool/data/vm-101-disk-0
lrwxrwxrwx 1 root root 13 Dec 26 01:12 /dev/zvol/rpool/data/vm-101-disk-0 -> ../../zd0
cr0x@server:~$ ls -l /dev/zd0
brw-rw---- 1 root disk 230, 0 Dec 26 01:12 /dev/zd0

Significado: El dispositivo de bloque es grupo disk, modo 660. QEMU típicamente corre como root en Proxmox, así que los permisos UNIX normales usualmente no son el bloqueo.

Decisión: Si los permisos parecen correctos pero el acceso falla, sospecha confinamiento (AppArmor), una extrañeza de namespace de montaje, o una regla de bloqueo a nivel de kernel.

Task 10: Comprobar estado de AppArmor y denegaciones recientes

cr0x@server:~$ aa-status | sed -n '1,60p'
apparmor module is loaded.
60 profiles are loaded.
58 profiles are in enforce mode.
   /usr/bin/lxc-start
   /usr/bin/pve-container
   lxc-container-default-cgns
2 profiles are in complain mode.
0 processes are unconfined but have a profile defined.

Significado: AppArmor está activo. Si las denegaciones mencionan tu ruta de dispositivo o qemu-img, tienes el arma humeante.

Decisión: Arreglar el perfil o las expectativas de ruta. En Proxmox, esto suele aparecer después de actualizaciones parciales o endurecimientos personalizados.

Task 11: Fallos de migración—confirmar conectividad y servicios en escucha

cr0x@server:~$ ss -tulpn | egrep '(:8006|:3128|:5900|:60000|:22)\b'
tcp   LISTEN 0      4096           0.0.0.0:8006       0.0.0.0:*    users:(("pveproxy",pid=1044,fd=6))
tcp   LISTEN 0      4096           0.0.0.0:22         0.0.0.0:*    users:(("sshd",pid=881,fd=3))

Significado: Esto confirma lo básico: la API está arriba, SSH está arriba. La migración usa SSH para orquestación y un canal separado para la transferencia de memoria según la configuración.

Decisión: Si la migración falla por timeout, ahora revisas reglas de firewall, enrutamiento, MTU y cualquier red dedicada de migración. Si los servicios no están en escucha, arregla eso antes de tocar configuraciones de Proxmox.

Task 12: Errores de tareas de clúster—comprobar quórum y salud de corosync

cr0x@server:~$ pvecm status
Cluster information
-------------------
Name:             prodcluster
Config Version:   19
Transport:        knet
Secure auth:      on

Quorum information
------------------
Date:             Fri Dec 26 02:03:11 2025
Quorum provider:  corosync_votequorum
Nodes:            3
Node ID:          0x00000001
Ring ID:          1.2a
Quorate:          Yes

Votequorum information
----------------------
Expected votes:   3
Total votes:      3
Quorum:           2
Flags:            Quorate

Significado: El quórum está OK. Si ves Quorate: No, muchas tareas fallarán, colgarán o se negarán a ejecutarse porque /etc/pve se vuelve de solo lectura.

Decisión: Si no hay quórum: deja de hacer “troubleshooting de almacenamiento” y arregla primero el enlace/quórum del clúster. Proxmox depende de un estado pmxcfs sano para operaciones coherentes.

Task 13 (bonus, porque lo necesitarás): Verificar montaje y estado de pmxcfs

cr0x@server:~$ mount | grep /etc/pve
pve on /etc/pve type fuse.pve (rw,nosuid,nodev,relatime,user_id=0,group_id=0,default_permissions,allow_other)

Significado: rw es lo que quieres. Si cambia a ro, verás fallos extraños: ediciones de config de VM fallan, ediciones de almacenamiento fallan, tareas fallan con errores confusos.

Decisión: Si está ro, trátalo como un problema de clúster/quórum hasta que se demuestre lo contrario.

Task 14 (bonus): Detectar “no space” como lo ve el kernel

cr0x@server:~$ df -hT | egrep '(/$|/var|/mnt/pve|/rpool|/dev/sd)'
Filesystem                 Type  Size  Used Avail Use% Mounted on
/dev/mapper/pve-root       ext4   96G   89G  2.1G  98% /
backup-nfs:/export/backup  nfs4  1000G  584G  417G  59% /mnt/pve/backup-nfs

Significado: El sistema raíz al 98% no es un “problema futuro”. Es una fuente actual de fallos aleatorios en tareas (no se pueden escribir logs, fallan archivos temporales, dpkg rompe).

Decisión: Si la raíz está llena: límpiala ahora y vuelve a ejecutar la tarea. No sigas “intentando” esperando que se resuelva sola.

Eso ya es más de 12 tareas. Bien. Tu trabajo no es memorizarlas; es interiorizar el mapeo: tarea → daemon → subsistema → comando de verdad.

Modos de fallo comunes por categoría

Backups (vzdump) que fallan “aleatoriamente”

Los backups tocan casi todo: lógica de snapshot del invitado, almacenamiento, compresión, red (si es remota) y limpieza de retención. Cuando un backup falla, la causa normalmente no es “vzdump está roto”. Es:

  • snapshot no posible (falta agent del invitado o falla el freeze del sistema de archivos)
  • el almacenamiento no puede crear archivos temporales (permisos, sin espacio, montaje obsoleto)
  • timeouts por discos lentos o NFS/Ceph sobrecargados
  • contención de locks: backup previo aún ejecutándose, o archivo de lock obsoleto

Dónde mirar primero: el log de la tarea para el subcomando que falla (qemu-img, vma, zstd, tar) y luego los logs del kernel por stalls de I/O.

Migraciones que fallan con timeouts

La migración en vivo es una obra en tres actos:

  1. Orquestación (SSH, pvedaemon en ambos extremos)
  2. Transferencia de estado (páginas de RAM, estado de dispositivos)
  3. Sincronización de almacenamiento (depende de almacenamiento compartido vs local + replicación)

Las fallas suelen correlacionarse con desajuste de MTU en una red de migración dedicada, reglas de firewall bloqueando puertos efímeros, o almacenamiento en el destino que no está “realmente listo” aunque PVE diga que está activo.

Errores de arranque de VM que parecen a QEMU dramático

Los errores de QEMU son verbosos pero honestos. Cuando ves:

  • Could not open ... Permission denied → política/permisos o desajuste de ruta de bloque
  • Device or resource busy → proceso obsoleto reteniendo un dispositivo, qemu residual, o volumen ZFS aún en uso
  • No such file or directory → ruta de almacenamiento incorrecta, dataset faltante, almacenamiento no montado
  • Invalid argument → a menudo desajuste kernel/controlador o una opción rota tras una actualización

Tareas de clúster fallando porque el clúster está “medio arriba”

Los clústeres de Proxmox pueden ser engañosamente funcionales mientras están rotos: los nodos hacen ping, la UI carga, pero las escrituras de configuración fallan o las tareas cuelgan. Si se pierde el quórum, /etc/pve pasa a solo lectura para evitar escrituras en split-brain. Eso es buen diseño, pero parece sabotaje a las 2 a. m.

Tareas de almacenamiento fallando porque el almacenamiento está “activo” pero inutilizable

“Active” en pvesm status significa que Proxmox puede ver la definición de almacenamiento y pasó su comprobación de activación. Eso no garantiza:

  • Que NFS sea estable (puede estar montado pero colgado)
  • Que Ceph esté sano (puede responder pero estar degradado o bloqueando)
  • Que ZFS tenga suficiente espacio (puede estar online pero efectivamente lleno por snapshots)

Errores frecuentes: síntoma → causa raíz → solución

Estos son los fallos que veo repetidamente porque son escurridizos, no porque sean difíciles.

1) Síntoma: “TASK ERROR: command ‘vzdump …’ failed” con código de salida 255

Causa raíz: El código 255 suele ser el envoltorio reportando una falla de un subcomando. El error real está antes: permiso denegado, fallo de snapshot o problema con almacenamiento remoto.

Solución: Lee el log de tarea desde el inicio y encuentra la primera línea ERROR:. Luego revisa journalctl -u pvedaemon para la misma ventana temporal.

2) Síntoma: Migración falla con “connection timed out” o “ssh exited with status 255”

Causa raíz: No es una sola cosa. Normalmente firewall/MTU/enrutamiento en la ruta de migración, o confianza SSH rota entre nodos.

Solución: Confirma que sshd es alcanzable de nodo a nodo, verifica consistencia de MTU con ip link, y revisa reglas de firewall en ambos extremos. Si usas una red de migración dedicada, pruébala directamente.

3) Síntoma: Arranque de VM falla tras una actualización, pero ayer funcionaba

Causa raíz: Actualizaciones parciales o kernel/módulos/usuariospace desajustados. A veces los perfiles de AppArmor cambian y empiezan a denegar rutas que antes estaban permitidas.

Solución: Asegura que el nodo está completamente actualizado y reiniciado en el kernel esperado. Revisa journalctl -p err..alert por denegaciones de AppArmor y errores del kernel.

4) Síntoma: Tareas no pueden modificar configs de VM; la UI dice permiso denegado o “file is read-only”

Causa raíz: El clúster perdió quórum; pmxcfs está en solo lectura.

Solución: Revisa pvecm status. Arregla la conectividad de corosync. No “compenses” editando archivos en otro sitio; así es como creas deriva de configuración en split-brain.

5) Síntoma: Almacenamiento está “active”, pero backups/migraciones cuelgan minutos y luego fallan

Causa raíz: Montaje NFS obsoleto o I/O bloqueado. El montaje existe, pero el I/O está trabado.

Solución: Revisa logs del kernel por timeouts de NFS, verifica salud del servidor NFS y considera opciones de montaje hard vs soft. Si el host está atascado en tareas en estado D, puede que necesites arreglar la ruta de almacenamiento antes de que Proxmox recupere.

6) Síntoma: “no space left on device” aunque df muestre espacio libre

Causa raíz: Inodos agotados, cuota de dataset ZFS, pool ZFS casi lleno con penalidades copy-on-write, o Ceph alcanzando ratio de llenado.

Solución: Revisa uso de inodos (df -i), cuotas y bloat de snapshots en ZFS (zfs list -o space), y umbrales de llenado de Ceph si procede.

7) Síntoma: “unable to activate storage” tras reinicio

Causa raíz: El almacenamiento en red se monta antes de que la red esté lista, o la resolución de nombres no está disponible aún, o el ordering de systemd es incorrecto.

Solución: Valida DNS, rutas, y considera dependencias de systemd para los mounts. En NFS, asegúrate de que la unidad de montaje espere por network-online. Luego re-activa el almacenamiento y re-ejecuta tareas.

8) Síntoma: Inicio de LXC falla con errores de cgroup o mount

Causa raíz: Expectativas del kernel/cgroup v2 vs configuración de contenedor, confinamiento AppArmor, o ajustes de nesting.

Solución: Ejecuta pct start <id> --debug, luego revisa journalctl -u pvedaemon y logs del kernel por mensajes de cgroup. Corrige los flags de características del contenedor deliberadamente, no por prueba y error.

Broma #2: “Funcionaba ayer” no es un diagnóstico; es un cuento para dormir que el sistema te cuenta antes de arruinar tu mañana.

Tres micro-historias corporativas desde las trincheras

Incidente 1: El outage causado por una suposición equivocada (almacenamiento compartido ≠ almacenamiento consistente)

Una compañía mediana ejecutaba un clúster Proxmox de dos nodos con “almacenamiento compartido” en NFS. La UI mostraba el datastore NFS como activo en ambos nodos. Las migraciones eran rutinarias. Los backups eran verdes. Todos dormían tranquilos.

Entonces vino una ventana de mantenimiento: un ingeniero de red reemplazó un switch, y un nodo volvió con una configuración de etiquetado VLAN diferente. El nodo aún podía alcanzar el servidor NFS de forma intermitente — lo suficiente para que el montaje existiera — pero I/O grandes se bloqueaban. En términos de Proxmox, el almacenamiento estaba “active”. En realidad, era una trampa.

La migración en vivo empezó durante horario laboral. La tarea falló por timeout. El on-call asumió que era “inestabilidad de migración de Proxmox”, reintentó dos veces, luego intentó otra VM. Ahora múltiples VMs quedaron en limbo con locks retenidos. La UI se llenó de entradas TASK ERROR que todas se veían básicamente idénticas.

La solución fue aburrida: verificar salud de I/O del NFS con una prueba directa de lectura/escritura en el montaje, revisar logs del kernel por timeouts de NFS, y corregir el etiquetado VLAN. La lección quedó: no trates “montado” como “saludable”, y no reintentes migraciones a ciegas. Reintentar es cómo conviertes un fallo en una cola de fallos.

Incidente 2: La optimización que salió mal (backups más rápidos, clúster más lento)

Un equipo distinto quería backups nocturnos más rápidos. Pasaron de gzip a zstd, activaron múltiples trabajos de backup en paralelo y se sintieron listos. CPU había disponible. El almacenamiento era “rápido”. ¿Qué podía salir mal?

Lo que salió mal fue el scheduling de I/O y la latencia. Trabajos paralelos de vzdump crearon ráfagas de lecturas desde zvols ZFS mientras simultáneamente escribían grandes flujos comprimidos a un destino NFS. ZFS hizo lo que ZFS hace: intentó ayudar con caching y copy-on-write. NFS añadió variabilidad. El resultado fue stalls ocasionales de I/O.

Las tareas de Proxmox empezaron a fallar con mensajes vagos: timeouts, retrasos al confirmar snapshots, “unable to freeze filesystem”, timeouts ocasionales en comandos del monitor de VM. El equipo pasó una semana mirando logs de Proxmox, convencidos de que el hipervisor era inestable. Los logs del kernel contaron la historia real: tareas bloqueadas esperando I/O y picos de latencia en NFS.

El rollback no fue dramático. Redujeron la concurrencia, fijaron ventanas de backup, y — lo más importante — dejaron de escribir backups en la misma ruta de red que manejaba tráfico sensible a la latencia. Los backups quedaron un poco más lentos. Todo lo demás volvió a ser fiable. Optimizar un cuello de botella inexistente es cómo creas uno.

Incidente 3: La práctica aburrida pero correcta que salvó el día (sincronización de tiempo + disciplina de logs)

Una compañía del área financiera ejecutaba un clúster Proxmox con Ceph. Tenían una regla estricta: cada nodo debía tener sincronización de tiempo funcionando, y los logs se guardaban con retención suficiente para cubrir fines de semana. Nadie celebraba esto. Era solo política, aplicada por automatización.

Un viernes por la noche, un nodo empezó a lanzar TASK ERROR durante replicación y operaciones Ceph. Los errores en la UI eran genéricos. Pero el equipo correlacionó eventos inmediatamente porque las marcas temporales coincidían claramente entre nodos. Vieron que las fallas comenzaban justo después de un cambio de red específico y que flaps de corosync precedieron advertencias de Ceph.

Como los logs se retenían y el tiempo era coherente, trazaron la causa raíz rápido: una MTU jumbo mal configurada causaba pérdida de paquetes en una interfaz, lo que desestabilizó la red del clúster y desencadenó timeouts en cascada. Arreglaron la consistencia de MTU, vieron a corosync estabilizarse y las tareas dejaron de fallar.

Nada heroico. Solo fundamentos aburridos: relojes sincronizados, retención consistente y el hábito de revisar corosync antes de culpar a Ceph o Proxmox. Así se ve la “madurez operacional” cuando no intenta venderte nada.

Listas de verificación / plan paso a paso

Checklist A: Cuando ves “TASK ERROR” y tienes 10 minutos

  1. Copia el UPID desde los detalles de la tarea.
  2. Abre el log crudo de la tarea en /var/log/pve/tasks/ y encuentra la primera línea real ERROR:.
  3. Saca contexto del journal del daemon alrededor del mismo minuto: journalctl -u pvedaemon (o pvescheduler para trabajos programados).
  4. Clasifica el problema: almacenamiento, clúster, invitado, red, host.
  5. Ejecuta un comando de verdad para ese cubo (pvesm status/zpool status/pvecm status/qm start --debug/dmesg -T).
  6. Decide: reintentar solo está permitido después de eliminar la causa (espacio, permiso, quórum, conectividad). Nunca reintentes como método diagnóstico a menos que el sistema sea idempotente y lo sepas.

Checklist B: Fallos centrados en almacenamiento (backups, replicación, adjuntar disco)

  1. pvesm status — ¿está el almacenamiento activo?
  2. df -hT — ¿está full / o el montaje objetivo?
  3. Si ZFS: zpool status -x y zfs list -o space — salud del pool y bloat de snapshots.
  4. Si Ceph: ceph -s — ¿está HEALTH_OK el clúster? Si no, espera rarezas.
  5. journalctl -k — ¿errores de I/O, resets, tareas colgadas?
  6. Arregla el cuello de botella, luego reejecuta exactamente una tarea para validar.

Checklist C: Fallos centrados en clúster (ediciones de config, migraciones, acciones HA)

  1. pvecm status — ¿hay quórum?
  2. journalctl -u corosync — ¿flaps de enlace, timeouts de token?
  3. mount | grep /etc/pve — ¿pmxcfs está rw?
  4. Arregla la red/enlaces del clúster primero. No “forces” operaciones en un clúster sin quórum a menos que aceptes completamente el riesgo de split-brain.

Checklist D: Fallos de inicio de invitado

  1. Ejecuta el inicio del invitado en debug (qm start --debug o pct start --debug).
  2. Busca rutas de archivos y nombres de dispositivos en el error. Esos son tus anclas.
  3. Verifica que el objeto de almacenamiento subyacente exista (zvol, qcow2, imagen rbd, volumen lógico).
  4. Revisa denegaciones de la capa de seguridad (AppArmor) y logs del kernel.
  5. Solo después de eso: considera regresión de config (tipo de máquina, flags de CPU, opciones de dispositivo).

Datos interesantes y contexto histórico (para que los logs tengan más sentido)

  • UPID es el sistema de identidad de tareas de Proxmox: codifica nodo, PID, hora de arranque y tipo de tarea. Está diseñado para rastreo distribuido en clústeres.
  • Proxmox se apoya en el modelo de servicios de Debian: muchos “problemas de Proxmox” son realmente issues de systemd/journal/kernel con máscara de Proxmox.
  • /etc/pve no es un sistema de archivos normal: es pmxcfs, un sistema de archivos FUSE basado en clúster. Cuando se pierde quórum, puede volverse de solo lectura para evitar escrituras en split-brain.
  • El comportamiento de quórum de Corosync es intencionalmente estricto: rechazar escrituras sin quórum es una elección de diseño que favorece corrección sobre conveniencia.
  • Los cambios copy-on-write de ZFS alteran los síntomas de fallo: los pools pueden estar “healthy” pero dolorosamente lentos o casi inservibles cuando están cerca del lleno, porque cada escritura se vuelve cara.
  • La salud de Ceph es más que “up”: un clúster Ceph puede responder comandos mientras sigue degradado al punto de provocar timeouts de I/O cliente durante la recuperación.
  • vzdump es un envoltorio: la herramienta de backup orquesta snapshot y empaquetado, pero el trabajo real lo hacen qemu, backends de almacenamiento y herramientas de compresión.
  • Los logs de tareas se almacenan localmente: en un clúster multinodo, debes leer los logs en el nodo que ejecutó la tarea, no en el nodo donde hiciste clic en la UI.
  • Muchos fallos son problemas de correlación temporal: sin sincronización de tiempo decente, no puedes correlacionar eventos de corosync, errores del kernel y fallos de tareas. Los “logs” se vuelven ficción.

Preguntas frecuentes

1) ¿Dónde encuentro exactamente el log de una tarea que muestra “TASK ERROR” en la UI?

En el nodo que la ejecutó: /var/log/pve/tasks/. Usa el UPID para localizar el archivo exacto (o grepea el índice en /var/log/pve/tasks/index).

2) ¿Por qué la UI de Proxmox muestra tan poco detalle para TASK ERROR?

Porque renderiza un resumen. El error real suele estar antes en la salida de la tarea o registrado por el daemon que la ejecutó en el journal.

3) ¿Qué daemon debo revisar con journalctl para la mayoría de fallos de tarea?

pvedaemon primero. Para tareas programadas como backups, revisa también pvescheduler. Para membresía de clúster y cuestiones de quórum, revisa corosync y pve-cluster.

4) Mi tarea falla en el nodo A, pero estoy conectado al nodo B en la UI. ¿Importa?

Sí. Los logs de tareas son locales al nodo que ejecutó la tarea. Si lees logs en el nodo equivocado, concluirás “no hay logs” y empezarás a adivinar.

5) Veo “exit code 255” frecuentemente. ¿Qué significa?

Usualmente “el comando falló y el envoltorio lo está reportando.” Rara vez es la causa raíz por sí misma. Encuentra la línea anterior: permiso, ruta, espacio, timeout, fallo de snapshot.

6) ¿Cómo sé si un fallo es por clúster/quórum?

pvecm status. Si ves Quorate: No, espera comportamientos raros en tareas y fallos al escribir configuración. También revisa si /etc/pve está montado de solo lectura.

7) Los backups fallan pero el almacenamiento está “active”. ¿Y ahora?

“Active” no es “saludable”. Revisa logs del kernel por timeouts de almacenamiento, confirma espacio libre y disponibilidad de inodos, y valida la salud del backend de almacenamiento (ZFS/Ceph/NFS).

8) ¿Cuál es la forma más rápida de depurar una VM que no arranca?

Ejecuta qm start <vmid> --debug en el nodo y lee la línea de error exacta de QEMU. Luego valida la ruta/dispositivo de disco referenciado y revisa logs del kernel/AppArmor.

9) ¿Cuándo debo reiniciar un nodo Proxmox durante un incidente TASK ERROR?

Cuando hayas confirmado que el fallo es causado por un estado de host que no se limpia de forma segura: I/O atascado, problemas de driver del kernel, o desajuste kernel/usuariospace tras una actualización. Reiniciar como primera reacción hace que pierdas datos forenses.

10) ¿Necesito logging centralizado para depurar Proxmox?

Ayuda, pero no es obligatorio para encontrar la causa raíz. Lo que necesitas es: seleccionar el nodo correcto, leer logs de tarea por UPID y tener acceso al journal con correlación temporal.

Siguientes pasos que puedes hacer hoy

  1. Practica el flujo UPID: toma cualquier tarea completada, encuentra su UPID y trázalo desde UI → /var/log/pve/tasks/journalctl. Haz que sea memoria muscular.
  2. Decide tus “comandos de verdad” por subsistema y apúntalos para tu entorno (ZFS vs Ceph vs NFS cambia las primeras preguntas).
  3. Deja de reintentar a ciegas: instituye una regla—un reintento máximo, solo después de una hipótesis y una comprobación. Los reintentos crean locks, carga y peores logs.
  4. Establece la línea base de salud del clúster: revisa estado de quórum, estabilidad de corosync y modo de montaje de pmxcfs en horas de calma para reconocer salida anormal al instante.
  5. Vigila tu sistema raíz: mantén espacio libre en / y /var. Los fallos de tareas causados por disco raíz lleno son embarazosos porque son evitables.

Si haces esas cinco cosas, “TASK ERROR” deja de ser un insulto vago y se convierte en lo que siempre fue: un puntero a un subsistema específico que está fallando. Seguirás teniendo incidentes. Simplemente los resolverás más rápido y con menos conjeturas.

← Anterior
Docker «red no encontrada»: reconstruir redes sin romperlo todo
Siguiente →
Ubuntu 24.04 “Permission denied” al ejecutar scripts: montajes noexec y cómo solucionarlo (caso #58)

Deja un comentario