Tecnología · GUÍA PRÁCTICA
¿«Invalid cross-device link»? Demuestra la syscall antes de copiar o borrar
EXDEV puede ser un rename entre montajes o un rechazo de política de rutas. Conserva caller, syscall y mount IDs, y mantén el origen hasta verificar el destino.

“Invalid cross-device link” nombra el errno EXDEV, no un diagnóstico completo. rename() lo devuelve entre sistemas montados distintos y openat2() puede devolverlo por una política de contención.
Un movimiento entre filesystems suele ser copia y eliminación, no un rename atómico. Esa diferencia debe quedar visible.
Fija el límite exacto del fallo
Registra programa, argumentos, cwd, namespace, rutas dadas y resueltas, errno y horas; conserva el primer fallo antes de reintentos.
Traza solo hasta identificar syscall y rutas. El mismo mensaje no autoriza la misma reparación.
Compara identidad de montaje y resolución de rutas
Compara mount IDs visibles para el proceso real, no nombres de unidades del host. Bind mounts y contenedores cambian el dominio de rename.
Comprueba aparte padre del destino, tipo, permisos, espacio y política de colisión.
No confundas rename con la política de openat2
Para rename(), EXDEV indica mount points distintos. Para openat2(), revisa flags y si una ruta absoluta, enlace, .. o cruce viola la contención.
No desactives un límite de seguridad para silenciar el errno; corrige el contrato de ruta o usa un destino permitido.
Diseña un fallback seguro entre filesystems
Si cruza filesystems, crea un temporal en el filesystem de destino, copia datos y metadatos, aplica el flush requerido y renómbralo allí.
Resuelve colisiones; si copia o verificación falla, conserva el origen y elimina o aísla el destino parcial.
Verifica el destino antes de borrar el origen
Compara tamaño y digest apropiado, además de owner, mode, tiempos, links, ACL o xattr requeridos. Para árboles usa un manifest completo.
Elimina el origen solo tras aceptar el destino y registra si fue rename o copy-and-remove.
