Cuando administras una flota de servidores bare-metal, cada minuto de arranque cuenta. Pero, ¿qué pasa cuando una actualización de firmware rutinaria convierte un arranque de 3 minutos en una odisea de 4 horas? Esto es exactamente lo que pasó en los centros de datos centrales de Cloudflare, y la historia de cómo lo corregimos es una clase magistral sobre los internals de UEFI, protocolos de arranque de red y automatización.
En este análisis profundo, te guiaré por los síntomas, la causa raíz y la solución paso a paso que implementamos. Aprenderás por qué una búsqueda lineal a través de interfaces de arranque puede paralizar tu infraestructura, y cómo un orden de arranque declarativo combinado con scripts de iPXE puede ahorrarte horas.

El Culpable Oculto: Una Búsqueda Lineal por la Interfaz de Arranque Correcta
Nuestros servidores normalmente usan iPXE, un firmware de arranque de red de código abierto, para iniciar sus sistemas operativos. iPXE es genial porque soporta HTTP/HTTPS, haciendo el proceso más rápido y confiable que el PXE tradicional. Sin embargo, después de una actualización de firmware, algunos servidores empezaron a tardar horas en arrancar.
Abrimos la consola serie y vimos un ciclo de arranque en tiempo real. El POST del firmware se completó normalmente, pero luego el servidor se quedó esperando. La consola reveló el problema: estaba intentando un arranque HTTPS IPv4 (timeout), luego iPXE IPv4 (timeout), repitiendo estos, y finalmente alcanzaba el arranque HTTPS IPv6 que funcionaba. Cada timeout quemaba unos 5 minutos, y con cuatro intentos, son 20 minutos por arranque. Para actualizaciones de firmware que requieren múltiples reinicios, esto se acumuló a casi 4 horas.
La Solución: Declara tu Interfaz de Arranque, No la Busques
La causa raíz era clara: el servidor estaba probando ciegamente todas las interfaces de arranque disponibles. ¿La solución? Declara el orden de arranque correcto desde el principio, para que el sistema nunca pierda tiempo con interfaces que no responderán.
Pero implementar esto fue complicado. Enfrentamos tres obstáculos:
- Soporte Legado y Persistencia: El orden de arranque no es soportado en versiones antiguas de UEFI, y las configuraciones se resetean después de una actualización de firmware.
- Bloqueo del Proveedor: El UEFI tenía una configuración inmutable (
Force Priority Httpv4 Httpv6 Pxev4 Pxev6) que impedía cambios. Necesitamos una nueva versión de BIOS. - Inconsistencia de Strings: Diferentes proveedores de NIC usaban strings diferentes (ej.:
HTTPS IPv4 Ethernet Network Adapter XXX-XXX-Y for OCP 3.0 P1vs.HTTPS IPv4 Network Adapter - 50:00:E6:8F:4F:32 P1).
Para solucionar el problema de strings, añadimos coincidencia con comodines a nuestra herramienta CfHIIConfig_App, usando patrones como .*HTTP.*IPv4.*P1. También implementamos un flag booleano (uefi-same-hex) para evitar imprimir y comparar variables, reduciendo aún más el tiempo de arranque.
Aquí tienes un fragmento del script iPXE que verifica cambios y dispara un reinicio si es necesario:
# construye la ruta para leer la variable de actualización
set buffer-var-guid 91468514-75bc-4bb5-8f33-91efff9e9b1f
set var-upd-path efivar/CfHIIVarUpd-${buffer-var-guid}
# Ejecuta el comando de cambio de configuración
imgexecset ${uefi-setting}=${uefi-value}
# Compara la variable de actualización con el valor esperado
# Si ha cambiado, define la variable local para reiniciar el sistema
iseq ${uefi-same-hex} ${${var-upd-path}} || set has-changed ${uefi-diff-hex}
Este script ahora es parte de nuestra automatización de arranque, asegurando que después de cualquier actualización de firmware, el orden de arranque sea validado y reaplicado si es necesario.

Los Resultados: Un Sistema de Arranque Dinámico y Autocurativo
Al eliminar la adivinanza, convertimos una odisea de 4 horas en un proceso de 3 minutos. Aquí está el impacto:
| Métrica | Antes del Cambio de Orden | Después del Cambio de Orden |
|---|---|---|
| Automatización de Actualización de Firmware | Casi 4 horas | 3 minutos |
| Arranque Único Subsecuente | Alrededor de 20 minutos | Menos de 1 minuto |
Pero esto no fue solo sobre velocidad. Hizo nuestro sistema más dinámico y resiliente. Ahora usamos una sola imagen de BIOS para todos los SKUs, desplegamos actualizaciones de configuración a escala a través de nuestro pipeline de release, y todo el flujo de trabajo opera desde iPXE sin interacciones manuales de BIOS.
Limitaciones y Consideraciones
Aunque esta solución funciona de maravilla para nuestra flota, no está exenta de advertencias:
- Dependencia del Proveedor: Tuvimos que trabajar estrechamente con los OEMs para desbloquear el control del orden de arranque, lo que puede no ser posible con todo hardware.
- Complejidad: Implementar coincidencia con comodines y validación de estado añade complejidad a tus scripts de automatización.
- No es una Bala de Plata: Si tu problema de tiempo de arranque viene de latencia de red o mala configuración de DHCP, esto no ayudará.
Próximos Pasos para tu Infraestructura
Si administras servidores bare-metal y enfrentas problemas similares de tiempo de arranque, aquí está lo que recomiendo:
- Audita tu secuencia de arranque — Usa logs de consola serie para identificar patrones de timeout.
- Declara tu orden de arranque — Trabaja con tu proveedor para habilitar control programático.
- Automatiza la validación — Implementa una verificación de estado para reaplicar la configuración después de actualizaciones de firmware.
Para un análisis más profundo de iPXE y automatización de arranque de red, revisa la documentación oficial de iPXE. Y si te interesa cómo Vercel maneja desafíos de infraestructura similares con microfrontends, hemos cubierto las actualizaciones de enrutamiento de Vercel y feature flags JSON en otros posts.

Conclusión
Nuestro viaje de arranques de 4 horas a 3 minutos fue una inmersión profunda en los internals de UEFI, colaboración con proveedores y herramientas de código abierto como iPXE. Nos enseñó que a veces las mayores victorias de rendimiento vienen de eliminar trabajo innecesario—como una búsqueda lineal a través de todas las interfaces de arranque posibles.
Si enfrentas desafíos similares, recuerda: no aceptes arranques lentos. Investiga la causa raíz, declara tus interfaces de arranque y automatiza la validación. Tu infraestructura te lo agradecerá.
Para más ideas sobre optimizar tu flujo de trabajo de desarrollo, revisa nuestros posts relacionados sobre enrutamiento de microfrontends de Vercel y feature flags basados en JSON. ¡Feliz arranque!