Microcode (Español)

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:
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.
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.
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:
amd-ucode
para procesadores AMD,
intel-ucode
para procesadores Intel.
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:
Centro de Investigación de Sistemas Operativos de AMD
[
enlace roto
2023-06-17]
.
Centro de descarga de Intel
[
enlace roto
2023-07-30]
.
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
.
Instale
intel-ucode
(no es necesario cambiar initrd para la detección)
Instale
iucode-tool
Cargue el módulo del nkernel
cpuid
:
# modprobe cpuid
Extraiga la imagen de microcódigo y busque su cpuid:
# bsdtar -Oxf /boot/intel-ucode.img | iucode_tool -tb -lS -
Si hay una actualización disponible, debería aparecer debajo de
selected microcodes
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
Actualización de microcódigos - Experiencias en la comunidad
Notas sobre actualizaciones de microcódigo de Intel – Ben Hawkes
Cargador de microcódigo del kernel - documentación del kernel
Errata encontrada en Haswell/Broadwell – AnandTech
Proyecto iucode-tool en GitLab