Actualización de Firmware con fwupd en Linux
fwupd es la solución estándar en Linux para actualizar el firmware de dispositivos de hardware, incluyendo BIOS/UEFI, controladores de almacenamiento, firmware de SSDs y otros componentes, a través del repositorio LVFS (Linux Vendor Firmware Service). Esta guía cubre el descubrimiento de dispositivos, la verificación de actualizaciones, las actualizaciones de BIOS/UEFI y los procedimientos de reversión.
Requisitos Previos
- Ubuntu 20.04/22.04 o Fedora 34+, Debian 11+ (fwupd tiene mejor soporte en estas distribuciones)
- Sistema UEFI (requerido para actualizaciones de BIOS/UEFI)
- Acceso root
- Conexión a internet para descargar actualizaciones desde LVFS
- Para servidores: verificar que el fabricante soporta LVFS (Dell, Lenovo, HP tienen buen soporte)
# Verificar que el sistema usa UEFI (no BIOS legacy)
ls /sys/firmware/efi && echo "Sistema UEFI: OK" || echo "Sistema BIOS legacy: fwupd limitado"
Instalación de fwupd
# Ubuntu/Debian
apt update
apt install -y fwupd fwupd-signed
# Fedora/CentOS/Rocky Linux
dnf install -y fwupd
# Verificar la instalación
fwupdmgr --version
# Habilitar el servicio fwupd
systemctl enable fwupd
systemctl start fwupd
# Verificar el estado del servicio
systemctl status fwupd
Descubrimiento de Dispositivos
# Listar todos los dispositivos detectados por fwupd
fwupdmgr get-devices
# Salida típica:
# ThinkPad X1 Carbon 7th
# │ DeviceId: ...
# │ Summary: System Firmware
# │ Current version: N2WET42W
# │ Vendor: Lenovo
# │ Protocol: org.uefi.capsule
# │ Flags: internal|updatable|require-ac|registered
# │
# ├─ Dell Universal Dock D6000
# │ Firmware: 01.00.06
# │ Vendor: Dell Inc.
# ...
# Ver solo dispositivos que pueden ser actualizados
fwupdmgr get-devices --filter updatable
# Ver información detallada de un dispositivo específico
fwupdmgr get-devices --json | python3 -m json.tool | head -100
# Ver los dispositivos con su estado de actualización
fwupdmgr get-topology
Verificación de Actualizaciones
# Actualizar la base de datos de firmware desde LVFS
fwupdmgr refresh
# Verificar las actualizaciones disponibles
fwupdmgr get-updates
# Salida cuando hay actualizaciones:
# Devices with available firmware updates:
# ════════════════════════════════════════
# ThinkPad X1 Carbon
# New version: N2WET45W
# Remote: lvfs
# Summary: Lenovo ThinkPad X1 Carbon 7th Gen System Firmware
# Ver el historial de actualizaciones realizadas
fwupdmgr get-history
# Ver las actualizaciones con información de seguridad (CVE)
fwupdmgr get-updates --verbose
# Obtener información en formato JSON para automatización
fwupdmgr get-updates --json 2>/dev/null | python3 -m json.tool
Actualización de Firmware
# Actualizar TODOS los dispositivos con actualizaciones disponibles
# (recomendado revisar primero con get-updates)
fwupdmgr update
# Actualizar un dispositivo específico por su GUID o ID
# Ver el GUID con: fwupdmgr get-devices | grep "DeviceId"
fwupdmgr update <DEVICE-ID>
# Actualizar sin confirmación (útil en scripts)
fwupdmgr update --assume-yes
# Actualizar desde un archivo local (firmware descargado manualmente)
fwupdmgr install /ruta/al/firmware.cab
# Simular la actualización sin aplicarla (verificar compatibilidad)
fwupdmgr update --no-reboot-check 2>&1 | grep -E "Firmware|Skipping"
# En servidores con muchos dispositivos, actualizar de uno en uno
# para mejor control y posibilidad de revertir
for DEVICE_ID in $(fwupdmgr get-updates --json 2>/dev/null | \
python3 -c "import json,sys; [print(d['DeviceId']) for d in json.load(sys.stdin).get('Devices', [])]"); do
echo "Actualizando: $DEVICE_ID"
fwupdmgr update $DEVICE_ID --assume-yes
done
Actualizaciones de BIOS y UEFI
Las actualizaciones de BIOS/UEFI requieren reinicio y son las más críticas:
# Ver si hay actualización de BIOS disponible
fwupdmgr get-updates | grep -i "System Firmware\|BIOS\|UEFI"
# Antes de actualizar el BIOS, verificar que la batería (laptops) está >20%
# o que el servidor está conectado a UPS o corriente continua
# Crear un punto de restauración/snapshot antes de actualizar el BIOS
# (en VMs o sistemas con soporte de snapshots)
# Iniciar la actualización del BIOS/UEFI
# fwupd encapsula el firmware en una cápsula UEFI que se aplica en el próximo arranque
fwupdmgr update --allow-reinstall
# Después del comando, el sistema necesita reiniciarse
# La actualización del BIOS ocurre ANTES de que arranque el OS
# Programar el reinicio para una ventana de mantenimiento
shutdown -r +10 "Reiniciando para actualización de firmware BIOS"
# Cancelar el reinicio programado si es necesario
shutdown -c
# Verificar que la actualización se aplicó correctamente después del reinicio
fwupdmgr get-history | head -20
dmidecode -s bios-version
Gestión de cápsulas UEFI:
# Ver las cápsulas UEFI programadas para el próximo arranque
ls /sys/firmware/efi/efivars/ | grep fwupd
# Ver el estado de la actualización UEFI
efibootmgr -v | grep -i fwupd
# Limpiar cápsulas pendientes (cancela la actualización antes del reinicio)
fwupdmgr clear-results
Integración con LVFS
LVFS (Linux Vendor Firmware Service) es el repositorio centralizado de firmware:
# Ver los repositorios remotos configurados
fwupdmgr get-remotes
# Remotes disponibles:
# lvfs - Estable (producción)
# lvfs-testing - Beta (en pruebas, puede tener bugs)
# Habilitar el repositorio de testing (solo para pruebas, NO para producción)
fwupdmgr enable-remote lvfs-testing
# Volver al repositorio estable
fwupdmgr disable-remote lvfs-testing
# Verificar la firma digital de un archivo de firmware descargado
fwupdmgr verify
# Añadir un repositorio privado (para firmware corporativo personalizado)
cat << 'EOF' > /etc/fwupd/remotes.d/empresa-privado.conf
[fwupd Remote]
Enabled=true
Title=Firmware Corporativo Empresa
MetadataURI=https://firmware.empresa.com/lvfs/metadata.xml
FirmwareBaseURI=https://firmware.empresa.com/
Keyring=gpg
EOF
# Actualizar para incluir el nuevo repositorio
fwupdmgr refresh --force
Actualizaciones Automatizadas
# Configurar actualizaciones automáticas de firmware
# Editar la configuración de fwupd
cat << 'EOF' > /etc/fwupd/daemon.conf
[fwupd]
# Actualizar automáticamente el firmware cuando esté disponible
UpdateMotd=true
OnlyTrusted=true
ShowDevicePrivate=false
# Tiempo de espera para las actualizaciones automáticas (en segundos)
IdleTimeout=7200
EOF
# Script para actualización automática con notificación
cat << 'EOF' > /usr/local/bin/auto-firmware-update.sh
#!/bin/bash
# Script de actualización automática de firmware con log y notificaciones
LOG="/var/log/firmware-updates.log"
EMAIL="[email protected]"
HOSTNAME=$(hostname)
echo "$(date): Verificando actualizaciones de firmware en ${HOSTNAME}" >> $LOG
# Actualizar la base de datos de firmware
fwupdmgr refresh >> $LOG 2>&1
# Verificar si hay actualizaciones disponibles
ACTUALIZACIONES=$(fwupdmgr get-updates 2>/dev/null)
if echo "$ACTUALIZACIONES" | grep -q "DeviceId"; then
echo "$(date): Actualizaciones disponibles:" >> $LOG
echo "$ACTUALIZACIONES" >> $LOG
# Notificar al administrador sobre las actualizaciones disponibles
echo "Hay actualizaciones de firmware disponibles en ${HOSTNAME}:
${ACTUALIZACIONES}
Para aplicar: ssh root@${HOSTNAME} 'fwupdmgr update'" | \
mail -s "[Firmware] Actualizaciones disponibles en ${HOSTNAME}" "$EMAIL"
else
echo "$(date): No hay actualizaciones de firmware disponibles" >> $LOG
fi
EOF
chmod +x /usr/local/bin/auto-firmware-update.sh
# Ejecutar la verificación semanalmente
cat << 'EOF' > /etc/cron.d/firmware-check
# Verificar actualizaciones de firmware cada lunes a las 6:00 AM
0 6 * * 1 root /usr/local/bin/auto-firmware-update.sh
EOF
Solución de Problemas
# Error "No supported devices found"
# Verificar que el sistema soporta UEFI
ls /sys/firmware/efi
# Verificar los plugins habilitados
fwupdmgr get-plugins
# Ver los logs detallados del servicio fwupd
journalctl -u fwupd -f
# Activar logging detallado
fwupdmgr --verbose get-devices
# Error "Failed to load daemon"
systemctl restart fwupd
journalctl -u fwupd -n 50
# Problemas de firma GPG de los archivos de firmware
# Actualizar la base de datos de claves GPG
fwupdmgr refresh --force
# El dispositivo aparece pero no puede actualizarse
fwupdmgr get-devices | grep -A 10 "tu-dispositivo"
# Buscar la razón en los Flags: "blocked", "needs-shutdown", "requires-ac"
# Revertir una actualización de firmware fallida
fwupdmgr get-history # Ver el ID del firmware anterior
# La reversión depende del dispositivo y puede no estar disponible para BIOS
fwupdmgr downgrade
# Verificar la integridad del firmware instalado
fwupdmgr verify-update
Conclusión
fwupd ha simplificado drásticamente la gestión de firmware en Linux, proporcionando una interfaz unificada para actualizar componentes de hardware que anteriormente requerían herramientas específicas del fabricante o reinicios con USB booteables. Mantener el firmware actualizado es esencial para la seguridad (muchas vulnerabilidades críticas se parchean vía firmware) y para la estabilidad del hardware. En entornos de producción, se recomienda probar las actualizaciones en sistemas de staging antes de aplicarlas en producción, especialmente las actualizaciones de BIOS que pueden afectar a la estabilidad del servidor.


