Difference between revisions of "Microcode (Русский)"

From ArchWiki
Jump to: navigation, search
(update Pkg/AUR templates)
(Tag: wiki-scripts)
m (Поздние обновления микрокода: grammar)
 
(2 intermediate revisions by the same user not shown)
Line 1: Line 1:
 +
[[Category:Русский]]
 
[[Category:CPU (Русский)]]
 
[[Category:CPU (Русский)]]
[[Category:Русский]]
+
[[Category:Security (Русский)]]
 
[[de:Microcode]]
 
[[de:Microcode]]
 
[[en:Microcode]]
 
[[en:Microcode]]
Line 7: Line 8:
 
[[zh-hans:Microcode]]
 
[[zh-hans:Microcode]]
 
{{Unmaintained (Русский)}}
 
{{Unmaintained (Русский)}}
{{TranslationStatus (Русский)|Microcode|2015-07-29|387099}}
+
{{TranslationStatus (Русский)|Microcode|2 сентября 2018|539324}}
  
 
Производители процессоров выпускают обновления стабильности и безопасности для [[Wikipedia:ru:Микрокод|микрокода]] процессора. Несмотря на то, что микрокод можно обновить с помощью BIOS, ядро Linux также может применять эти обновления во время загрузки. Эти обновления предоставляют исправления ошибок, которые могут быть критичны для стабильности вашей системы. Без этих обновлений вы можете наблюдать ложные падения или неожиданные зависания системы, которые может быть сложно отследить.
 
Производители процессоров выпускают обновления стабильности и безопасности для [[Wikipedia:ru:Микрокод|микрокода]] процессора. Несмотря на то, что микрокод можно обновить с помощью BIOS, ядро Linux также может применять эти обновления во время загрузки. Эти обновления предоставляют исправления ошибок, которые могут быть критичны для стабильности вашей системы. Без этих обновлений вы можете наблюдать ложные падения или неожиданные зависания системы, которые может быть сложно отследить.
  
Особенно пользователи процессоров семейства Intel Haswell и Broadwell должны установить эти обновления, чтобы обеспечить стабильность системы. Но, понятное дело, все пользователи Intel должны устанавливать эти обновления.
+
Особенно пользователи процессоров семейства Intel Haswell и Broadwell должны установить эти обновления, чтобы обеспечить стабильность системы. Но, понятное дело, все пользователи должны устанавливать эти обновления.
 +
 
 +
== Установка ==
 +
 
 +
Для процессоров AMD [[установите]] пакет {{Pkg|amd-ucode}}.
  
== Обновление микрокода ==
+
Для процессоров Intel [[установите]] пакет {{Pkg|intel-ucode}}.
  
Для процессоров AMD обновления микрокода поставляются в пакете {{Pkg|linux-firmware}}, который был установлен как часть базовой системы. Дальнейших действий не требуется.
+
== Включение раннего обновления микрокода ==
  
Для процессоров Intel [[установите]] пакет {{Pkg|intel-ucode}} и продолжайте читать.
+
Микрокод должен быть загружен [[загрузчик]]ом. Из-за большого разнообразия конфигураций ранней загрузки у пользователей обновления микрокода могут быть не применены автоматически конфигурацией Arch по умолчанию. Многие [[ядра]] в AUR пошли по пути официальных ядер Arch в этом вопросе.
  
=== Применение обновлений микрокода Intel ===
+
Чтобы применить эти обновления, добавьте {{ic|/boot/amd-ucode.img}} или {{ic|/boot/intel-ucode.img}} в качестве '''первого initrd в конфигурационном файле загрузчика'''. Это в дополнение к обычному initrd файлу. Смотрите ниже инструкции для популярных загрузчиков.
  
Микрокод должен быть загружен загрузчиком. Из-за большого разнообразия конфигураций ранней загрузки у пользователей обновления микрокода Intel могут быть не применены автоматически конфигурацией Arch по умолчанию. Многие ядра в AUR пошли по пути официальных Arch ядер в этом вопросе.
+
{{Note (Русский)|В следующих разделах замените строку {{ic|''производитель_цп''}} вашим производителем, например, {{ic|amd}} или {{ic|intel}}.}}
  
Чтобы применить эти обновления, добавьте {{ic|/boot/intel-ucode.img}} в качестве первого initrd в конфигурационном файле загрузчика. Это в дополнение к обычному initrd файлу. Смотрите ниже инструкции для популярных загрузчиков.
+
=== GRUB ===
  
=== Конкретные примеры ===
+
==== Автоматический способ ====
  
==== EFI boot stub / EFI handover ====
+
Утилита ''grub-mkconfig'' автоматически определит обновления микрокода и настроит соответственным образом [[GRUB (Русский)|GRUB]]. После установки пакета микрокода, перегенерируйте настройки GRUB, чтобы включить обновление микрокода при запуске:
  
Добавьте две {{ic|1=initrd=}} опции:
+
# grub-mkconfig -o /boot/grub/grub.cfg
  
{{bc|1=initrd=/intel-ucode.img initrd=/initramfs-linux.img}}
+
==== Ручной способ ====
  
==== systemd-boot ====
+
Альтернативно пользователи, управляющие настройками GRUB вручную, могут добавить {{ic|/boot/''производитель_цп''-ucode.img}} (или {{ic|/''производитель_цп''-ucode.img}}, если есть отдельный раздел {{ic|/boot}}) следующим образом:
  
Используйте {{ic|initrd}} опцию дважды в {{ic|/boot/loader/entries/*.conf}}:
+
{{hc|/boot/grub/grub.cfg|
 +
...
 +
echo 'Loading initial ramdisk'
 +
initrd '''/boot/''производитель_цп''-ucode.img''' /boot/initramfs-linux.img
 +
...
 +
}}
  
title  Arch Linux
+
Повторите это для каждой записи в меню.
linux  /vmlinuz-linux
 
initrd  /intel-ucode.img
 
initrd  /initramfs-linux.img
 
options ...
 
  
==== rEFInd ====
+
=== systemd-boot ===
  
Отредактируйте опции загрузки в {{ic|/boot/refind_linux.conf}} также как в примере EFI boot stub выше:
+
Используйте параметры {{ic|initrd}} для загрузки микрокода перед исходным ramdisk следующим образом:
  
"Boot with standard options" "ro root=UUID=(...) quiet initrd=intel-ucode.img initrd=initramfs-linux.img"
+
{{hc|/boot/loader/entries/''запись''.conf|
 +
title  Arch Linux
 +
linux  /vmlinuz-linux
 +
'''initrd /''производитель_цп''-ucode.img'''
 +
initrd /initramfs-linux.img
 +
...
 +
}}
  
Пользователи, которые создают строфы вручную в {{ic|/boot/refind.conf}} для определения ядер должны просто добавить {{ic|1=initrd=/intel-ucode.img}} или {{ic|/boot/intel-ucode.img}} как это требуется в строке опций, а не в главной части строфы.
+
Самый последний микрокод {{ic|''производитель_цп''-ucode.img}} должен быть доступен во время загрузки вашего [[системный раздел EFI|системного раздела EFI]] (ESP). ESP должен быть смонтирован как {{ic|/boot}}, чтобы обновлять микрокод каждый раз, когда обновляется {{Pkg|amd-ucode}} или {{Pkg|intel-ucode}}. В противном случае копируйте {{ic|/boot/''производитель_цп''-ucode.img}} в ваш ESP при каждом обновлении пакета микрокода.
  
==== Grub ====
+
=== EFI boot stub / EFI handover ===
''grub-mkconfig'' автоматически обнаружит обновление микрокода и соответствующе сконфигурирует grub. После установки пакета {{Pkg|intel-ucode}} пользователи должны пересоздать конфигурацию grub для активации загрузки обновления микрокода, выполнив команду:
+
 
# grub-mkconfig -o /boot/grub/grub.cfg
+
Добавьте два параметра {{ic|1=initrd=}}:
 +
 
 +
'''initrd=/''производитель_цп''-ucode.img''' initrd=/initramfs-linux.img
 +
 
 +
{{Accuracy|Что это делает, почему этого недостаточно, и почему/как это специфично для данного раздела?|section=Addition in EFI Boot stub}}
 +
 
 +
Для ядер, которые были сгенерированы как один файл, содержащий все initrd, cmdline и ядро, сначала сгенерируйте initrd для интеграции, создав новый, следующим образом:
 +
 
 +
{{bc|1=
 +
cat /boot/''производитель_цп''-ucode.img /boot/initramfs-linux.img > my_new_initrd
 +
objcopy ... --add-section .initrd=my_new_initrd
 +
}}
 +
 
 +
=== rEFInd ===
  
В качестве альтернативы, пользователи, которые вручную управляют файлом конфигурации grub могут добавить {{ic|/intel-ucode.img}} или {{ic|/boot/intel-ucode.img}} в {{ic|grub.cfg}} как показано ниже:
+
Отредактируйте опции загрузки в {{ic|/boot/refind_linux.conf}} также как в примере EFI boot stub выше, например:
  
  [...]
+
  "Boot with standard options" "rw root=UUID=(...) '''initrd=/boot/''производитель_цп''-ucode.img''' initrd=/boot/initramfs-linux.img"
    echo 'Loading initial ramdisk ...'
 
    initrd /intel-ucode.img /initramfs-linux.img
 
[...]
 
  
Проделайте это для всех пунктов меню.
+
Пользователи, использующие [[rEFInd#Manual boot stanzas|ручные строфы]] в {{ic|''esp''/EFI/refind/refind.conf}} для определения ядер, должны просто добавить {{ic|1=initrd=/boot/''производитель_цп''-ucode.img}} (или {{ic|/''производитель_цп''-ucode.img}}, если есть отдельный раздел {{ic|/boot}}), как требуется для строки опций, а не в основной части строфы. Например:
  
{{Warning (Русский)|Этот файл будет автоматически перезаписан {{ic|/usr/bin/grub-mkconfig}}'ом во время определённых обновлений, затирая ваши изменения. Настоятельно рекомендуется использовать директорию конфигурации в {{ic|/etc/grub.d}} для управления нужной вам конфигурацией grub.}}
+
options  "root=root=UUID=(...) rw add_efi_memmap '''initrd=/boot/''производитель_цп''-ucode.img'''"
  
==== Syslinux ====
+
=== Syslinux ===
  
{{Note (Русский)|Между указаниями файлов initrd ({{ic|intel-ucode}} и {{ic|initramfs-linux}}) не должно быть пробелов. Точки здесь вовсе не означают каких-либо сокращений или пропущенного кода: все должно быть указано ровно так, как показано в примере.}}
+
{{Note (Русский)|Между указаниями файлов initrd {{ic|''производитель_цп''-ucode.img}} и {{ic|initramfs-linux.img}} не должно быть пробелов. Точки здесь вовсе не означают каких-либо сокращений или пропущенного кода: строка {{ic|INITRD}} должна быть точно такой, как показано ниже.}}
  
 
Несколько файлов initrd могут быть разделены запятыми в {{ic|/boot/syslinux/syslinux.cfg}}:
 
Несколько файлов initrd могут быть разделены запятыми в {{ic|/boot/syslinux/syslinux.cfg}}:
Line 75: Line 97:
 
     MENU LABEL Arch Linux
 
     MENU LABEL Arch Linux
 
     LINUX ../vmlinuz-linux
 
     LINUX ../vmlinuz-linux
     INITRD ../intel-ucode.img,../initramfs-linux.img
+
     INITRD '''../''производитель_цп''-ucode.img''',../initramfs-linux.img
    APPEND ...
+
...
 +
 
 +
=== LILO ===
 +
 
 +
LILO и потенциально другие старые загрузчики не поддерживают несколько образов initrd. В этом случае необходимо объединить {{ic|''производитель_цп''-ucode.img}} и {{ic|initramfs-linux.img}} в один образ.
 +
 
 +
{{Warning (Русский)|Объединенный образ нужно пересоздавать после каждого обновления ядра!}}
 +
 
 +
{{Note (Русский)|Порядок важен. Исходный образ {{ic|initramfs-linux.img}} должен находиться '''сверху''' над образом {{ic|''производитель_цп''-ucode.img}}.}}
 +
 
 +
Чтобы объединить образы в один {{ic|initramfs-merged.img}}, можно использовать следующую команду:
 +
 
 +
# cat /boot/''производитель_цп''-ucode.img /boot/initramfs-linux.img > /boot/initramfs-merged.img
 +
 
 +
Теперь отредактируйте {{ic|/etc/lilo.conf}} для загрузки нового образа.
 +
 
 +
...
 +
initrd=/boot/initramfs-merged.img
 +
...
 +
 
 +
И запустите {{ic|lilo}} от суперпользователя:
 +
 
 +
# lilo
 +
 
 +
== Позднее обновление микрокода ==
 +
 
 +
Поздняя загрузка обновления микрокода происходит после запуска системы. Для этого используются файлы в {{ic|/usr/lib/firmware/amd-ucode/}} и {{ic|/usr/lib/firmware/intel-ucode/}}.
 +
 +
Для процессоров AMD файлы обновления микрокода предоставляются пакетом {{Pkg|linux-firmware}}.
 +
 
 +
Для процессоров Intel ни один пакет не предоставляет файлы обновления микрокода ({{Bug|59841}}). Чтобы использовать позднюю загрузку, вам необходимо вручную извлечь {{ic|intel-ucode/}} из предоставленного Intel архива.
 +
 
 +
=== Включение позднего обновления микрокода ===
 +
 
 +
В отличие от ранней загрузки, поздняя загрузка обновлений микрокода в Arch Linux включена по умолчанию, используя {{ic|/usr/lib/tmpfiles.d/linux-firmware.conf}}. После загрузки файл анализируется с помощью {{man|8|systemd-tmpfiles-setup.service}}, а микрокод ЦП обновляется.
 +
 
 +
Для ручного обновления микрокода на запущенной системе запустите:
 +
 
 +
# echo 1 > /sys/devices/system/cpu/microcode/reload
 +
 
 +
Это позволяет применять обновления микрокода после обновления {{Pkg|linux-firmware}} без перезагрузки системы. Вы можете даже автоматизировать это с помощью [[pacman hook]], например:
 +
 
 +
{{hc|/etc/pacman.d/hooks/microcode_reload.hook|2=
 +
[Trigger]
 +
Operation = Install
 +
Operation = Upgrade
 +
Operation = Remove
 +
Type = File
 +
Target = usr/lib/firmware/amd-ucode/*
 +
 
 +
[Action]
 +
Description = Applying CPU microcode updates...
 +
When = PostTransaction
 +
Depends = sh
 +
Exec = /bin/sh -c 'echo 1 > /sys/devices/system/cpu/microcode/reload'
 +
}}
 +
 
 +
=== Отключение позднего обновления микрокода ===
 +
 
 +
Для систем AMD микрокод процессора будет обновляться, даже если пакет {{Pkg|amd-ucode}} не установлен, так как файлы предоставлены {{Pkg|linux-firmware}} ({{Bug|59840}}). Чтобы отключить позднюю загрузку, вы должны переопределить [[systemd (Русский)#Временные файлы|временные файлы]] {{ic|/usr/lib/tmpfiles.d/linux-firmware.conf}}. Это можно сделать, создав файл с тем же именем в {{ic|/etc/tmpfiles.d/}}:
 +
 
 +
# ln -s /dev/null /etc/tmpfiles.d/linux-firmware.conf
  
 
== Проверим, обновился ли microcode при загрузке ==
 
== Проверим, обновился ли microcode при загрузке ==
Чтобы убедиться, что микрокод обновился, воспользуемся {{ic|/usr/bin/dmesg}}:
+
 
 +
Чтобы убедиться, что микрокод обновился, воспользуемся ''dmesg'':
 +
 
 
  $ dmesg | grep microcode
 
  $ dmesg | grep microcode
  
На системах Intel вы должны увидеть что-то похожее на это, что говорит о том, что микрокод обновился рано:
+
На системах Intel вы должны увидеть что-то похожее на это при каждой загрузке, что говорит о том, что микрокод обновился рано:
  
 
  [    0.000000] CPU0 microcode updated early to revision 0x1b, date = 2014-05-29
 
  [    0.000000] CPU0 microcode updated early to revision 0x1b, date = 2014-05-29
Line 96: Line 181:
 
  [    0.507296] microcode: CPU6 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.507300] microcode: CPU7 sig=0x306a9, pf=0x2, revision=0x1b
  [    0.507335] microcode: Microcode Update Driver: v2.00 <tigran@aivazian.fsnet.co.uk>, Peter Oruba
+
  [    0.507335] microcode: Microcode Update Driver: v2.2.
 +
 
 +
{{Note (Русский)|Отображаемая дата отвечает не за версию установленного пакета {{Pkg|intel-ucode}}. Это дата последнего обновления микрокода от Intel для вашего конкретного процессора.}}
  
 
Вполне возможно, особенно с новым аппаратным обеспечением, что для вашего CPU нет обновления микрокода. В этом случае вы можете увидеть примерно следующее:
 
Вполне возможно, особенно с новым аппаратным обеспечением, что для вашего CPU нет обновления микрокода. В этом случае вы можете увидеть примерно следующее:
Line 104: Line 191:
 
  [    0.292906] microcode: CPU2 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.292912] microcode: CPU3 sig=0x306c3, pf=0x2, revision=0x1c
  [    0.292956] microcode: Microcode Update Driver: v2.00 <tigran@aivazian.fsnet.co.uk>, Peter Oruba
+
  [    0.292956] microcode: Microcode Update Driver: v2.2.
  
На системах AMD микрокод обновляется несколько позже в процессе загрузки, поэтому вывод выглядит примерно так:
+
На системах AMD, использующих раннюю загрузку, вывод будет выглядеть примерно так:
  
 +
[    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_lev
 +
[    2.119269] microcode: Microcode Update Driver: v2.2.
  
[    0.807879] microcode: CPU0: patch_level=0x01000098
+
На системах AMD, использующих позднюю загрузку, в выводе будет отображаться версия старого микрокода перед перезагрузкой микрокода, а новая - после перезагрузки. Это будет выглядеть примерно так:
[    0.807888] microcode: CPU1: patch_level=0x01000098
 
[    0.807983] microcode: Microcode Update Driver: v2.00 <tigran@aivazian.fsnet.co.uk>, Peter Oruba
 
[  16.150642] microcode: CPU0: new patch_level=0x010000c7
 
[  16.150682] microcode: CPU1: new patch_level=0x010000c7
 
  
{{Note (Русский)|Отображаемая дата отвечает не за версию установленного пакета {{Pkg|intel-ucode}}. Это дата последнего обновления микрокода от Intel для вашего конкретного процессора.}}
+
[    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.
 +
 
 +
== Каким ЦП нужны обновления микрокода ==
  
== Каким CPU нужны обновления микрокода ==
 
 
Пользователи могут проконсультироваться как у Intel, так и у AMD насчёт поддержки конкретной модели процессора, перейдя по следующим ссылкам:
 
Пользователи могут проконсультироваться как у Intel, так и у AMD насчёт поддержки конкретной модели процессора, перейдя по следующим ссылкам:
  
* [http://www.amd64.org/microcode.html AMD's Operating System Research Center].
+
* [http://www.amd64.org/microcode.html Исследовательский центр операционной системы AMD (англ)].
* [https://downloadcenter.intel.com/Detail_Desc.aspx?DwnldID=24290&lang=rus Центр загрузки Intel].
+
* [https://downloadcenter.intel.com/SearchResult.aspx?lang=ru&keyword=processor%20microcode%20data%20file Центр загрузки Intel].
  
 
=== Обнаружение доступного обновления микрокода ===
 
=== Обнаружение доступного обновления микрокода ===
Line 127: Line 226:
 
Вы можете узнать, содержит ли {{ic|intel-ucode.img}} образ микрокода для вашего процессора с помощью {{Pkg|iucode-tool}}.
 
Вы можете узнать, содержит ли {{ic|intel-ucode.img}} образ микрокода для вашего процессора с помощью {{Pkg|iucode-tool}}.
  
* Установите {{Pkg|intel-ucode}} (для обнаружения обновления не требуется менять initrd)
+
# Установите {{Pkg|intel-ucode}} (для обнаружения обновления не требуется менять initrd)
* Установите {{Pkg|iucode-tool}} из [[AUR (Русский)|AUR]]
+
# Установите {{Pkg|iucode-tool}}
* {{ic|# modprobe cpuid}}
+
# {{bc|# modprobe cpuid}}
* {{ic|<nowiki># bsdtar -Oxf /boot/intel-ucode.img | iucode_tool -tb -lS - </nowiki>}}
+
# Извлекает образ микрокода и ищет в нём ваш cpuid:<br/>{{bc|# bsdtar -Oxf /boot/intel-ucode.img {{!}} iucode_tool -tb -lS -}}
:(Команда извлекает образ микрокода и ищет в нём ваш cpuid)
+
# Если обновление доступно, оно должно отобразиться под ''selected microcodes''
* Если обновление доступно, оно должно отобразиться под ''selected microcodes''
+
# Микрокод может уже быть в вашем биосе и его загрузка может не отображаться в dmesg. Сравните с текущим запуском микрокода {ic|grep microcode /proc/cpuinfo}}
  
== Применение ранней загрузки микрокода Intel в кастомных ядрах ==
+
== Применение ранней загрузки микрокода в кастомных ядрах ==
  
Для того, чтобы ранняя загрузка работала в кастомных ядрах, "CPU microcode loading support" должен быть вкомпилирован в ядро, а НЕ скомпилирован как модуль. Это активирует "Early load microcode" промпт, который должен быть установлен в "Y".  
+
Для того, чтобы ранняя загрузка работала в кастомных ядрах, "CPU microcode loading support" должен быть вкомпилирован в ядро, а '''не''' скомпилирован как модуль. Это включает приглашение "Early load microcode", которое должно быть установлено в {{ic|Y}}.  
  
 +
CONFIG_BLK_DEV_INITRD=Y
 
  CONFIG_MICROCODE=y
 
  CONFIG_MICROCODE=y
  CONFIG_MICROCODE_INTEL=y
+
  CONFIG_MICROCODE_INTEL=Y
  CONFIG_MICROCODE_INTEL_EARLY=y
+
  CONFIG_MICROCODE_AMD=y
CONFIG_MICROCODE_EARLY=y
 
  
 
== Смотрите также ==
 
== Смотрите также ==
  
* [https://flossexperiences.wordpress.com/2013/11/17/updating-microcodes/ Updating microcodes]
+
* [https://flossexperiences.wordpress.com/2013/11/17/updating-microcodes/ Обновление микрокодов - Опыт сообщества (англ)]
* [http://inertiawar.com/microcode/ Notes on Intel Microcode updates]
+
* [http://inertiawar.com/microcode/ Замечания по обновлению микрокода Intel - Ben Hawkes (англ)]
* [https://www.kernel.org/doc/Documentation/x86/early-microcode.txt Kernel early microcode]
+
* [https://www.kernel.org/doc/Documentation/x86/microcode.txt Загрузчик микрокода ядра - документация ядра (англ)]
* [http://www.anandtech.com/show/8376/intel-disables-tsx-instructions-erratum-found-in-haswell-haswelleep-broadwelly Erratum found in Haswell/Broadwell]
+
* [http://www.anandtech.com/show/8376/intel-disables-tsx-instructions-erratum-found-in-haswell-haswelleep-broadwelly Erratum найден в Haswell/Broadwell – AnandTech (англ)]
 +
* [https://gitlab.com/iucode-tool/iucode-tool проект iucode-tool на GitLab (англ)]

Latest revision as of 01:54, 13 September 2018

Tango-preferences-desktop-locale.pngЭта страница нуждается в сопроводителеTango-preferences-desktop-locale.png

Статья не гарантирует актуальность информации. Помогите русскоязычному сообществу поддержкой подобных страниц. См. Команда переводчиков ArchWiki
Состояние перевода: На этой странице представлен перевод статьи Microcode. Дата последней синхронизации: 2 сентября 2018. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Производители процессоров выпускают обновления стабильности и безопасности для микрокода процессора. Несмотря на то, что микрокод можно обновить с помощью BIOS, ядро Linux также может применять эти обновления во время загрузки. Эти обновления предоставляют исправления ошибок, которые могут быть критичны для стабильности вашей системы. Без этих обновлений вы можете наблюдать ложные падения или неожиданные зависания системы, которые может быть сложно отследить.

Особенно пользователи процессоров семейства Intel Haswell и Broadwell должны установить эти обновления, чтобы обеспечить стабильность системы. Но, понятное дело, все пользователи должны устанавливать эти обновления.

Установка

Для процессоров AMD установите пакет amd-ucode.

Для процессоров Intel установите пакет intel-ucode.

Включение раннего обновления микрокода

Микрокод должен быть загружен загрузчиком. Из-за большого разнообразия конфигураций ранней загрузки у пользователей обновления микрокода могут быть не применены автоматически конфигурацией Arch по умолчанию. Многие ядра в AUR пошли по пути официальных ядер Arch в этом вопросе.

Чтобы применить эти обновления, добавьте /boot/amd-ucode.img или /boot/intel-ucode.img в качестве первого initrd в конфигурационном файле загрузчика. Это в дополнение к обычному initrd файлу. Смотрите ниже инструкции для популярных загрузчиков.

Примечание: В следующих разделах замените строку производитель_цп вашим производителем, например, amd или intel.

GRUB

Автоматический способ

Утилита grub-mkconfig автоматически определит обновления микрокода и настроит соответственным образом GRUB. После установки пакета микрокода, перегенерируйте настройки GRUB, чтобы включить обновление микрокода при запуске:

# grub-mkconfig -o /boot/grub/grub.cfg

Ручной способ

Альтернативно пользователи, управляющие настройками GRUB вручную, могут добавить /boot/производитель_цп-ucode.img (или /производитель_цп-ucode.img, если есть отдельный раздел /boot) следующим образом:

/boot/grub/grub.cfg
...
echo 'Loading initial ramdisk'
initrd /boot/производитель_цп-ucode.img /boot/initramfs-linux.img
...

Повторите это для каждой записи в меню.

systemd-boot

Используйте параметры initrd для загрузки микрокода перед исходным ramdisk следующим образом:

/boot/loader/entries/запись.conf
title   Arch Linux
linux   /vmlinuz-linux
initrd  /производитель_цп-ucode.img
initrd  /initramfs-linux.img
...

Самый последний микрокод производитель_цп-ucode.img должен быть доступен во время загрузки вашего системного раздела EFI (ESP). ESP должен быть смонтирован как /boot, чтобы обновлять микрокод каждый раз, когда обновляется amd-ucode или intel-ucode. В противном случае копируйте /boot/производитель_цп-ucode.img в ваш ESP при каждом обновлении пакета микрокода.

EFI boot stub / EFI handover

Добавьте два параметра initrd=:

initrd=/производитель_цп-ucode.img initrd=/initramfs-linux.img

Tango-inaccurate.pngThe factual accuracy of this article or section is disputed.Tango-inaccurate.png

Reason: Что это делает, почему этого недостаточно, и почему/как это специфично для данного раздела? (Discuss in Talk:Microcode (Русский)#Addition in EFI Boot stub)

Для ядер, которые были сгенерированы как один файл, содержащий все initrd, cmdline и ядро, сначала сгенерируйте initrd для интеграции, создав новый, следующим образом:

cat /boot/производитель_цп-ucode.img /boot/initramfs-linux.img > my_new_initrd
objcopy ... --add-section .initrd=my_new_initrd

rEFInd

Отредактируйте опции загрузки в /boot/refind_linux.conf также как в примере EFI boot stub выше, например:

"Boot with standard options" "rw root=UUID=(...) initrd=/boot/производитель_цп-ucode.img initrd=/boot/initramfs-linux.img"

Пользователи, использующие ручные строфы в esp/EFI/refind/refind.conf для определения ядер, должны просто добавить initrd=/boot/производитель_цп-ucode.img (или /производитель_цп-ucode.img, если есть отдельный раздел /boot), как требуется для строки опций, а не в основной части строфы. Например:

options  "root=root=UUID=(...) rw add_efi_memmap initrd=/boot/производитель_цп-ucode.img"

Syslinux

Примечание: Между указаниями файлов initrd производитель_цп-ucode.img и initramfs-linux.img не должно быть пробелов. Точки здесь вовсе не означают каких-либо сокращений или пропущенного кода: строка INITRD должна быть точно такой, как показано ниже.

Несколько файлов initrd могут быть разделены запятыми в /boot/syslinux/syslinux.cfg:

LABEL arch
    MENU LABEL Arch Linux
    LINUX ../vmlinuz-linux
    INITRD ../производитель_цп-ucode.img,../initramfs-linux.img
...

LILO

LILO и потенциально другие старые загрузчики не поддерживают несколько образов initrd. В этом случае необходимо объединить производитель_цп-ucode.img и initramfs-linux.img в один образ.

Важно: Объединенный образ нужно пересоздавать после каждого обновления ядра!
Примечание: Порядок важен. Исходный образ initramfs-linux.img должен находиться сверху над образом производитель_цп-ucode.img.

Чтобы объединить образы в один initramfs-merged.img, можно использовать следующую команду:

# cat /boot/производитель_цп-ucode.img /boot/initramfs-linux.img > /boot/initramfs-merged.img

Теперь отредактируйте /etc/lilo.conf для загрузки нового образа.

...
initrd=/boot/initramfs-merged.img
...

И запустите lilo от суперпользователя:

# lilo

Позднее обновление микрокода

Поздняя загрузка обновления микрокода происходит после запуска системы. Для этого используются файлы в /usr/lib/firmware/amd-ucode/ и /usr/lib/firmware/intel-ucode/.

Для процессоров AMD файлы обновления микрокода предоставляются пакетом linux-firmware.

Для процессоров Intel ни один пакет не предоставляет файлы обновления микрокода (FS#59841). Чтобы использовать позднюю загрузку, вам необходимо вручную извлечь intel-ucode/ из предоставленного Intel архива.

Включение позднего обновления микрокода

В отличие от ранней загрузки, поздняя загрузка обновлений микрокода в Arch Linux включена по умолчанию, используя /usr/lib/tmpfiles.d/linux-firmware.conf. После загрузки файл анализируется с помощью systemd-tmpfiles-setup.service(8), а микрокод ЦП обновляется.

Для ручного обновления микрокода на запущенной системе запустите:

# echo 1 > /sys/devices/system/cpu/microcode/reload

Это позволяет применять обновления микрокода после обновления linux-firmware без перезагрузки системы. Вы можете даже автоматизировать это с помощью pacman hook, например:

/etc/pacman.d/hooks/microcode_reload.hook
[Trigger]
Operation = Install
Operation = Upgrade
Operation = Remove
Type = File
Target = usr/lib/firmware/amd-ucode/*	

[Action]
Description = Applying CPU microcode updates...
When = PostTransaction
Depends = sh
Exec = /bin/sh -c 'echo 1 > /sys/devices/system/cpu/microcode/reload'

Отключение позднего обновления микрокода

Для систем AMD микрокод процессора будет обновляться, даже если пакет amd-ucode не установлен, так как файлы предоставлены linux-firmware (FS#59840). Чтобы отключить позднюю загрузку, вы должны переопределить временные файлы /usr/lib/tmpfiles.d/linux-firmware.conf. Это можно сделать, создав файл с тем же именем в /etc/tmpfiles.d/:

# ln -s /dev/null /etc/tmpfiles.d/linux-firmware.conf

Проверим, обновился ли microcode при загрузке

Чтобы убедиться, что микрокод обновился, воспользуемся dmesg:

$ dmesg | grep microcode

На системах Intel вы должны увидеть что-то похожее на это при каждой загрузке, что говорит о том, что микрокод обновился рано:

[    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.
Примечание: Отображаемая дата отвечает не за версию установленного пакета intel-ucode. Это дата последнего обновления микрокода от Intel для вашего конкретного процессора.

Вполне возможно, особенно с новым аппаратным обеспечением, что для вашего CPU нет обновления микрокода. В этом случае вы можете увидеть примерно следующее:

[    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.

На системах AMD, использующих раннюю загрузку, вывод будет выглядеть примерно так:

[    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_lev
[    2.119269] microcode: Microcode Update Driver: v2.2.

На системах AMD, использующих позднюю загрузку, в выводе будет отображаться версия старого микрокода перед перезагрузкой микрокода, а новая - после перезагрузки. Это будет выглядеть примерно так:

[    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.

Каким ЦП нужны обновления микрокода

Пользователи могут проконсультироваться как у Intel, так и у AMD насчёт поддержки конкретной модели процессора, перейдя по следующим ссылкам:

Обнаружение доступного обновления микрокода

Вы можете узнать, содержит ли intel-ucode.img образ микрокода для вашего процессора с помощью iucode-tool.

  1. Установите intel-ucode (для обнаружения обновления не требуется менять initrd)
  2. Установите iucode-tool
  3. # modprobe cpuid
  4. Извлекает образ микрокода и ищет в нём ваш cpuid:
    # bsdtar -Oxf /boot/intel-ucode.img | iucode_tool -tb -lS -
  5. Если обновление доступно, оно должно отобразиться под selected microcodes
  6. Микрокод может уже быть в вашем биосе и его загрузка может не отображаться в dmesg. Сравните с текущим запуском микрокода {ic|grep microcode /proc/cpuinfo}}

Применение ранней загрузки микрокода в кастомных ядрах

Для того, чтобы ранняя загрузка работала в кастомных ядрах, "CPU microcode loading support" должен быть вкомпилирован в ядро, а не скомпилирован как модуль. Это включает приглашение "Early load microcode", которое должно быть установлено в Y.

CONFIG_BLK_DEV_INITRD=Y
CONFIG_MICROCODE=y
CONFIG_MICROCODE_INTEL=Y
CONFIG_MICROCODE_AMD=y

Смотрите также