Aktualizacja mikrokodu firmy Intel w Linuksie
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:
- Serwer z płytą główną ASUS P10S-M i BIOS-em w wersji 4401
- Ubuntu 18.04.1:
- Wersja jądra 4.15.0-32-generic
- Pakiet mikrokodu intel-microcode w Ubuntu (wersja 3.20180425.1~ubuntu0.18.04.2)
- Mikrokod bezpośrednio od Intela (wersja 20180807)
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
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):
- 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
- CPUID ma następującą budowę 0FFM0FMS. Aby określić CPUID z Family/Model/Stepping, należy rozpocząć od końca, od steppingu:
- S (9 z Stepping) = 9
- M (e z Model) = e9
- F (6 z Family) = 6e9
- Cyfra 0 = 06e9
- 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
- ↑ Intel Processor Microcode Package for Linux (Version: 20180807) (downloadcenter.intel.com, 07.08.2018)
- ↑ Intel untersagt Benchmarks und härtet nächste Generation (golem.de, 23.08.2018)
- ↑ Intel rips up microcode security fix license that banned benchmarking (theregister.co.uk, 23.08.2018)
- ↑ Debian Bug report logs - #906158 intel-microcode: Update intel-microcode to 20180807 (bugs.debian.org)
Autor: Werner Fischer
Autor: Thomas Niedermeier