Aktualizacja mikrokodu firmy Intel w Linuksie

Z Thomas-Krenn-Wiki
Przejdź do nawigacji Przejdź do wyszukiwania

Liczne dystrybucje Linuksa już domyślnie instalują pakiety aktualizacji mikrokodu firmy Intel. Dzięki temu podczas procesu uruchomienia systemu automatycznie instalowane są nowe wersje mikrokodu firmy Intel (dostarczone przez dystrybucję Linuksa). W tym artykule przedstawiamy na przykładzie serwera z systemem Ubuntu 18.04.1 jak można sprawdzić wersje mikrokodu i w razie konieczności ją aktualizować do nowej wersji mikrokodu (która jest już dostępna u Intela, ale nie jest jeszcze dostępna w dystrybucji Linuksa).

Przykładowa konfiguracja

W tym przykładzie została wykorzystana następująca konfiguracja:

Przykład został przeprowadzony 23.08.2018 r. z najbardziej aktualnymi w tym czasie wersjami BIOS-u, mikrokodu i oprogramowania. Pokazuje on, w jaki sposób w środowiskach o znaczeniu krytycznym dla bezpieczeństwa można zainstalować najnowsze aktualizacje bezpieczeństwa, zarówno pod względem aktualizacji mikrokodu, jak i oprogramowania.

Odczyt wersji BIOS-u

Najpierw sprawdzamy model płyty głównej i wersję BIOS-u:

tk@p10s-m:~$ sudo dmidecode -t Baseboard | grep -E 'Manufacturer|Product|Version'
        Manufacturer: ASUSTeK COMPUTER INC.
        Product Name: P10S-M Series
        Version: Rev 1.xx
tk@p10s-m:~$ sudo dmidecode -t BIOS | grep -E 'Version|Date'
        Version: 4401
        Release Date: 03/05/2018

Jeśli jest to system Thomas-Krenn, to najnowszą wersję BIOS-u dla płyty głównej można znaleźć w artykule Aktualizacje bezpieczeństwa BIOS-ów. W tym przykładzie jest wykorzystywana najnowsza dostępna wersja BIOS-u.

Odczyt obecnej wersji mikrokodu

W Microcode Update Guidance z 08.08.2018 (vide Mikrokod firmy Intel - Wersje mikrokodu) wprowadził Intel, dla wykorzystywanego w tym przykładzie procesora Xeon E3-1220 v6, nową wersję mikrokodu 0x8E.

Aktualna wersja mikrokodu może zostać odczytana poprzez wirtualny plik /proc/cpuinfo. Plik ten zawiera informacje o rodzinie/modelu/stepingu i o aktualnie używanej wersji mikrokodu procesora(ów):

tk@p10s-m:~$ grep -E 'family|model|stepping|microcode' /proc/cpuinfo | head -5
cpu family      : 6
model           : 158
model name      : Intel(R) Xeon(R) CPU E3-1220 v6 @ 3.00GHz
stepping        : 9
microcode       : 0x84

W tym przykładzie obecnie jest wykorzystywana wersja mikrokodu 0x84.

Intel udostępnia informacje o dostępnych wersjach mikrokodu w dokumencie Microcode Update Guidance (vide Mikrokod firmy Intel - Wersje mikrokodu). W tym dokumencie procesory są wymienione według ich CPUID (nie na podstawie rodziny/modelu/steppingu). CPUID może zostać określone w następujący sposób, za pomocą rodziny/modelu/steppingu (Family/Model/Stepping):

  1. Najpierw należy zanotować wartość przy Family/Model/Stepping w formacie szesnastkowym. W pliku /proc/cpuinfo wartości są podane w formacie dziesiątkowym:
    • Family: 6 -> 0x6
    • Model: 158 -> 0x9e
    • Stepping: 9 -> 0x9
  2. CPUID ma następującą budowę 0FFM0FMS. Aby określić CPUID z Family/Model/Stepping, należy rozpocząć od końca, od steppingu:
  3. S (9 z Stepping) = 9
  4. M (e z Model) = e9
  5. F (6 z Family) = 6e9
  6. Cyfra 0 = 06e9
  7. M (przedostatnia cyfra z Model) = 906e9

Szukając 906e9 w Microcode Update Guidance z 08.08.2018, w kolumnie New Production MCU Rev znajduje się wersja mikrokodu 0x8E. W tym przypadku Intel udostępnia nowszą wersję mikrokodu niż obecna w przykładowym systemie.

Wersja aktualizacji mikrokodu z dystrybucji

Liczne dystrybucje instalują już domyślnie sterownik aktualizacji mikrokodu firmy Intel. Przy pomocy komendy dmesg można sprawdzić, czy sterownik zaktualizował mikrokod podczas uruchamiania. W tym przykładzie sterownik nie zainstalował nowszego mikrokodu - wersja 0x84 została już zainstalowana za pośrednictwem BIOS-u w wersji 4401:

tk@p10s-m:~$ dmesg | grep -i microcode
[    1.487040] microcode: sig=0x906e9, pf=0x2, revision=0x84
[    1.492402] microcode: Microcode Update Driver: v2.2.

Polecenie dpkg może zostać użyte do sprawdzenia wersji pakietu intel-microcode. W tym przypadku mikrokody firmy Intel udostępnione przez Ubuntu pochodzą z dnia 25.04.2018 (wersja 20180524):

tk@p10s-m:~$ dpkg -s intel-microcode | grep Version
Version: 3.20180425.1~ubuntu0.18.04.2

Czy przez dystrybucję jest udostępniana nowsza wersja można sprawdzić za pomocą polecenia apt-cache:

tk@p10s-m:~$ sudo apt update
tk@p10s-m:~$ apt-cache show intel-microcode | grep Version
Version: 3.20180425.1~ubuntu0.18.04.2
Version: 3.20180425.1~ubuntu0.18.04.1
Version: 3.20180312.0~ubuntu18.04.1

W tym przypadku najnowsza wersja pakietu jest już zainstalowana.

Instalacja mikrokodu od Intela

Intel udostępnia z wersją mikrokodu 20180807, dla wykorzystywanego w tym przykładzie CPU, nowszą wersję mikrokodu 0x8e, co jest widoczne w wyciągu z changeloga[1]

  • KBL-H/S/E3 B0 6-9e-9/2a 00000084->0000008e Core Gen7; Xeon E3 v6

Uwaga: Z reguły dystrybucje Linuksa dostarczają bardzo szybko zaktualizowane pakiety mikrokodów. W przedstawionym przykładzie nowe warunki licencji uniemożliwiły dystrybucję nowego mikrokodu przez Debiana i Ubuntu..[2] Licencja została następnie dostosowana przez firmę Intel, aby umożliwić dystrybucję.[3][4] Poniższa procedura powinna być zatem konieczna tylko w rzadkich przypadkach. Jeśli najnowsza wersja mikrokodu jest dostarczana przez dystrybucję Linuksa, to jest ona zbędna.

Nowszy mikrokod firmy Intel można załadować ręcznie w następujący sposób:

tk@p10s-m:~$ wget https://downloadmirror.intel.com/28039/eng/microcode-20180807.tgz
tk@p10s-m:~$ tar xzf microcode-20180807.tgz
tk@p10s-m:~$ diff intel-ucode/06-9e-09 /lib/firmware/intel-ucode/06-9e-09
Binary files intel-ucode/06-9e-09 and /lib/firmware/intel-ucode/06-9e-09 differ
tk@p10s-m:~$ cp -a /lib/firmware/intel-ucode/ intel-ucode.distro
tk@p10s-m:~$ sudo cp intel-ucode/06-9e-09 /lib/firmware/intel-ucode/
tk@p10s-m:~$ grep -i microcode /proc/cpuinfo | sort | uniq
microcode       : 0x84
tk@p10s-m:~$ echo 1 | sudo tee /sys/devices/system/cpu/microcode/reload
1
tk@p10s-m:~$ grep -i microcode /proc/cpuinfo | sort | uniq
microcode       : 0x8e

Aby nowy mikrokod został załadowany podczas ponownego uruchomienia systemu musi zostać na nowo stworzony Initial Ramdisk:

tk@p10s-m:~$ sudo update-initramfs -u
update-initramfs: Generating /boot/initrd.img-4.15.0-32-generic
W: Possible missing firmware /lib/firmware/ast_dp501_fw.bin for module ast

Po ponownym uruchomieniu systemu, wyjście z dmesg pokazuje, że sterownik Microcode Update automatycznie ładuje nową wersję mikrokodu podczas uruchamiania systemu:

tk@p10s-m:~$ sudo reboot
[...]
tk@p10s-m:~$ dmesg | grep -i microcode
[    0.000000] microcode: microcode updated early to revision 0x8e, date = 2018-03-24
[    1.488165] microcode: sig=0x906e9, pf=0x2, revision=0x8e
[    1.493567] microcode: Microcode Update Driver: v2.2.

Odnośniki


Autor: Werner Fischer


Autor: Thomas Niedermeier

Powiązane artykuły

Chipsety Intel C220
Mikrokod procesorów firmy Intel
Zalecenia dotyczące bezpieczeństwa produktów firmy Intel 2019-12-10