Microcode (Español)
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
.
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
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"
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
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.
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.
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 2019-07-01].
- Centro de descarga de Intel.
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