Microcode (Español)

From ArchWiki
Esta traducción de Microcode fue revisada el 2021-02-12. Si existen cambios puede actualizarla o avisar al equipo de traducción.

Los fabricantes de procesadores lanzan actualizaciones de estabilidad y seguridad para el microcódigo del procesador. Estas actualizaciones proporcionan correcciones de errores que pueden ser críticas para la estabilidad de su sistema. Sin ellas, puede experimentar falsos errores o paradas inesperadas del sistema que pueden ser difíciles de rastrear.

Todos los usuarios con CPU AMD o Intel deben instalar las actualizaciones de microcódigo para garantizar la estabilidad del sistema.

Las actualizaciones de microcódigo generalmente se envían con el firmware de la placa base y se aplican durante la inicialización del firmware. Dado que los OEM podrían no lanzar actualizaciones de firmware de manera oportuna y los sistemas antiguos no reciben nuevas actualizaciones de firmware, se añadió al kernel de Linux la capacidad de aplicar actualizaciones de microcódigo de CPU durante el arranque. El cargador de microcódigo de Linux soporta tres métodos de carga:

  1. Carga temprana actualiza el microcódigo muy pronto durante el arranque, antes de la etapa initramfs, por lo que es el método preferido. Esto es obligatorio para las CPU con errores graves de hardware, como las familias de procesadores Intel Haswell y Broadwell.
  2. Carga tardía actualiza el microcódigo después del arranque, lo que podría ser demasiado tarde ya que la CPU podría haber intentado utilizar un conjunto de instrucciones con errores. Incluso si ya está utilizando la carga temprana, la carga tardía puede usarse para aplicar una actualización de microcódigo más nueva sin necesidad de reiniciar.
  3. Microcódigo incorporado se puede compilar en el kernel que luego se aplica mediante el cargador inicial.

Carga temprana

Instalación

Según el procesador, instale el siguiente paquete:

El cargador de arranque debe cargar el microcódigo. Debido a la gran variabilidad en la configuración de inicio de los usuarios, las actualizaciones de microcódigo pueden no ser activadas automáticamente por la configuración predeterminada de Arch. Muchos kernel de AUR han seguido el camino de los kernels oficiales de Arch en este sentido.

Estas actualizaciones deben activarse añadiendo /boot/amd-ucode.img o /boot/intel-ucode.img como el primer initrd en el archivo de configuración del cargador de arranque. Esto es anterior al archivo initrd normal. Véase a continuación las instrucciones para los cargadores de arranque más comunes.

En las siguientes secciones, reemplace fabricante_de_la_cpu por el fabricante de su CPU, es decir, amd o intel.

Sugerencia: Para Arch Linux en una unidad extraíble que pueda ejecutarse en cualquiera de estos procesadores, instale ambos paquetes y añada ambos archivos de microcódigo como initrd a la configuración del cargador de arranque. Su orden no importa siempre que ambos estén especificados antes de la imagen initramfs.

Configuration

Activar la carga temprana de microcódigo en kernels personalizados

Para que la carga temprana funcione en kernels personalizados, el "Soporte de carga de microcódigo de CPU" debe compilarse en el kernel, "nunca" compilarse como un módulo. Esto activará la opción "Microcódigo de carga temprana" que debe establecerse en Y.

CONFIG_BLK_DEV_INITRD=Y
CONFIG_MICROCODE=y
CONFIG_MICROCODE_INTEL=Y
CONFIG_MICROCODE_AMD=y

GRUB

grub-mkconfig detectará automáticamente la actualización del microcódigo y configurará GRUB de manera apropiada. Después de instalar el paquete de microcódigo, vuelva a generar la configuración de GRUB para activar la carga de la actualización de microcódigo ejecutando:

# grub-mkconfig -o /boot/grub/grub.cfg
Nota: grub-mkconfig no añade las imágenes de microcódigo a la entrada fallback de initramfs. Véase FS#60999.

Alternativamente, los usuarios que administran su archivo de configuración GRUB manualmente pueden añadir /boot/fabricante_de_la_cpu-ucode.img (o /fabricante_de_la_cpu-ucode.img si /boot es una partición separada) como sigue:

/boot/grub/grub.cfg
...
echo 'Cargando ramdisk inicial'
initrd	/boot/fabricante_de_la_cpu-ucode.img /boot/initramfs-linux.img
...

Repítalo para cada entrada del menú.

Dracut

Al generar initramfs con dracut, el microcódigo debe incluirse con el paso de carga temprana de microcódigo.

Verifique la salida de esta orden para comprobar que su sistema esté configurado correctamente:

# dracut --kver x.y.z-arch1-1 /boot/initramfs-linux.img

systemd-boot

Utilice la opción initrd para cargar el microcódigo, antes del ramdisk inicial, de la siguiente manera:

/boot/loader/entries/entrada.conf
title   Arch Linux
linux   /vmlinuz-linux
initrd  /fabricante_de_la_cpu-ucode.img
initrd  /initramfs-linux.img
...

El último microcódigo fabricante_de_la_cpu-ucode.img debe estar disponible durante el arranque en su partición del sistema EFI (ESP). El ESP se debe montar como /boot para que el microcódigo se actualice cada vez que se actualice amd-ucode o intel-ucode. De lo contrario, copie /boot/fabricante_de_la_cpu-ucode.img a su ESP en cada actualización del paquete de microcódigo.

Imágenes de kernel unificadas

ara imágenes de kernel unificadas, primero genere el initrd para integrarlo creando uno nuevo de la siguiente manera:

$ cat /boot/fabricante_de_la_cpu-ucode.img /boot/initramfs-linux.img > mi_nuevo_initrd.img
$ objcopy ... --add-section .initrd=mi_nuevo_initrd .img

EFISTUB

Añada dos opciones initrd=:

initrd=\fabricante_de_la_cpu-ucode.img initrd=\initramfs-linux.img

rEFInd

Edite las opciones de arranque en /boot/refind_linux.conf y añada initrd=/boot/fabricante_de_la_cpu-ucode.img (o initrd=/fabricante_de_la_cpu-ucode.img si /boot está en una partición separada) como el primer initramfs. Por ejemplo:

"Arrancar utilizando las opciones predeterminadas"     "root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rw add_efi_memmap initrd=boot\cpu_manufacturer-ucode.img initrd=boot\initramfs-%v.img"
Sugerencia: Los usuarios que anteriormente no especificaron un parámetro de kernel initrd deberán seguir los pasos descritos en rEFInd#Configuration para permitir el paso de múltiples parámetros initrd.

Los usuarios que empleen estancias manuales en esp/EFI/refind/refind.conf para definir los kernels deben añadir simplemente initrd=/boot/fabricante_de_la_cpu-ucode.img (o /fabricante_de_la_cpu-ucode.img si /boot es una partición separada) según sea necesario para las líneas de opciones, y no en la parte principal de la estancia. Por ejemplo:

options  "root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rw add_efi_memmap initrd=boot\fabricante_de_la_cpu-ucode.img"

Syslinux

Nota: No debe haber espacios entre los archivos initrd fabricante_de_la_cpu-ucode.img y initramfs-linux.img. La línea INITRD debe ser exactamente como se ilustra a continuación.

Los múltiples initrd pueden estar separados por comas en /boot/syslinux/syslinux.cfg:

LABEL arch
    MENU LABEL Arch Linux
    LINUX ../vmlinuz-linux
    INITRD ../fabricante_de_la_cpu-ucode.img,../initramfs-linux.img
...

LILO

LILO y posiblemente otros cargadores de arranque antiguos no admitan varias imágenes initrd. En ese caso, fabricante_de_la_cpu-ucode.img y initramfs-linux.img deberán combinarse en una imagen.

Advertencia: ¡La imagen fusionada debe recrearse después de cada actualización del kernel!
Nota: El orden es importante. La imagen original initramfs-linux.img debe estar después de fabricante_de_la_cpu-ucode.img en la imagen resultante.

Para combinar ambas imágenes en una imagen llamada initramfs-combinada.img, se puede utilizar el siguiente comando:

# cat /boot/fabricante_de_la_cpu-ucode.img /boot/initramfs-linux.img > /boot/initramfs-combinada.img

Ahora, edite /etc/lilo.conf para cargar la nueva imagen.

...
initrd=/boot/initramfs-combinada.img
...

Y ejecute lilo como superusuario (root):

# lilo

Carga tardía

La carga tardía de las actualizaciones de microcódigo ocurre después de que el sistema se haya iniciado. Utiliza archivos en /usr/lib/firmware/amd-ucode/ y /usr/lib/firmware/intel-ucode/.

Para los procesadores AMD, los archivos de actualización de microcódigo son proporcionados por linux-firmware.

Para los procesadores Intel, ningún paquete proporciona los archivos de actualización de microcódigo (FS#59841). Para utilizar la carga tardía, debe extraer manualmente intel-ucode/ del archivo provisto por Intel.

Activar las actualizaciones de microcódigo tardías

A diferencia de la carga temprana, la carga tardía de las actualizaciones de microcódigo en Arch Linux se activa de manera predeterminada utilizando /usr/lib/tmpfiles.d/linux-firmware.conf. Después del arranque, el archivo se analiza mediante systemd-tmpfiles-setup.service(8) y se actualiza el microcódigo de la CPU.

Para recargar manualmente el microcódigo, p.e. tras actualizar los archivos de microcódigo en /usr/lib/firmware/amd-ucode/ o /usr/lib/firmware/intel-ucode/, ejecute:

# echo 1 > /sys/devices/system/cpu/microcode/reload

Esto permite aplicar nuevas actualizaciones de microcódigo sin reiniciar el sistema. Para linux-firmware puede automatizarlo con un hook de pacman, por ejemplo:

/etc/pacman.d/hooks/microcode_reload.hook
[Trigger]
Operation = Upgrade
Type = Path
Target = usr/lib/firmware/amd-ucode/*

[Action]
Description = Aplicando actualizaciones de microcódigo de CPU...
When = PostTransaction
Depends = sh
Exec = /bin/sh -c 'echo 1 > /sys/devices/system/cpu/microcode/reload'

Desactivar las actualizaciones de microcódigo tardías

Para los sistemas AMD, el microcódigo de la CPU se actualizará incluso si amd-ucode no está instalado ya que los archivos en /usr/lib/firmware/amd-ucode/ son provistos por el paquete linux-firmware (FS#59840).

Para máquinas virtuales y contenedores (FS#46591) no es posible actualizar el microcódigo de la CPU, por lo que es posible que quiera desactiva las actualizaciones de microcódigo. Para hacerlo, debe anular el tmpfile /usr/lib/tmpfiles.d/linux-firmware.conf que proporciona linux-firmware. Se puede hacer creando un archivo con el mismo nombre en /etc/tmpfiles.d/:

# ln -s /dev/null /etc/tmpfiles.d/linux-firmware.conf

Comprobar que el microcódigo se actualizó en el arranque

Utilice dmesg para ver si el microcódigo se ha actualizado:

# dmesg | grep microcode

En los sistemas Intel, se debería ver algo similar a lo siguiente en cada inicio, lo que indica que el microcódigo se actualiza muy pronto:

[    0.000000] CPU0 microcode updated early to revision 0x1b, date = 2014-05-29
[    0.221951] CPU1 microcode updated early to revision 0x1b, date = 2014-05-29
[    0.242064] CPU2 microcode updated early to revision 0x1b, date = 2014-05-29
[    0.262349] CPU3 microcode updated early to revision 0x1b, date = 2014-05-29
[    0.507267] microcode: CPU0 sig=0x306a9, pf=0x2, revision=0x1b
[    0.507272] microcode: CPU1 sig=0x306a9, pf=0x2, revision=0x1b
[    0.507276] microcode: CPU2 sig=0x306a9, pf=0x2, revision=0x1b
[    0.507281] microcode: CPU3 sig=0x306a9, pf=0x2, revision=0x1b
[    0.507286] microcode: CPU4 sig=0x306a9, pf=0x2, revision=0x1b
[    0.507292] microcode: CPU5 sig=0x306a9, pf=0x2, revision=0x1b
[    0.507296] microcode: CPU6 sig=0x306a9, pf=0x2, revision=0x1b
[    0.507300] microcode: CPU7 sig=0x306a9, pf=0x2, revision=0x1b
[    0.507335] microcode: Microcode Update Driver: v2.2.
Nota: La fecha mostrada no corresponde a la versión del paquete intel-ucode instalado. Muestra la última vez que Intel actualizó el microcódigo que corresponde al hardware específico que se está actualizando.

Es totalmente posible, particularmente con hardware más nuevo, que no haya una actualización de microcódigo para la CPU. En ese caso, la salida puede verse así:

[    0.292893] microcode: CPU0 sig=0x306c3, pf=0x2, revision=0x1c
[    0.292899] microcode: CPU1 sig=0x306c3, pf=0x2, revision=0x1c
[    0.292906] microcode: CPU2 sig=0x306c3, pf=0x2, revision=0x1c
[    0.292912] microcode: CPU3 sig=0x306c3, pf=0x2, revision=0x1c
[    0.292956] microcode: Microcode Update Driver: v2.2.

En los sistemas AMD que utilizan la carga temprana, la salida se vería así:

[    2.119089] microcode: microcode updated early to new patch_level=0x0700010f
[    2.119157] microcode: CPU0: patch_level=0x0700010f
[    2.119171] microcode: CPU1: patch_level=0x0700010f
[    2.119183] microcode: CPU2: patch_level=0x0700010f
[    2.119189] microcode: CPU3: patch_level=0x0700010f
[    2.119269] microcode: Microcode Update Driver: v2.2.

En los sistemas AMD que utilizan la carga tardía, la salida mostrará la versión del microcódigo anterior antes de volver a cargar el microcódigo y el nuevo una vez que se vuelva a cargar. Se vería algo como esto:

[    2.112919] microcode: CPU0: patch_level=0x0700010b
[    2.112931] microcode: CPU1: patch_level=0x0700010b
[    2.112940] microcode: CPU2: patch_level=0x0700010b
[    2.112951] microcode: CPU3: patch_level=0x0700010b
[    2.113043] microcode: Microcode Update Driver: v2.2.
[    6.429109] microcode: CPU2: new patch_level=0x0700010f
[    6.430416] microcode: CPU0: new patch_level=0x0700010f
[    6.431722] microcode: CPU1: new patch_level=0x0700010f
[    6.433029] microcode: CPU3: new patch_level=0x0700010f
[    6.433073] x86/CPU: CPU features have changed after loading microcode, but might not take effect.

Cuales CPU aceptan actualizaciones de microcódigo

Los usuarios pueden consultar a Intel o AMD en los siguientes enlaces para ver si un modelo en particular es compatible:

Detectar actualización de microcódigo disponible

Es posible averiguar si intel-ucode.img contiene una imagen de microcódigo para la CPU en ejecución con iucode-tool.

  1. Instale intel-ucode (no es necesario cambiar initrd para la detección)
  2. Instale iucode-tool
  3. Cargue el módulo del nkernel cpuid:
    # modprobe cpuid
  4. Extraiga la imagen de microcódigo y busque su cpuid:
    # bsdtar -Oxf /boot/intel-ucode.img | iucode_tool -tb -lS -
  5. Si hay una actualización disponible, debería aparecer debajo de selected microcodes
  6. Es posible que el microcódigo ya esté en la BIOS de su proveedor y no aparezca cargando en dmesg. Compárelo con el microcódigo actual ejecutando grep microcode /proc/cpuinfo

Véase también