「マイクロコード」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(Pkg/AUR テンプレートの更新)
(同期)
1行目: 1行目:
 
[[Category:CPU]]
 
[[Category:CPU]]
  +
[[Category:セキュリティ]]
 
[[de:Microcode]]
 
[[de:Microcode]]
 
[[en:Microcode]]
 
[[en:Microcode]]
9行目: 10行目:
 
:''マイクロコードのデータファイルには全ての Intel プロセッサのための最新のマイクロコードが定義されています。Intel はマイクロコードのアップデートをリリースすることで、それぞれのプロセッサの仕様のアプリケーションに文書化されているようにプロセッサの挙動を修正します。一般的に、このマイクロコードの更新を行うのは BIOS のアップデートによりますが、これは管理者を困らせるような羽目になることがあるのを Intel は了解しています。Linux オペレーティングシステムや VMware ESX プロダクトには起動後にマイクロコードを更新する仕組みが備わっています。例えば、Linux システムの {{ic|/etc/firmware}} ディレクトリにファイルが配置されると、オペレーティングシステムの仕組みがこのファイルを使用します。''
 
:''マイクロコードのデータファイルには全ての Intel プロセッサのための最新のマイクロコードが定義されています。Intel はマイクロコードのアップデートをリリースすることで、それぞれのプロセッサの仕様のアプリケーションに文書化されているようにプロセッサの挙動を修正します。一般的に、このマイクロコードの更新を行うのは BIOS のアップデートによりますが、これは管理者を困らせるような羽目になることがあるのを Intel は了解しています。Linux オペレーティングシステムや VMware ESX プロダクトには起動後にマイクロコードを更新する仕組みが備わっています。例えば、Linux システムの {{ic|/etc/firmware}} ディレクトリにファイルが配置されると、オペレーティングシステムの仕組みがこのファイルを使用します。''
   
  +
全てのユーザーがアップデートをインストールすべきですが、Intel Haswell と Broadwell プロセッサファミリーに属する CPU を使っている場合は特に、システムを安定させるためにマイクロコードのアップデートをインストールしてください。
{{Note|Arch Linux はアップデートを処理するのに {{ic|/etc/firmware}} は使いません、代わりにファームウェアのバイナリは {{ic|/usr/lib/firmware/*.}} に作成されます。}}
 
   
== クロコドのアップデート ==
+
== インスト ==
   
 
Intel のプロセッサの場合、{{Pkg|intel-ucode}} をインストールしてください。
 
Intel のプロセッサの場合、{{Pkg|intel-ucode}} をインストールしてください。
   
AMD のプロセッサの場合、マイクロコードのアップデートは {{Pkg|linux-firmware}} で利用することができ、このパッケージはベースシステムの一部としてインストールされます
+
AMD のプロセッサの場合、{{Pkg|amd-ucode}} インストールしてくだ
   
  +
Arch 環境を[[USB キーに Arch Linux をインストール|リムーバブルドライブ]]上に構築していて、両方のメーカーのマイクロコードが必要な場合、両方のパッケージをインストールしてください。
=== Intel のマイクロコードのアップデートを有効にする ===
 
   
  +
== 起動初期にマイクロコードをアップデート ==
{{warning|linux 3.17-2 と linux-lts 3.14.21-2 以降から、Intel のマイクロコードのアップデートは自動では行われなくなりました。多くの AUR のカーネルも公式の Arch カーネルと同じようになっています: linux-ck 3.16.6-3 から、Intel のマイクロコードのアップデートは自動で行われないようになりました。}}
 
   
  +
マイクロコードは[[ブートローダー]]からロードする必要があります。ブートの設定はユーザーによって様々であるため、Arch のデフォルト設定ではマイクロコードのアップデートは自動的に使われないようになっています。この点について AUR カーネルの多くは Arch の公式[[カーネル]]と同じようになっています。
アップデートを有効にするにはブートローダーの設定ファイルに {{ic|/boot/intel-ucode.img}} を一番目の initrd として追加する必要があります。通常の initrd ファイルとは別に追加します。
 
   
  +
アップデートを有効にするにはブートローダーの設定ファイルに {{ic|/boot/amd-ucode.img}} または {{ic|/boot/intel-ucode.img}} を一番目の initrd として追加する必要があります。通常の initrd ファイルとは別に追加します。
=== サンプル ===
 
   
  +
{{Note|以下のセクションで出てくる {{ic|''cpu_manufacturer''}} はあなたが使っている CPU のメーカー名 ({{ic|amd}} または {{ic|intel}}) に置き換えてください。}}
==== EFI ブートスタブ / EFI ハンドオーバー ====
 
   
  +
{{Tip|[[USB キーに Arch Linux をインストール|リムーバブルドライブ]]に Arch Linux をインストールする場合、ブートローダーの設定にマイクロコードファイルを両方とも {{ic|initrd}} で追加してください。initramfs イメージよりも前に指定していればファイルの順番は関係ありません。}}
2つの {{ic|1=initrd=}} オプションを追加:
 
   
  +
=== GRUB ===
{{bc|1=initrd=/intel-ucode.img initrd=/initramfs-linux.img}}
 
   
==== systemd-boot ====
+
==== 自動ロード ====
   
  +
''grub-mkconfig'' が自動的にマイクロコードのアップデートを処理します。マイクロコードのパッケージをインストールした後に以下のコマンドを実行して、grub の設定を再生成し、マイクロコードのアップデートのロードを有効にしてください:
{{ic|/boot/loader/entries/''entry''.conf}} で {{ic|initrd}} オプションを二回使用:
 
   
  +
# grub-mkconfig -o /boot/grub/grub.cfg
title Arch Linux
 
linux /vmlinuz-linux
 
initrd /intel-ucode.img
 
initrd /initramfs-linux.img
 
options ...
 
   
  +
==== 手動ロード ====
[[EFI システムパーティション]]を {{ic|/boot}} にマウントしていない場合、{{ic|/boot/intel-ucode.img}} を EFI システムパーティションにコピーしてください。
 
   
  +
もしくは、[[GRUB]] の設定ファイルを手動で管理したい場合、以下のように {{ic|grub.cfg}} に {{ic|/boot/''cpu_manufacturer''-ucode.img}} ({{ic|/boot}} パーティションを分けている場合は {{ic|/''cpu_manufacturer''-ucode.img}}) を追加します:
==== rEFInd ====
 
   
  +
{{hc|/boot/grub/grub.cfg|
上記の EFI ブートスタブと同じように {{ic|/boot/refind_linux.conf}} のブートオプションを編集する、例:
 
  +
...
  +
echo 'Loading initial ramdisk'
  +
initrd '''/boot/''cpu_manufacturer''-ucode.img''' /boot/initramfs-linux.img
  +
...
  +
}}
   
  +
すべてのメニューエントリに追加してください。
"Boot with standard options" "rw root=UUID=(...) quiet initrd=/boot/intel-ucode.img initrd=/boot/initramfs-linux.img"
 
   
  +
=== systemd-boot ===
[[rEFInd#手動でブートエントリを記述|手動]]で {{ic|/boot/refind.conf}} にカーネルを定義している場合はメインの部分ではなく options 行に {{ic|1=initrd=/intel-ucode.img}} や {{ic|/boot/intel-ucode.img}} を追加してください。
 
   
  +
以下のように初期 RAM ディスクの前に {{ic|initrd}} オプションを使ってマイクロコードをロード:
==== Grub ====
 
grub-1:2.02-beta2-5 から、''grub-mkconfig'' が自動的にマイクロコードのアップデートを処理します。{{Pkg|intel-ucode}} をインストールした後に {{ic|# grub-mkconfig -o /boot/grub/grub.cfg}} を実行して、grub の設定を再生成し、マイクロコードのアップデートのロードを有効にしてください。
 
   
  +
{{hc|/boot/loader/entries/''entry''.conf|
もしくは、[[GRUB]] の設定ファイルを手動で管理したい場合、以下のように {{ic|grub.cfg}} に {{ic|/intel-ucode.img}} や {{ic|/boot/intel-ucode.img}} を追加します:
 
  +
title Arch Linux
  +
linux /vmlinuz-linux
  +
'''initrd /''cpu_manufacturer''-ucode.img'''
  +
initrd /initramfs-linux.img
  +
...
  +
}}
   
  +
最新のマイクロコード {{ic|''cpu_manufacturer''-ucode.img}} が起動時に [[EFI システムパーティション]]に必要となります。{{Pkg|amd-ucode}} または {{Pkg|intel-ucode}} を更新したときはマイクロコードが更新されるように {{ic|/boot}} に ESP をマウントしてください。もしくは ESP に {{ic|/boot/''cpu_manufacturer''-ucode.img}} をコピーしてください。
[...]
 
echo 'Loading initial ramdisk ...'
 
initrd /intel-ucode.img /initramfs-linux.img
 
[...]
 
   
  +
=== EFI ブートスタブ / EFI ハンドオーバー ===
{{Note|すべてのメニューエントリに追加してください。}}
 
   
  +
{{ic|1=initrd=}} オプションを2つ追加:
{{warning|更新があると {{ic|/usr/bin/grub-mkconfig}} によってファイルが自動的に上書きされるため、ファイルの変更は取り消されてしまいます。}}
 
   
  +
'''initrd=/''cpu_manufacturer''-ucode.img''' initrd=/initramfs-linux.img
==== Syslinux ====
 
   
  +
全ての initrd とコマンドライン、カーネルを含むひとつのファイルとしてカーネルを生成した場合、まず以下のように新しい initrd を作成して統合してください:
{{Note|initrd ファイルの {{ic|intel-ucode}} と {{ic|initramfs-linux}} の間に空白は挟まないで下さい。ピリオド記号は省略ではありません。以下の記述そのままに編集するようにしてください。}}
 
  +
  +
{{bc|1=
  +
cat /boot/''cpu_manufacturer''-ucode.img /boot/initramfs-linux.img > my_new_initrd
  +
objcopy ... --add-section .initrd=my_new_initrd
  +
}}
  +
  +
=== rEFInd ===
  +
  +
上記の EFI ブートスタブと同じように {{ic|/boot/refind_linux.conf}} のブートオプションを編集する、例:
  +
  +
"Boot with standard options" "rw root=UUID=(...) '''initrd=/boot/''cpu_manufacturer''-ucode.img''' initrd=/boot/initramfs-linux.img"
  +
  +
[[rEFInd#手動でブートエントリを記述|手動]]で {{ic|''esp''/EFI/refind/refind.conf}} にカーネルを定義している場合はメインの部分ではなく options 行に {{ic|/boot/''cpu_manufacturer''-ucode.img}} ({{ic|/boot}} パーティションを分けている場合は {{ic|/''cpu_manufacturer''-ucode.img}}) を追加してください。例:
  +
  +
options "root=root=UUID=(...) rw add_efi_memmap '''initrd=/boot/''cpu_manufacturer''-ucode.img'''"
  +
  +
=== Syslinux ===
  +
  +
{{Note|initrd ファイルの {{ic|''cpu_manufacturer''-ucode.img}} と {{ic|initramfs-linux}} の間に空白は挟まないで下さい。以下の記述そのままに編集するようにしてください。}}
   
 
{{ic|/boot/syslinux/syslinux.cfg}} で複数の initrd をカンマで区切って指定できます:
 
{{ic|/boot/syslinux/syslinux.cfg}} で複数の initrd をカンマで区切って指定できます:
74行目: 97行目:
 
MENU LABEL Arch Linux
 
MENU LABEL Arch Linux
 
LINUX ../vmlinuz-linux
 
LINUX ../vmlinuz-linux
INITRD ../intel-ucode.img,../initramfs-linux.img
+
INITRD '''../''cpu_manufacturer''-ucode.img''',../initramfs-linux.img
  +
...
APPEND ''<your kernel parameters>''
 
   
==== LILO ====
+
=== LILO ===
  +
  +
LILO などの旧式のブートローダーは複数の initrd イメージをサポートしていません。そのような場合 {{ic|''cpu_manufacturer''-ucode.img}} と {{ic|initramfs-linux.img}} をひとつのイメージにまとめる必要があります。
   
LILO などの旧式のブートローダーは複数の initrd イメージをサポートしていません。そのような場合 {{ic|intel-ucode}} と {{ic|initramfs-linux}} をひとつのイメージにまとめる必要があります。
 
 
{{Warning|カーネルをアップデートするたびに毎回イメージをマージして再生成する必要があります。}}
 
{{Warning|カーネルをアップデートするたびに毎回イメージをマージして再生成する必要があります。}}
  +
{{Note|{{ic|intel-ucode}} などの追加イメージは圧縮してはいけません。圧縮すると未圧縮イメージのごみしか認識されずカーネルがエラーを吐いて起動に失敗してしまいます。}}
 
  +
{{Note|イメージの順番は重要です。オリジナルのイメージである {{ic|initramfs-linux}} は {{ic|''cpu_manufacturer''-ucode.img}} イメージよりも先に来るように結合する必要があります。}}
{{ic|intel-ucode.img}} は cpio アーカイブになっています。マイクロコードのアップデートがあるたびにアーカイブが圧縮されているかどうか確認することを推奨します。今後もイメージが同じフォーマットである保証はありません。{{ic|intel-ucode}} が圧縮されているかどうか確認するには {{ic|file}} コマンドを使います:
 
  +
$ file /boot/intel-ucode.img
 
/boot/intel-ucode.img: ASCII cpio archive (SVR4 with no CRC)
 
{{Note|イメージの順番は重要です。オリジナルのイメージである {{ic|initramfs-linux}} は {{ic|intel-ucode}} イメージよりも先に来るように結合する必要があります。}}
 
 
ふたつのイメージを {{ic|initramfs-merged.img}} という名前のイメージにマージするには、以下のコマンドを使用:
 
ふたつのイメージを {{ic|initramfs-merged.img}} という名前のイメージにマージするには、以下のコマンドを使用:
 
 
# cat /boot/intel-ucode.img /boot/initramfs-linux.img > /boot/initramfs-merged.img
+
# cat /boot/''cpu_manufacturer''-ucode.img /boot/initramfs-linux.img > /boot/initramfs-merged.img
   
 
マージできたら {{ic|/etc/lilo.conf}} を編集して新しいイメージをロードします:
 
マージできたら {{ic|/etc/lilo.conf}} を編集して新しいイメージをロードします:
   
[...]
+
...
initrd=/boot/initramfs-merged.img
+
initrd=/boot/initramfs-merged.img
[...]
+
...
   
 
root で {{ic|lilo}} を実行してください:
 
root で {{ic|lilo}} を実行してください:
 
 
 
# lilo
 
# lilo
  +
  +
== 起動後にマイクロコードをアップデート ==
  +
  +
システムを起動した後にマイクロコードのアップデートをロードすることもできます。{{ic|/usr/lib/firmware/amd-ucode/}} と {{ic|/usr/lib/firmware/intel-ucode/}} のファイルを使用します。
  +
  +
AMD プロセッサの場合、マイクロコードのアップデートファイルは {{Pkg|linux-firmware}} によって提供されます。
  +
  +
Intel プロセッサの場合、マイクロコードのアップデートファイルが含まれるパッケージはありません ({{Bug|59841}})。起動後にロードするには Intel が提供しているアーカイブから手動で {{ic|intel-ucode/}} を抽出する必要があります。
  +
  +
=== マイクロコードのアップデートを有効にする ===
  +
  +
起動初期のロードとは異なり、起動後のマイクロコードのアップデートのロードは Arch Linux ではデフォルトで有効になっており {{ic|/usr/lib/tmpfiles.d/linux-firmware.conf}} を使用します。起動後に {{man|8|systemd-tmpfiles-setup.service}} によってファイルが読み込まれて CPU のマイクロコードが更新されます。
  +
  +
実行中のシステムで手動でマイクロコードをアップデートするには:
  +
  +
# echo 1 > /sys/devices/system/cpu/microcode/reload
  +
  +
このコマンドを使えば {{Pkg|linux-firmware}} が更新されたときにシステムを再起動することなくマイクロコードのアップデートを適用することができます。[[pacman フック]]を使って自動的にコマンドを実行することも可能です:
  +
  +
{{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}} にファイルが含まれているため CPU のマイクロコードはアップデートされてしまいます ({{Bug|59840}})。起動後のロードを無効にしたい場合は {{ic|/usr/lib/tmpfiles.d/linux-firmware.conf}} を無効にしてください。{{ic|/etc/tmpfiles.d/}} に同名のファイルを作成することで無効化できます:
  +
  +
# ln -s /dev/null /etc/tmpfiles.d/linux-firmware.conf
   
 
== 起動時にマイクロコードのアップデートがされたか確認する ==
 
== 起動時にマイクロコードのアップデートがされたか確認する ==
119行目: 180行目:
 
[ 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 のマイクロコードアップデートが存在しないという可能性も考えられます。そのときは、以下のような出力がなされます:
127行目: 190行目:
 
[ 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 環境で起動初期にマイクロコードアップデートしている場合、以下のように出力されます:
   
[ 0.807879] microcode: CPU0: patch_level=0x01000098
+
[ 2.119089] microcode: microcode updated early to new patch_level=0x0700010f
[ 0.807888] microcode: CPU1: patch_level=0x01000098
+
[ 2.119157] microcode: CPU0: patch_level=0x0700010f
[ 0.807983] microcode: Microcode Update Driver: v2.00 <tigran@aivazian.fsnet.co.uk>, Peter Oruba
+
[ 2.119171] microcode: CPU1: patch_level=0x0700010f
[ 16.150642] microcode: CPU0: new patch_level=0x010000c7
+
[ 2.119183] microcode: CPU2: patch_level=0x0700010f
[ 16.150682] microcode: CPU1: new patch_level=0x010000c7
+
[ 2.119189] microcode: CPU3: patch_level=0x0700010f
  +
[ 2.119269] microcode: Microcode Update Driver: v2.2.
   
{{Note|表示される日付は {{pkg|intel-ucode}} パのバージョンとは対応しません。Intel がマイクロコードのアップデトを行った最後日付が表示されます。}}
+
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.
   
 
== マイクロコードのアップデートができる CPU ==
 
== マイクロコードのアップデートができる CPU ==
144行目: 219行目:
   
 
* [http://www.amd64.org/microcode.html AMD の Operating System Research Center]。
 
* [http://www.amd64.org/microcode.html AMD の Operating System Research Center]。
* [https://downloadcenter.intel.com/ja/download/27337/Linux-Processor-Microcode-Data-File Intel のダウンロードセンター]。
+
* [https://downloadcenter.intel.com/SearchResult.aspx?lang=eng&keyword=processor%20microcode%20data%20file Intel のダウンロードセンター]。
   
 
=== マイクロコードのアップデートが必要かどうか確認する ===
 
=== マイクロコードのアップデートが必要かどうか確認する ===
151行目: 226行目:
   
 
* {{Pkg|intel-ucode}} をインストール (アップデートがあるかどうか確認するのに initrd の変更は必要ありません)
 
* {{Pkg|intel-ucode}} をインストール (アップデートがあるかどうか確認するのに initrd の変更は必要ありません)
* [[AUR]] から {{Pkg|iucode-tool}} をインストール
+
* {{Pkg|iucode-tool}} をインストール
 
* {{ic|# modprobe cpuid}}
 
* {{ic|# modprobe cpuid}}
 
* {{ic|<nowiki># bsdtar -Oxf /boot/intel-ucode.img | iucode_tool -tb -lS - </nowiki>}}<br />(マイクロコードイメージを展開して cpuid を検索します)
 
* {{ic|<nowiki># bsdtar -Oxf /boot/intel-ucode.img | iucode_tool -tb -lS - </nowiki>}}<br />(マイクロコードイメージを展開して cpuid を検索します)
164行目: 239行目:
 
CONFIG_MICROCODE=y
 
CONFIG_MICROCODE=y
 
CONFIG_MICROCODE_INTEL=Y
 
CONFIG_MICROCODE_INTEL=Y
  +
CONFIG_MICROCODE_AMD=y
   
 
== 参照 ==
 
== 参照 ==
169行目: 245行目:
 
* [https://flossexperiences.wordpress.com/2013/11/17/updating-microcodes/ Updating microcodes]
 
* [https://flossexperiences.wordpress.com/2013/11/17/updating-microcodes/ Updating microcodes]
 
* [http://inertiawar.com/microcode/ Intel によるマイクロコードアップデートのノート]
 
* [http://inertiawar.com/microcode/ Intel によるマイクロコードアップデートのノート]
* [https://www.kernel.org/doc/Documentation/x86/early-microcode.txt マイクロコードのカーネルドキュメント]
+
* [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 Haswell/Broadwell で見つかったエラッタ]
 
* [http://www.anandtech.com/show/8376/intel-disables-tsx-instructions-erratum-found-in-haswell-haswelleep-broadwelly Haswell/Broadwell で見つかったエラッタ]
* [https://gitlab.com/iucode-tool/iucode-tool 技術的な詳細]
+
* [https://gitlab.com/iucode-tool/iucode-tool iucode-tool GitLab プロジェクト]

2018年12月12日 (水) 20:30時点における版

プロセッサのマイクロコードはプロセッサのファームウェアと同種のものです。カーネルは BIOS のアップデートをすることなくプロセッサのファームウェアをアップデートすることができます。Intel のウェブサイトより:

マイクロコードのデータファイルには全ての Intel プロセッサのための最新のマイクロコードが定義されています。Intel はマイクロコードのアップデートをリリースすることで、それぞれのプロセッサの仕様のアプリケーションに文書化されているようにプロセッサの挙動を修正します。一般的に、このマイクロコードの更新を行うのは BIOS のアップデートによりますが、これは管理者を困らせるような羽目になることがあるのを Intel は了解しています。Linux オペレーティングシステムや VMware ESX プロダクトには起動後にマイクロコードを更新する仕組みが備わっています。例えば、Linux システムの /etc/firmware ディレクトリにファイルが配置されると、オペレーティングシステムの仕組みがこのファイルを使用します。

全てのユーザーがアップデートをインストールすべきですが、Intel Haswell と Broadwell プロセッサファミリーに属する CPU を使っている場合は特に、システムを安定させるためにマイクロコードのアップデートをインストールしてください。

インストール

Intel のプロセッサの場合、intel-ucode をインストールしてください。

AMD のプロセッサの場合、amd-ucode をインストールしてください。

Arch 環境をリムーバブルドライブ上に構築していて、両方のメーカーのマイクロコードが必要な場合、両方のパッケージをインストールしてください。

起動初期にマイクロコードをアップデート

マイクロコードはブートローダーからロードする必要があります。ブートの設定はユーザーによって様々であるため、Arch のデフォルト設定ではマイクロコードのアップデートは自動的に使われないようになっています。この点について AUR カーネルの多くは Arch の公式カーネルと同じようになっています。

アップデートを有効にするにはブートローダーの設定ファイルに /boot/amd-ucode.img または /boot/intel-ucode.img を一番目の initrd として追加する必要があります。通常の initrd ファイルとは別に追加します。

ノート: 以下のセクションで出てくる cpu_manufacturer はあなたが使っている CPU のメーカー名 (amd または intel) に置き換えてください。
ヒント: リムーバブルドライブに Arch Linux をインストールする場合、ブートローダーの設定にマイクロコードファイルを両方とも initrd で追加してください。initramfs イメージよりも前に指定していればファイルの順番は関係ありません。

GRUB

自動ロード

grub-mkconfig が自動的にマイクロコードのアップデートを処理します。マイクロコードのパッケージをインストールした後に以下のコマンドを実行して、grub の設定を再生成し、マイクロコードのアップデートのロードを有効にしてください:

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

手動ロード

もしくは、GRUB の設定ファイルを手動で管理したい場合、以下のように grub.cfg/boot/cpu_manufacturer-ucode.img (/boot パーティションを分けている場合は /cpu_manufacturer-ucode.img) を追加します:

/boot/grub/grub.cfg
...
echo 'Loading initial ramdisk'
initrd	/boot/cpu_manufacturer-ucode.img /boot/initramfs-linux.img
...

すべてのメニューエントリに追加してください。

systemd-boot

以下のように初期 RAM ディスクの前に initrd オプションを使ってマイクロコードをロード:

/boot/loader/entries/entry.conf
title   Arch Linux
linux   /vmlinuz-linux
initrd  /cpu_manufacturer-ucode.img
initrd  /initramfs-linux.img
...

最新のマイクロコード cpu_manufacturer-ucode.img が起動時に EFI システムパーティションに必要となります。amd-ucode または intel-ucode を更新したときはマイクロコードが更新されるように /boot に ESP をマウントしてください。もしくは ESP に /boot/cpu_manufacturer-ucode.img をコピーしてください。

EFI ブートスタブ / EFI ハンドオーバー

initrd= オプションを2つ追加:

initrd=/cpu_manufacturer-ucode.img initrd=/initramfs-linux.img

全ての initrd とコマンドライン、カーネルを含むひとつのファイルとしてカーネルを生成した場合、まず以下のように新しい initrd を作成して統合してください:

cat /boot/cpu_manufacturer-ucode.img /boot/initramfs-linux.img > my_new_initrd
objcopy ... --add-section .initrd=my_new_initrd

rEFInd

上記の EFI ブートスタブと同じように /boot/refind_linux.conf のブートオプションを編集する、例:

"Boot with standard options" "rw root=UUID=(...) initrd=/boot/cpu_manufacturer-ucode.img initrd=/boot/initramfs-linux.img"

手動esp/EFI/refind/refind.conf にカーネルを定義している場合はメインの部分ではなく options 行に /boot/cpu_manufacturer-ucode.img (/boot パーティションを分けている場合は /cpu_manufacturer-ucode.img) を追加してください。例:

options  "root=root=UUID=(...) rw add_efi_memmap initrd=/boot/cpu_manufacturer-ucode.img"

Syslinux

ノート: initrd ファイルの cpu_manufacturer-ucode.imginitramfs-linux の間に空白は挟まないで下さい。以下の記述そのままに編集するようにしてください。

/boot/syslinux/syslinux.cfg で複数の initrd をカンマで区切って指定できます:

LABEL arch
    MENU LABEL Arch Linux
    LINUX ../vmlinuz-linux
    INITRD ../cpu_manufacturer-ucode.img,../initramfs-linux.img
...

LILO

LILO などの旧式のブートローダーは複数の initrd イメージをサポートしていません。そのような場合 cpu_manufacturer-ucode.imginitramfs-linux.img をひとつのイメージにまとめる必要があります。

警告: カーネルをアップデートするたびに毎回イメージをマージして再生成する必要があります。
ノート: イメージの順番は重要です。オリジナルのイメージである initramfs-linuxcpu_manufacturer-ucode.img イメージよりも先に来るように結合する必要があります。

ふたつのイメージを initramfs-merged.img という名前のイメージにマージするには、以下のコマンドを使用:

# cat /boot/cpu_manufacturer-ucode.img /boot/initramfs-linux.img > /boot/initramfs-merged.img

マージできたら /etc/lilo.conf を編集して新しいイメージをロードします:

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

root で lilo を実行してください:

# lilo

起動後にマイクロコードをアップデート

システムを起動した後にマイクロコードのアップデートをロードすることもできます。/usr/lib/firmware/amd-ucode//usr/lib/firmware/intel-ucode/ のファイルを使用します。

AMD プロセッサの場合、マイクロコードのアップデートファイルは linux-firmware によって提供されます。

Intel プロセッサの場合、マイクロコードのアップデートファイルが含まれるパッケージはありません (FS#59841)。起動後にロードするには Intel が提供しているアーカイブから手動で intel-ucode/ を抽出する必要があります。

マイクロコードのアップデートを有効にする

起動初期のロードとは異なり、起動後のマイクロコードのアップデートのロードは Arch Linux ではデフォルトで有効になっており /usr/lib/tmpfiles.d/linux-firmware.conf を使用します。起動後に systemd-tmpfiles-setup.service(8) によってファイルが読み込まれて CPU のマイクロコードが更新されます。

実行中のシステムで手動でマイクロコードをアップデートするには:

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

このコマンドを使えば linux-firmware が更新されたときにシステムを再起動することなくマイクロコードのアップデートを適用することができます。pacman フックを使って自動的にコマンドを実行することも可能です:

/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 にファイルが含まれているため CPU のマイクロコードはアップデートされてしまいます (FS#59840)。起動後のロードを無効にしたい場合は /usr/lib/tmpfiles.d/linux-firmware.conf を無効にしてください。/etc/tmpfiles.d/ に同名のファイルを作成することで無効化できます:

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

起動時にマイクロコードのアップデートがされたか確認する

マイクロコードがアップデートされたかどうか確認するには /usr/bin/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_level=0x0700010f
[    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.

マイクロコードのアップデートができる CPU

特定のモデルがサポートされているのかどうかは以下のリンクから Intel や AMD のサイトで確認することができます:

マイクロコードのアップデートが必要かどうか確認する

iucode-tool を使って、使用している cpu のマイクロコードイメージが intel-ucode.img に含まれているかどうか確認できます:

  • intel-ucode をインストール (アップデートがあるかどうか確認するのに initrd の変更は必要ありません)
  • iucode-tool をインストール
  • # modprobe cpuid
  • # bsdtar -Oxf /boot/intel-ucode.img | iucode_tool -tb -lS -
    (マイクロコードイメージを展開して cpuid を検索します)
  • アップデートが存在する場合は、selected microcodes の下に表示されます。
  • メーカーの BIOS にマイクロコードが既に含まれていてロードされたことが dmesg に表示されていない可能性もあります。grep microcode /proc/cpuinfo を実行して現在のマイクロコードを比較してください。

カスタムカーネルで Intel のマイクロコードのロードを有効にする

カスタムカーネルでロードを行うには、"CPU microcode loading support" をカーネルに組み込む必要があります。モジュールとしてコンパイルしても動作しません。"Early load microcode" プロンプトが有効になるので "Y" に設定してください。

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

参照