Microcode: Unterschied zwischen den Versionen

Aus wiki.archlinux.de
(→‎Gummiboot: systemd-boot)
(Umstellung auf hook microcode)
 
(6 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
{{unvollständig}}
Einige Prozessoren erlauben es, den Firmware-Code (oder auch Microcode genannt) beim Systemstart zu überschreiben, so dass ohne ein BIOS-Update eventuelle Firmware-Fehler zur Laufzeit beseitigt werden können.
 
Einige Prozessoren erlauben es, den Firmware-Code (oder auch Microcode genannt) beim Systemstart zu überschreiben, so dass ohne ein BIOS-Update eventuelle Firmware-Fehler beseitigt werden können.
Das Überschreiben gilt aber nur bis zum Ausschalten des Computers (es ist reversibel), so dass danach wieder der ursprüngliche Code vorhanden ist.
Das Überschreiben gilt aber nur bis zum Ausschalten des Computers (es ist reversibel), so dass danach wieder der ursprüngliche Code vorhanden ist.


Zeile 7: Zeile 5:
Eine Liste mit unterstützten Modellen gibt es sowohl von [http://downloadcenter.intel.com/Detail_Desc.aspx?agr=Y&DwnldID=21925&keyword=%22microcode%22&lang=eng Intel] als auch von [http://www.amd64.org/microcode.html AMD].
Eine Liste mit unterstützten Modellen gibt es sowohl von [http://downloadcenter.intel.com/Detail_Desc.aspx?agr=Y&DwnldID=21925&keyword=%22microcode%22&lang=eng Intel] als auch von [http://www.amd64.org/microcode.html AMD].


== Microcode-Updates aktivieren ==
== Microcode Installieren ==
Für AMD-Prozessoren befindet sich alles Nötige in dem Paket {{Paket|linux-firmware}}, welches bereits installiert sein sollte.
Für AMD-Prozessoren wird das {{Paket|amd-ucode}}, für Intel-CPUs das Paket {{Paket|intel-ucode}} installiert.


Intel-Benutzer müssen das Paket {{Paket|intel-ucode}} installieren.
== Microcode Aktivieren  ==
In der Datei /etc/mkinitcpio.conf wird in der Zeile HOOKS=(base udev {{ic|microcode}}... eingefügt.
Anschließend wird mit dem Befehl:
mkinitcpio -p linux
eine neue /boot/initramfs-linux.img und /boot/initramfs-linux-fallback.img Datei erzeugt.
{{Hinweis|Seit der Umstellung auf den hook microcode am 5.3.2024 ist der Microcode in diesen Dateien integriert. Eine separate Anführung eines ucode.img im jeweiligen Bootloader entfällt damit.}}


== Aktivieren von Intel Microcode-Updates ==
== Feststellen, ob Microcode-Updates vorgenommen wurden ==
{{Achtung|Seit der Kernelversion ''linux 3.17-2'' bzw. ''linux-lts 3.14.21-2'' werden Intel Microcode-Updates nicht mehr automatisch angesteuert und müssen manuell aktiviert werden.}}
Möchte man überprüfen, ob beim Booten des Systems ein Microcode-Update stattgefunden hat, so kann einen ersten Test mittels
Die Updates werden durch Hinzufügen von {{ic|/boot/intel-ucode.img}} als ersten initrd-Befehl in der Bootloader-Konfiguration erreicht.
journalctl -k --grep microcode
=== Beispiele ===
durchführen.
==== EFI Stub Kernel ====
Im Falle von Intelprozessoren mit erfolgreichem Early Loading erhält man etwa folgendes (hier ein Lenovo Thinkpad T480s):
Man fügt zwei initrd-Befehle hinzu:
Sep 04 15:31:40 darkstar kernel: microcode: microcode updated early to revision 0xb4, date = 2019-04-01
  initrd=/intel-ucode.img initrd=/initramfs-linux.img
Sep 04 15:31:40 darkstar kernel: microcode: sig=0x806ea, pf=0x80, revision=0xb4
==== systemd-boot (ehemals Gummiboot) ====
Sep 04 15:31:40 darkstar kernel: microcode: Microcode Update Driver: v2.2.
Man benutzt die {{ic|initrd}}-Option '''zweimal''' in dem unter {{ic|/boot/loader/entries/}} für Arch Linux vorgesehenen Eintrag:
Findet kein Microcode-Update statt, sieht die Ausgaben wir folgt aus (hier das selbe Lenovo Thinkpad T480s):
  title  Arch Linux
Jul 30 10:21:06 darkstar kernel: SRBDS: Mitigation: Microcode
  linux  /vmlinuz-linux
  Jul 30 10:21:06 darkstar kernel: microcode: sig=0x806ea, pf=0x80, revision=0xd6
  initrd  /intel-ucode.img
Jul 30 10:21:06 darkstar kernel: microcode: Microcode Update Driver: v2.2.
  initrd  /initramfs-linux.img
Ein negatives Ergebnis muß nicht auf eine Fehlkonfiguration zurückzuführen sein. Es kann auch bedeuten, daß das BIOS bereits die neueste Firmware enthält. Im Falle des exemplarisch verwendeten T480s war dies nach einem BIOS-Update der Fall.
options ...
Möchte man sichergehen, daß die neueste Firmwareversion geladen ist, geht man wie folgt vor:
* Installation von iucode-tool:
  # pacman -S iucode-tool
* Laden des cpuid Kernelmoduls:
  # modprobe cpuid
* Bestimmung der neuesten Firmware-Revision für die vorhandene CPU:
  # bsdtar -Oxf /boot/intel-ucode.img | iucode_tool -tb -lS -
* Prüfen, ob diese tatsächlich verwendet wird:
  grep microcode /proc/cpuinfo


==== Grub ====
Bisher hat das Arch Linux Entwickler-Team noch nicht entschieden, wie es mit Microcode-Updates bei Grub verfahren möchte (s. a. im Bug [https://bugs.archlinux.org/task/42354 FS#42354]). Bis dahin kann man sich mit zwei Notlösungen verhelfen.
===== Möglichkeit 1: Editieren der grub.conf =====
Man editiert die Datei {{ic|/etc/grub.conf}} und fügt zu jedem dort gelisteten Eintrag entweder {{ic|/intel-ucode.img}}, falls man eine extra Boot-Partition besitzt, oder {{ic|/boot/intel-ucode.img}}, falls man keine spezielle Boot-Partition verwendet, hinzu.
[...]
echo 'Loading initial ramdisk ...'
initrd /intel-ucode.img /initramfs-linux.img
[...]
{{Achtung|Mit jedem Update von GRUB wird diese Datei überschrieben, so dass anschließend die Änderungen erneut vorgenommen werden müssen.}}
===== Möglichkeit 2: Editieren der /etc/grub.d/10_linux =====
Man bearbeitet die Datei {{ic|/etc/grub.d/10_linux}}, von der aus die grub.conf erstellt wird, und fügt die mit + beginnenden Zeilen hinzu. Anschließend entfernt man die mit - beginnenden Zeilen:
    if test -n "${initrd}" ; then
+    if test -f "${dirname}/intel-ucode.img"; then
+        ucode="${rel_dirname}/intel-ucode.img"
+    else
+        ucode=
+    fi
      # TRANSLATORS: ramdisk isn't identifier. Should be translated.
      message="$(gettext_printf "Loading initial ramdisk ...")"
      sed "s/^/$submenu_indentation/" << EOF
  echo '$(echo "$message" | grub_quote)'
- initrd ${rel_dirname}/${initrd}
+ initrd ${ucode} ${rel_dirname}/${initrd}
  EOF
Anschließend generiert man die grub.conf neu:
# grub-mkconfig -o /boot/grub/grub.cfg
{{Hinweis|Bei dieser Methode kann es dazu kommen, dass eventuelle GRUB-Updates nicht richtig installiert werden}}
==== Syslinux ====
Man kann hier verschiedene initrd-Einträge durch Kommata trennen. Dazu bearbeitet man die Datei {{ic|/boot/syslinux/syslinux.cfg}}:
LABEL arch
    MENU LABEL Arch Linux
    LINUX ../vmlinuz-linux
    INITRD ../intel-ucode.img,../initramfs-linux.img
    APPEND ...
== Feststellen, ob Microcode-Updates vorgenommen wurden ==
Möchte man nun überprüfen, ob beim Booten des Systems ein Microcode-Update stattgefunden hat, so kann man dies durch Eingabe von {{ic|dmesg | grep microcode}} tun.
Ein positives Ergebnis bei einem Intel-Prozessor sollte wie folgt aussehen:
[    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.00 <tigran@aivazian.fsnet.co.uk>, Peter Oruba
Verwendet man neuere Hardware, kann es vorkommen, dass trotz richtiger Konfiguration kein Microcode-Update vorgenommen wurde, da der Prozessor bereits auf dem neusten Stand ist. In diesem Fall erhält man eine solche Ausgabe:
[    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.00 <tigran@aivazian.fsnet.co.uk>, Peter Oruba
Bei AMD-Prozessoren findet das Microcode-Update erst etwas später im Bootprozess statt. Deshalb erhält man ein Ergebnis wie dieses:
Bei AMD-Prozessoren findet das Microcode-Update erst etwas später im Bootprozess statt. Deshalb erhält man ein Ergebnis wie dieses:
  [    0.807879] microcode: CPU0: patch_level=0x01000098
  Jul 30 21:59:24 darkstar kernel: microcode: CPU0: patch_level=0x010000c8
  [    0.807888] microcode: CPU1: patch_level=0x01000098
  Jul 30 21:59:24 darkstar kernel: microcode: CPU1: patch_level=0x010000c8
  [    0.807983] microcode: Microcode Update Driver: v2.00 <tigran@aivazian.fsnet.co.uk>, Peter Oruba
  Jul 30 21:59:24 darkstar kernel: microcode: CPU2: patch_level=0x010000c8
  [  16.150642] microcode: CPU0: new patch_level=0x010000c7
  Jul 30 21:59:24 darkstar kernel: microcode: CPU3: patch_level=0x010000c8
  [  16.150682] microcode: CPU1: new patch_level=0x010000c7
  Jul 30 21:59:24 darkstar kernel: microcode: Microcode Update Driver: v2.2.
 
[[Kategorie:Hardware]]
[[Kategorie:Hardware]]
[[en:Microcode]]
[[en:Microcode]]

Aktuelle Version vom 6. März 2024, 01:03 Uhr

Einige Prozessoren erlauben es, den Firmware-Code (oder auch Microcode genannt) beim Systemstart zu überschreiben, so dass ohne ein BIOS-Update eventuelle Firmware-Fehler zur Laufzeit beseitigt werden können. Das Überschreiben gilt aber nur bis zum Ausschalten des Computers (es ist reversibel), so dass danach wieder der ursprüngliche Code vorhanden ist.

Unterstützte Prozessoren

Eine Liste mit unterstützten Modellen gibt es sowohl von Intel als auch von AMD.

Microcode Installieren

Für AMD-Prozessoren wird das amd-ucode, für Intel-CPUs das Paket intel-ucode installiert.

Microcode Aktivieren

In der Datei /etc/mkinitcpio.conf wird in der Zeile HOOKS=(base udev microcode... eingefügt. Anschließend wird mit dem Befehl:

mkinitcpio -p linux

eine neue /boot/initramfs-linux.img und /boot/initramfs-linux-fallback.img Datei erzeugt.

Hinweis: Seit der Umstellung auf den hook microcode am 5.3.2024 ist der Microcode in diesen Dateien integriert. Eine separate Anführung eines ucode.img im jeweiligen Bootloader entfällt damit.

Feststellen, ob Microcode-Updates vorgenommen wurden

Möchte man überprüfen, ob beim Booten des Systems ein Microcode-Update stattgefunden hat, so kann einen ersten Test mittels

journalctl -k --grep microcode

durchführen. Im Falle von Intelprozessoren mit erfolgreichem Early Loading erhält man etwa folgendes (hier ein Lenovo Thinkpad T480s):

Sep 04 15:31:40 darkstar kernel: microcode: microcode updated early to revision 0xb4, date = 2019-04-01
Sep 04 15:31:40 darkstar kernel: microcode: sig=0x806ea, pf=0x80, revision=0xb4
Sep 04 15:31:40 darkstar kernel: microcode: Microcode Update Driver: v2.2.

Findet kein Microcode-Update statt, sieht die Ausgaben wir folgt aus (hier das selbe Lenovo Thinkpad T480s):

Jul 30 10:21:06 darkstar kernel: SRBDS: Mitigation: Microcode
Jul 30 10:21:06 darkstar kernel: microcode: sig=0x806ea, pf=0x80, revision=0xd6
Jul 30 10:21:06 darkstar kernel: microcode: Microcode Update Driver: v2.2.

Ein negatives Ergebnis muß nicht auf eine Fehlkonfiguration zurückzuführen sein. Es kann auch bedeuten, daß das BIOS bereits die neueste Firmware enthält. Im Falle des exemplarisch verwendeten T480s war dies nach einem BIOS-Update der Fall. Möchte man sichergehen, daß die neueste Firmwareversion geladen ist, geht man wie folgt vor:

  • Installation von iucode-tool:
# pacman -S iucode-tool
  • Laden des cpuid Kernelmoduls:
# modprobe cpuid
  • Bestimmung der neuesten Firmware-Revision für die vorhandene CPU:
# bsdtar -Oxf /boot/intel-ucode.img | iucode_tool -tb -lS -
  • Prüfen, ob diese tatsächlich verwendet wird:
grep microcode /proc/cpuinfo

Bei AMD-Prozessoren findet das Microcode-Update erst etwas später im Bootprozess statt. Deshalb erhält man ein Ergebnis wie dieses:

Jul 30 21:59:24 darkstar kernel: microcode: CPU0: patch_level=0x010000c8
Jul 30 21:59:24 darkstar kernel: microcode: CPU1: patch_level=0x010000c8
Jul 30 21:59:24 darkstar kernel: microcode: CPU2: patch_level=0x010000c8
Jul 30 21:59:24 darkstar kernel: microcode: CPU3: patch_level=0x010000c8
Jul 30 21:59:24 darkstar kernel: microcode: Microcode Update Driver: v2.2.