Hlavní navigace

Aktualizujeme mikrokód procesoru Intel a AMD z Linuxu

Petr Krčmář

Čerstvě objevená chyba v nových procesorech Intel přivedla mnoho uživatelů k otázce, jak aktualizovat mikrokód na opravenou verzi. Ukážeme si celý postup aktualizace, kterou provedeme přímo z Linuxu.

Mikrokód bychom mohli stručně popsat jako firmware uvnitř procesoru. Vytváří rozhraní mezi instrukcemi strojového kódu a samotnou nízkoúrovňovou architekturou uvnitř procesoru. Umožňuje například vytvářet komplexnější instrukce bez nutnosti velmi složitého zapojení v hardware nebo dovoluje emulovat architekturu, kterou procesor ve skutečnosti neobsahuje. Další výhodou tohoto přístupu je, že je možné záplatovat chybu uvnitř procesoru. Čerstvě objevený bug v implementaci hyperthreadingu nových procesorů Intel z rodiny Skylake a Kaby Lake je možné opravit právě pomocí aktualizace mikrokódu.

O aktualizaci mikrokódu by se měl za normálních okolností postarat BIOS, ovšem tady záleží na výrobci desky, kdy a zda vůbec dodá uživateli novou verzi obsahující upravený mikrokód procesoru. Abychom se nemuseli na výrobce spoléhat, má i linuxové jádro zabudovanou podporu pro aktualizaci mikrokódu při startu. Právě tímto procesem se budeme zabývat. Přesto je dobré se podívat, zda není pro váš počítač k dispozici aktuální BIOS. Jeho instalací můžete vyřešit další problémy, které nutně nesouvisí s mikrokódem procesoru.

Následující postup je demonstrován na procesorech Intel, stejně je ale možné postupovat v případě AMD. S nimi má ale autor tohoto článku pramalé zkušenosti. V Debianu ovšem vedle balíčku intel-microcode naleznete také amd64-microcode, který by se měl chovat úplně stejně.

Zjišťujeme informace

V první řadě musíme zjistit o svém hardware několik informací: rodinu procesorů, právě používanou verzi mikrokódu a pokud řešíme výše zmíněnou chybu, pak chceme i vědět, jestli má náš procesor zapnutý hyperthreading. Začneme zjištěním posledního jmenovaného. Budeme potřebovat utilitu dmidecode, která se obvykle nachází ve stejnojmenném balíčku:

# dmidecode -t processor | grep HTT
  HTT (Multi-threading)

V tomto případě je hyperthreading přítomen a BIOS tvrdí, že je zapnutý. Procesor má skutečně dvě fyzická jádra a Linux jich vidí dvakrát tolik:

# grep processor /proc/cpuinfo
processor   : 0
processor   : 1
processor   : 2
processor   : 3

Nyní je čas zjistit, jakou verzi procesoru v počítači máme:

# grep name /proc/cpuinfo
model name  : Intel(R) Core(TM) i5-3337U CPU @ 1.80GHz
…

Navštívíme web Intelu s informacemi o produktech: ark.intel.com. Nahoře do vyhledávání můžeme vložit označení procesoru (i5–3337U) a velmi rychle tak vyhledáme detailní informace. O tomto konkrétním procesoru se dozvíme, že skutečně podporuje hyperthreading, má dvě fyzická jádra a je ze starší rodiny Ivy Bridge.

Zbývá poslední informace, současná verze použitého mikrokódu. Prozradí ho obsah souboru /proc/cpuinfo nebo si jej přečteme z bootovacího logu. Vyberte si svou oblíbenou variantu.

# grep microc /proc/cpuinfo
microcode   : 0x15
…

# dmesg |grep microco
[    1.617819] microcode: sig=0x306a9, pf=0x10, revision=0x15
…

# journalctl -b -k | grep "microcode"
jun 21 22:18:52 dexx kernel: microcode: sig=0x306a9, pf=0x10, revision=0x15
…

zgrep "microcode" /var/log/kern.log*
/var/log/kern.log:Jun 15 11:50:01 dexx kernel: [    1.013317] microcode: sig=0x306a9, pf=0x10, revision=0x15
…

Instalujeme potřebné balíčky

Použijeme distribuci Debian, na ostatních distribucích by to ovšem mělo být velmi podobné. Pokud už používáte aktuální Debian 9 Stretch, máte k dispozici aktuální balíky s mikrokódem. Jejich aktualizace ale probíhá postupně v pravidelných desetinkových vydáních (9.1 a tak dále). Můžete proto sledovat repozitář Debian Backports, kde se může objevit dřív. Totéž platí o Jessie, která je sice označena jako oldstable, ale stále ještě je podporovaná. Starší verze už ale nový mikrokód nedostanou.

Protože mikrokód není svobodný, je sice součástí repozitářů, ale v podadresáři non-free. Ten si musíte přidat do /etc/apt/sources.list. Soubor bude vypadat nějak takto:

deb http://security.debian.org/ stretch/updates main contrib non-free
deb  http://deb.debian.org/debian stretch main contrib non-free

Poté stačí už jen příslušný balík nainstalovat:

# apt-get update
# apt-get install intel-microcode

Balíček má asi 650 KB a samotné soubory s mikrokódem se po instalaci nacházejí v adresáři /lib/firmware/intel-ucode/. Zbytek balíku se stará hlavně o to, aby byl použit hook do initramfs-tools, který se stará o sestavení nové verze initramfs s přiloženým mikrokódem. Ten pak jádro při startu načítá a používá. Aby to fungovalo, musí být použité jádro přeloženo s podporou zavádění nového mikrokódu. To zjistíme jednoduše tak, že se podíváme do konfigurace jádra:

# grep -i 'microcode' /boot/config-4.9.0-3-amd64
CONFIG_MICROCODE=y
CONFIG_MICROCODE_INTEL=y
CONFIG_MICROCODE_AMD=y
CONFIG_MICROCODE_OLD_INTERFACE=y

V této situaci by při příštím rebootu mělo jádro samo načíst nový mikrokód. Uvidíme to při startu systému a je to samozřejmě zalogováno:

# dmesg |grep microcode
[    0.000000] microcode: microcode updated early to revision 0x1c, date = 2015-02-26
[    1.019713] microcode: sig=0x306a9, pf=0x10, revision=0x1c

Balíčky i mikrokód samozřejmě musí zůstat nainstalované na disku, protože se zavádí při každém startu jádra. Pokud bychom je odstranili, procesor by se opět vrátil k mikrokódu BIOSu.

Ruční práce

Pokud se nechceme spolehnout na balíčkovací systém naší distribuce a dodaný mikrokód ve zmíněném balíčku, můžeme provést instalaci manuálně. Pomůže nám v tom utilita iucode_tool, nacházející se v balíku iucode-tool. Dokáže nám například vypsat signaturu našeho procesoru, podle které přesně poznáme, jaký mikrokód budeme potřebovat. Mimochodem je to stejná signatura, jakou vypisovalo jádro při startu výše.

# iucode_tool -S
iucode_tool: system has processor(s) with signature 0x000306a9

Můžeme také projít dostupné soubory s mikrokódem a nechat zvolit nejnovější kousek pro náš konkrétní procesor:

# /usr/sbin/iucode_tool -tb -lS /lib/firmware/intel-ucode/*
/usr/sbin/iucode_tool: system has processor(s) with signature 0x000306a9
microcode bundle 1: /lib/firmware/intel-ucode/0f-03-04
microcode bundle 2: /lib/firmware/intel-ucode/0f-04-0a
microcode bundle 3: /lib/firmware/intel-ucode/0f-04-01
…
selected microcodes:
  035/001: sig 0x000306a9, pf_mask 0x12, 2015-02-26, rev 0x001c, size 12288

Můžeme navštívit stránky Intelu a vyhledat nejnovější mikrokód. Ten si rozbalíme:

# tar xzf microcode-20170511.tgz

Nyní můžeme nechat utilitu znovu vybrat z nabízených mikrokódu podle našeho procesoru. Postup je stejný, jen ukážeme na jiné soubory:

# /usr/sbin/iucode_tool -tb -lS /tmp/mikrokod/intel-ucode/*
/usr/sbin/iucode_tool: system has processor(s) with signature 0x000306a9
microcode bundle 1: /tmp/mikrokod/intel-ucode/0f-00-0a
microcode bundle 2: /tmp/mikrokod/intel-ucode/0f-00-07
microcode bundle 3: /tmp/mikrokod/intel-ucode/0f-01-02
microcode bundle 4: /tmp/mikrokod/intel-ucode/0f-02-04
…
selected microcodes:
  070/001: sig 0x000306a9, pf_mask 0x12, 2015-02-26, rev 0x001c, size 12288

Vidíte, že v mém případě byla zvolena stejná verze, takže Intel pro můj procesor žádnou další aktualizaci nenabízí. Stačí mi balíček distribuovaný Debianem.

Když něco selže

Nestává se to příliš často, ale může se stát, že se něco nepodaří a počítač po aktualizaci mikrokódu nenastartuje. Jádro má pro tyto případy parametr dis_ucode_ldr, který je možné přidat do zavaděče trvale nebo jej v případě akutního problému jednoduše jádru předat v interaktivním režimu zavaděče (v Grubu stačí stisknout klávesu „e“). Jádro pak aktualizaci mikrokódu neprovede a systém nastartuje s verzí, kterou dodává BIOS.

Našli jste v článku chybu?