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

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎遅延ロード: 「カーネルが汚染される」->「カーネルに汚染マークがつく」)
(同期)
(同じ利用者による、間の14版が非表示)
8行目: 8行目:
 
プロセッサの製造者はプロセッサ[[Wikipedia:ja:マイクロプログラム方式|マイクロコード]]に安定性とセキュリティのアップデートをリリースしています。そのようなアップデートには、システムの安定性に深く関わるバグフィックスが含まれています。これがないと、追跡困難な疑わしいクラッシュや予期しないシステム停止を引き起こす場合があります。
 
プロセッサの製造者はプロセッサ[[Wikipedia:ja:マイクロプログラム方式|マイクロコード]]に安定性とセキュリティのアップデートをリリースしています。そのようなアップデートには、システムの安定性に深く関わるバグフィックスが含まれています。これがないと、追跡困難な疑わしいクラッシュや予期しないシステム停止を引き起こす場合があります。
   
AMD や Intel CPU を持つすべてのユーザは、システムの安定性を確保するためにマイクロコードのアップデートをインストールすべきです。
+
AMD や Intel CPU を持つすべてのユーザは、システムの安定性を確保するためにマイクロコードのアップデートをインストールすべきです。仮想マシンやコンテナ内では、マイクロコードのアップデートはゲストシステムではなく、ホストに属します。
   
  +
== マイクロコードをロードする ==
通常、マイクロコードのアップデートはマザーボードのファームウェアに同梱されており、ファームウェアの初期化中に適用されます。しかし、OEM はファームウェアのアップデートをタイムリーにリリースしないかもしれない上、古いシステムでは新しいファームウェアアップデートは全くリリースされないので、起動中に CPU マイクロコードアップデートを適用する機能が Linux カーネルに追加されました。[https://docs.kernel.org/x86/microcode.html Linux マイクロコードローダ]は3つの方法をサポートします:
 
   
  +
通常、マイクロコードのアップデートはマザーボードのファームウェアに同梱されており、ファームウェアの初期化中に適用されます。しかし、OEM はファームウェアのアップデートをタイムリーにリリースしないかもしれない上、古いシステムでは新しいファームウェアアップデートは全くリリースされないので、起動中に CPU マイクロコードアップデートを適用する機能が Linux カーネルに追加されました。[https://docs.kernel.org/arch/x86/microcode.html Linux マイクロコードローダ]は3つの方法をサポートします:
# '''早期ロード''' は、起動中の非常に早い段階(initramfs ステージよりも前)でマイクロコードをアップデートします。なので、これは推奨される方法です。Intel の Haswell や Broadwell プロセッサファミリのように CPU に深刻なハードウェアバグが存在する場合、これは必須です。
 
# '''遅延ロード'''('''危険''') は、起動後にマイクロコードをアップデートします。CPU がバグのある命令セットの使用をすでに試みたかもしれないので、これでは遅すぎる可能性があります。「早期ロード」をすでに使用している場合でも、「遅延ロード」を使用して再起動せずに新しいマイクロコードのアップデートを適用できます。
 
# '''組み込みマイクロコード''' はカーネルにコンパイルされます。早期ローダ(early loader)により適用されます。
 
   
  +
# '''組み込みマイクロコード''' は、カーネルに組み込んでコンパイルし、早期ローダ (early loader) を使って適用することができます。
== 早期ロード ==
 
  +
# '''早期ロード''' は、起動中の非常に早い段階 (initramfs ステージよりも前) でマイクロコードをアップデートします。遅延ロードよりもこちらが推奨されます。Intel の Haswell や Broadwell プロセッサファミリのように CPU に深刻なハードウェアバグが存在する場合、早期ロードが必須です。
  +
# '''遅延ロード''' ([https://docs.kernel.org/arch/x86/microcode.html#why-is-late-loading-dangerous 危険]) は、起動後にマイクロコードをアップデートします。CPU が欠陥のある命令の使用をすでに試みたかもしれないので、これでは遅すぎる可能性があります。「早期ロード」をすでに使用している場合でも、「遅延ロード」を使用して再起動せずに新しいマイクロコードのアップデートを適用できます。
   
  +
更新されたマイクロコードを取得するには、プロセッサに応じて以下のいずれかのパッケージを[[インストール]]してください:
=== インストール ===
 
  +
* {{Pkg|amd-ucode}} : AMD プロセッサ
  +
* {{Pkg|intel-ucode}} : Intel プロセッサ
   
  +
=== 早期ロード ===
プロセッサに応じて以下のパッケージを[[インストール]]してください:
 
* {{Pkg|amd-ucode}} AMD プロセッサ向け
 
* {{Pkg|intel-ucode}} Intel プロセッサ向け
 
   
  +
マイクロコードは、カーネルに組み込まない場合、早期ローダ (early loader) によって読み込む必要があります。
マイクロコードは[[ブートローダー]]によって読み込まれなければなりません。初期ブート設定はユーザによって様々なので、マイクロコードのアップデートは Arch のデフォルト設定では自動的にトリガーされない場合があります。この点について AUR カーネルの多くは Arch の公式[[カーネル]]と同じようになっています。
 
   
  +
早期ローダは、マイクロコードのアップデートファイルが未圧縮 CPIO アーカイブ (initramfs イメージ) 内の {{ic|/kernel/x86/microcode/GenuineIntel.bin}} または {{ic|/kernel/x86/microcode/AuthenticAMD.bin}} として存在していることを期待します。
アップデートを有効にするには、{{ic|/boot/amd-ucode.img}} または {{ic|/boot/intel-ucode.img}} を'''ブートローダーの設定ファイルの 一番目の initrd''' として追加しなければなりません。これは、通常の initrd ファイルよりも前です。一般的なブートローダの場合における手順は以下を見てください。
 
   
  +
早期 initramfs イメージ (マイクロコードのアップデートファイル) は、メインの initramfs イメージと合体して1つのファイルにし、(ブートローダーで {{ic|1=initrd=}} カーネルコマンドラインオプションを使うか、unified カーネルイメージ内にパックして) 単一の initramfs ファイルとしてカーネルに渡すこともできますし、個別のファイルとして使用することもできます (この場合、{{ic|1=initrd=}} カーネルコマンドラインオプションを複数回使用する必要があります)。いずれにせよ、マイクロコードを含んでいる未圧縮 CPIO アーカイブはメインの initramfs より前に配置'''しなければなりません'''。
以下のセクションでは {{ic|''cpu_manufacturer''}} の部分をあなたの CPU の製造業者名に置き換えてください、例: {{ic|amd}} か {{ic|intel}}。
 
   
  +
注意点として、ユーザーの初期ブート構成は多様なので、Arch のデフォルトの設定ではマイクロコードのアップデートは自動的にトリガーされません。
{{Tip|[[リムーバブルメディアに Arch Linux をインストール|リムーバブルドライブ上の Arch Linux]] をこれらのプロセッサの両方で動かす可能性がある場合、両方のパッケージをインストールし両方のマイクロコードファイルを {{ic|initrd}} としてブートローダの設定に追加してください。initramfs イメージよりも前に指定していればファイルの順番は関係ありません。}}
 
   
  +
==== カスタムビルドされたカーネル ====
=== 設定 ===
 
   
  +
早期ローダーを[[カーネル/Arch build system|カスタムカーネル]]で動作させるには、"CPU microcode loading support" を、モジュールとしてコンパイルせずに、カーネルに組み込む必要があります。これにより "Early load microcode" プロンプトが有効化され、これを {{ic|Y}} に設定する必要があります。
==== カスタムカーネルでマイクロコードの早期ロードを有効化 ====
 
 
カスタムカーネルでロードを行うには、"CPU microcode loading support" をカーネルに組み込む必要があります。モジュールとしてコンパイルしても動作しません。"Early load microcode" プロンプトが有効になるので "Y" に設定してください。
 
   
 
CONFIG_BLK_DEV_INITRD=Y
 
CONFIG_BLK_DEV_INITRD=Y
43行目: 41行目:
 
CONFIG_MICROCODE_AMD=y
 
CONFIG_MICROCODE_AMD=y
   
==== GRUB ====
+
==== Unified カーネルイメージ ====
  +
  +
[[Unified カーネルイメージ]] の記事で、単一ファイルのイメージにマイクロコードを埋め込む方法を見てください。
  +
  +
==== マイクロコード initramfs とメインの initramfs を1つのファイルに一緒にパックする ====
  +
  +
未圧縮のマイクロコード CPIO は [https://docs.kernel.org/arch/x86/microcode.html#early-load-microcode initramfs の先頭に追加する]ことが可能であり、単一の initramfs ファイルとして利用できるようになります。この方法は、追加のブートパラメータの設定が必要ないため、[[#別個のマイクロコード initramfs ファイルを使う]] の方法よりも推奨されます。
  +
  +
[[mkinitcpio]] と [[dracut]] は、このような複数のファイルが混合された initramfs ファイルの生成をサポートしており、この動作がデフォルトです。しかし、[[Booster]] は[https://github.com/anatol/booster/issues/40 複数のファイルが混合された initramfs ファイルの生成をサポートしていません]。
  +
  +
===== mkinitcpio =====
  +
  +
[[mkinitcpio]] でマイクロコードを含んでいる initramfs ファイルを生成するには、{{ic|/etc/mkinitcpio.conf}} の {{ic|HOOKS}} 配列に {{ic|microcode}} フックが含まれていることを確認してください。
  +
  +
{{ic|autodetect}} フックが {{ic|microcode}} フックよりも前にある場合、現在使用している CPU のマイクロコードのみが追加されます。システム上に存在する全ての CPU マイクロコードファイルを追加するには、{{ic|microcode}} フックを {{ic|autodetect}} フックより前に移動するか、{{ic|autodetect}} フックを削除してください。
  +
  +
Initramfs の生成時に ''mkinitcpio'' は以下のようなメッセージを表示します:
  +
  +
-> Early uncompressed CPIO image generation successful
  +
  +
{{man|1|lsinitcpio}} コマンドを使えば、マイクロコードのアップデートファイルが initramfs 内に存在していることを確認できます。例えば:
  +
  +
{{hc|# lsinitcpio --early /boot/initramfs-linux.img|
  +
early_cpio
  +
kernel/
  +
kernel/x86/
  +
kernel/x86/microcode/
  +
kernel/x86/microcode/AuthenticAMD.bin
  +
}}
  +
  +
===== dracut =====
  +
  +
[[dracut]] に関しては {{man|5|dracut.conf|DESCRIPTION}} を見てください。
  +
  +
==== 別個のマイクロコード initramfs ファイルを使う ====
  +
  +
先の方法を用いない場合、マイクロコードの早期アップデートは {{ic|/boot/amd-ucode.img}} や {{ic|/boot/intel-ucode.img}} を'''ブートローダーの設定ファイルで最初の initrd''' として追加することで有効化する必要があります。マイクロコードの initrd は通常の initrd ファイルよりも前に来る必要があります。一般的なブートローダーにおける手順は以下を参照してください。
  +
  +
以下の章では、{{ic|''cpu_manufacturer''}} という記述はあなたの CPU の製造業者名 (つまり、{{ic|amd}} か {{ic|intel}}) に置き換えてください。
  +
  +
===== GRUB =====
   
 
''grub-mkconfig'' はマイクロコードのアップデートを自動的に検出し、[[GRUB]] を適切に設定します。マイクロコードのインストール後に以下を実行して GRUB 設定ファイルを再生成し、マイクロコードアップデートのロードを有効化してください:
 
''grub-mkconfig'' はマイクロコードのアップデートを自動的に検出し、[[GRUB]] を適切に設定します。マイクロコードのインストール後に以下を実行して GRUB 設定ファイルを再生成し、マイクロコードアップデートのロードを有効化してください:
60行目: 98行目:
 
それぞれのメニュエントリに対してこれを行ってください。
 
それぞれのメニュエントリに対してこれを行ってください。
   
==== systemd-boot ====
+
===== systemd-boot =====
   
以下のように初期 RAM ディスク前に {{ic|initrd}} オプションを使マイクロコードをロード:
+
以下のように、マイクロコードを読み込むオプションを初期 RAM ディスクより前に使用しください:
   
 
{{hc|/boot/loader/entries/''entry''.conf|
 
{{hc|/boot/loader/entries/''entry''.conf|
74行目: 112行目:
 
最新のマイクロコード {{ic|''cpu_manufacturer''-ucode.img}} は起動時に [[EFI システムパーティション]] (ESP) に存在していなければなりません。{{Pkg|amd-ucode}} または {{Pkg|intel-ucode}} を更新したときはマイクロコードが更新されるように {{ic|/boot}} に ESP をマウントしてください。もしくは、マイクロコードパッケージのアップデートがあるたびに ESP に {{ic|/boot/''cpu_manufacturer''-ucode.img}} をコピーしてください。
 
最新のマイクロコード {{ic|''cpu_manufacturer''-ucode.img}} は起動時に [[EFI システムパーティション]] (ESP) に存在していなければなりません。{{Pkg|amd-ucode}} または {{Pkg|intel-ucode}} を更新したときはマイクロコードが更新されるように {{ic|/boot}} に ESP をマウントしてください。もしくは、マイクロコードパッケージのアップデートがあるたびに ESP に {{ic|/boot/''cpu_manufacturer''-ucode.img}} をコピーしてください。
   
==== Unified カーネルイメージ ====
+
===== EFISTUB =====
 
[[Unified カーネルイメージ#手動で]] を見てください。
 
 
==== EFISTUB ====
 
   
 
2つの {{ic|1=initrd=}} オプションを末尾に追加してください:
 
2つの {{ic|1=initrd=}} オプションを末尾に追加してください:
84行目: 118行目:
 
'''initrd=\''cpu_manufacturer''-ucode.img''' initrd=\initramfs-linux.img
 
'''initrd=\''cpu_manufacturer''-ucode.img''' initrd=\initramfs-linux.img
   
==== rEFInd ====
+
===== rEFInd =====
   
  +
{{Tip|以前に {{ic|initrd}} カーネルパラメータを指定しなかったユーザは、複数の {{ic|initrd}} パラメータを渡せるようにするために [[rEFInd#設定]] で説明されている手順に従う必要があります。}}
{{ic|/boot/refind_linux.conf}} のブートオプションを編集し、{{ic|1=initrd=boot\''cpu_manufacturer''-ucode.img}} を最初の initramfs として追加してください( {{ic|/boot}} が別のパーティションに存在する場合は {{ic|1=initrd=''cpu_manufacturer''-ucode.img}})。例えば:
 
   
  +
{{ic|/boot/refind_linux.conf}} のブートオプションを編集し、マイクロコードイメージをロードするための {{ic|1=initrd=}} オプションを最初の {{ic|initrd}} 引数として追加してください。{{ic|/boot}} 内のファイルが別のパーティションの直下にあるかどうかに応じて、{{ic|1=initrd=boot\''cpu_manufacturer''-ucode.img}} か {{ic|1=initrd=''cpu_manufacturer''-ucode.img}} のどちらかを使ってください。
"Boot using default options" "root=PARTUUID=''XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'' rw add_efi_memmap '''initrd=boot\''cpu_manufacturer''-ucode.img''' initrd=boot\initramfs-%v.img"
 
   
  +
マイクロコードは、ブートオプションのリストの中で最初に宣言された initramfs でなければなりません。例えば:
{{Tip|以前に {{ic|initrd}} カーネルパラメータを指定しなかったユーザは、複数の {{ic|initrd}} パラメータを渡すために [[rEFInd#設定]] で説明されている手順に従う必要があります。}}
 
   
  +
"Boot using default options" "root=PARTUUID=''XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'' rw add_efi_memmap initrd=boot\''cpu_manufacturer''-ucode.img initrd=boot\initramfs-%v.img"
[[rEFInd#手動でブートエントリを記述|手動]]で {{ic|''esp''/EFI/refind/refind.conf}} にカーネルを定義している場合はメインの部分ではなく options 行に {{ic|/boot/''cpu_manufacturer''-ucode.img}} ({{ic|/boot}} パーティションを分けている場合は {{ic|/''cpu_manufacturer''-ucode.img}}) を追加してください。例:
 
  +
  +
====== 手動でブートオプションを記述する ======
  +
  +
[[rEFInd#手動でブートエントリを記述する|手動]]で {{ic|''esp''/EFI/refind/refind.conf}} にカーネルを定義している場合は、{{ic|1=initrd=}} パラメータを追加して、ブートパーティション内の適切なパスに設定する必要があります。このパラメータは options 行の一部である必要があり、設定のメインの部分ではありません。例:
   
 
options "root=PARTUUID=''XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'' rw add_efi_memmap '''initrd=boot\''cpu_manufacturer''-ucode.img'''"
 
options "root=PARTUUID=''XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'' rw add_efi_memmap '''initrd=boot\''cpu_manufacturer''-ucode.img'''"
   
==== Syslinux ====
+
===== Syslinux =====
   
 
{{Note|initrd ファイルの {{ic|''cpu_manufacturer''-ucode.img}} と {{ic|initramfs-linux}} の間に空白は挟まないで下さい。{{ic|INITRD}} の行は以下の記述そのままに編集しなければなりません。}}
 
{{Note|initrd ファイルの {{ic|''cpu_manufacturer''-ucode.img}} と {{ic|initramfs-linux}} の間に空白は挟まないで下さい。{{ic|INITRD}} の行は以下の記述そのままに編集しなければなりません。}}
108行目: 146行目:
 
...
 
...
   
==== LILO ====
+
===== LILO =====
   
[[LILO]] などの旧式のブートローダーは複数の initrd イメージをサポートしていませんそのような場合 {{ic|''cpu_manufacturer''-ucode.img}}{{ic|initramfs-linux.img}}ひとつのイメージまとめる必要があります。
+
[[LILO]] は複数の初期 RAM ディスクイメージの読み込みをサポートしておらず、他の古ブートローダーも同じくサポートしていない可能性があり代わりに [[#マイクロコード initramfsメインの initramfs を1つのファ一緒にパックる]] で説明されている方法に従ってください
   
  +
===== Limine =====
{{Warning|カーネルをアップデートするたびに毎回イメージをマージして再生成する必要があります。}}
 
   
  +
[[Limine]] においては、[[Limine#設定|limine.cfg]] ファイル内の {{ic|MODULE_PATH}} オプションにマイクロコードへのパスを追加するだけで良いです。以下は例です:
{{Note|イメージの順番は重要です。オリジナルのイメージである {{ic|initramfs-linux}} は {{ic|''cpu_manufacturer''-ucode.img}} イメージよりも先に来るように結合する必要があります。}}
 
   
  +
{{hc|limine.cfg|2=
ふたつのイメージを {{ic|initramfs-merged.img}} という名前のイメージにマージするには、以下のコマンドを使用:
 
  +
DEFAULT_ENTRY=1
  +
TIMEOUT=3
   
  +
:Arch
# cat /boot/''cpu_manufacturer''-ucode.img /boot/initramfs-linux.img > /boot/initramfs-merged.img
 
  +
COMMENT=Arch Linux
   
  +
PROTOCOL=linux
マージできたら {{ic|/etc/lilo.conf}} を編集して新しいイメージをロードします:
 
  +
KERNEL_PATH=boot:///vmlinuz-linux
 
  +
CMDLINE=root=UUID=c0748521-eca9-4f38-989c-43811b6e39a1 rw loglevel=3
...
 
  +
'''MODULE_PATH=boot:///''cpu_manufacturer-ucode''.img'''
initrd=/boot/initramfs-merged.img
 
  +
MODULE_PATH=boot:///initramfs-linux.img
...
 
  +
}}
 
root で {{ic|lilo}} を実行してください:
 
 
# lilo
 
 
== 遅延ロード ==
 
   
  +
=== 遅延ロード ===
{{Warning|1=マイクロコードの遅延ロードは危険であるとみなされています(Linux 5.19 で遅延ロードを行うとカーネルに汚染マークが付きます)。[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=9784edd73a08ea08d0ce5606e1f0f729df688c59]}}
 
   
マイクロコードアップデートの遅延ロードはシステムの起動後に行われます。{{ic|/usr/lib/firmware/amd-ucode/}} {{ic|/usr/lib/firmware/intel-ucode/}} 内のファイルが使用されますLinux 5.19+ で遅延ロードを行うには、{{ic|1=CONFIG_MICROCODE_LATE_LOADING=y}} でカーネルをビルドする必要あります。
+
{{Warning|1=マイクロコードの遅延ロードは危険であるみなされています(Linux 5.19 以降で遅延ロードを行うカーネルに汚染マーク付きます)[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=9784edd73a08ea08d0ce5606e1f0f729df688c59]}}
   
AMD プ場合、マイクロコードのアップデートファイルは {{Pkg|linux-firmware}} によ提供されます。
+
マイクコードアプデート遅延ロードはシステムが起動し終わった後に行われます。その時、{{ic|/usr/lib/firmware/amd-ucode/}} と {{ic|/usr/lib/firmware/intel-ucode/}} にあるファイルが使用されます。AMD CPU と Intel CPU のマイクロコードのアップデートファイルは、それぞれ {{Pkg|amd-ucode}} と {{Pkg|intel-ucode}} によって提供されています。
   
  +
遅延ロードを行うには、{{ic|1=CONFIG_MICROCODE_LATE_LOADING=y}} でビルドされたカーネルが必要です。現時点では、Arch の[[カーネル#公式サポートカーネル|公式サポートカーネル]]はこのフラグが有効化されていません。[https://gitlab.archlinux.org/archlinux/packaging/packages/linux/-/blob/8d50b29ca6b927096ecf678cec193fc230b447cd/config#L462]
Intel プロセッサの場合、マイクロコードのアップデートファイルが含まれるパッケージはありません ({{Bug|59841}})。遅延ロードするには [https://github.com/intel/Intel-Linux-Processor-Microcode-Data-Files/releases Intel が提供しているアーカイブ]から手動で {{ic|intel-ucode/}} を抽出する必要があります。
 
   
=== マイクロコードの遅延アップデートを有効化 ===
+
==== マイクロコードのアップデートの遅延ロード ====
   
早期ロードとは異なり、マイクロコードアップデートの遅延ロードArch Linux ではデフォルトで有効になっており {{ic|/usr/lib/tmpfiles.d/linux-firmware.conf}} を使用します。起動後に {{man|8|systemd-tmpfiles-setup.service}} によってファイルが読み込まれて CPU のマイクロコードが更新されます。
+
実行中のシステムで手動でマイクロコードアップデートするに(例: {{ic|/usr/lib/firmware/amd-ucode/}} {{ic|/usr/lib/firmware/intel-ucode/}} のマイクロコードファイルをアップデートした後に):
 
実行中のシステムで手動でマイクロコードをアップデートするには(例: {{ic|/usr/lib/firmware/amd-ucode/}} か {{ic|/usr/lib/firmware/intel-ucode/}} 内のマイクロコードファイルをアップデートした後):
 
   
 
# echo 1 > /sys/devices/system/cpu/microcode/reload
 
# echo 1 > /sys/devices/system/cpu/microcode/reload
   
 
これにより、システムを再起動せずに新しいマイクロコードのアップデートを適用できます。
 
これにより、システムを再起動せずに新しいマイクロコードのアップデートを適用できます。
 
=== マイクロコードの遅延アップデートを無効化 ===
 
 
AMD 環境では {{Pkg|amd-ucode}} がインストールされてなくても、{{ic|/usr/lib/firmware/amd-ucode/}} 内のファイルが {{Pkg|linux-firmware}} パッケージにより提供されるため、CPU のマイクロコードはアップデートされてしまいます ({{Bug|59840}})。
 
 
[[仮想マシン]]と[[Wikipedia:Container (virtualization)|コンテナ]]では({{Bug|46591}})、CPU のマイクロコードをアップできません。なので、マイクロコードのアップデートを無効化したほうが良いでしょう。
 
 
マイクロコードの危険な遅延ロードを無効にしたい場合、{{Pkg|linux-firmware}} により提供される {{ic|/usr/lib/tmpfiles.d/linux-firmware.conf}} [[tmpfiles|tmpfile]] を上書きしてください。{{ic|/etc/tmpfiles.d/}} に同名のファイルを作成することで無効化できます:
 
 
# ln -s /dev/null /etc/tmpfiles.d/linux-firmware.conf
 
 
== initramfs に埋め込まれたマイクロコード ==
 
 
使用中の initramfs ジェネレータがすでに [https://docs.kernel.org/x86/microcode.html#early-load-microcode マイクロコード cpio を initramfs に付加しているのであれば]、[[#早期ロード]]と[[#遅延ロード]]は必要ありません。例えば、[[dracut]] はデフォルトでこれを行います。{{man|5|dracut.conf|DESCRIPTION}} を見てください。
 
 
{{Expansion|What about mkinitcpio and Booster?}}
 
{{Accuracy|[[#カスタムカーネルでマイクロコードの早期ロードを有効化]] の場合は?}}
 
{{Expansion|The [[#top|introduction]] does not cover this section.}}
 
   
 
== 起動時にマイクロコードのアップデートがされたか確認する ==
 
== 起動時にマイクロコードのアップデートがされたか確認する ==
172行目: 188行目:
 
マイクロコードがアップデートされたかどうか確認するには ''journalctl'' でカーネルメッセージを確認してください:
 
マイクロコードがアップデートされたかどうか確認するには ''journalctl'' でカーネルメッセージを確認してください:
   
# journalctl -k --grep=microcode
+
# journalctl -k --grep='microcode:'
   
Intel が載っているシステムでは、起動時に以下のような表示がされす(以下ではマイクロコードが非常に早い段階でアップデートされていることを示しています):
+
ブート時に毎回以下のような出力されるはずで (以下ではマイクロコードが非常に早い段階でアップデートされていることを示しています):
   
microcode: microcode updated early to revision 0xde, date = 2020-05-18
+
kernel: microcode: Current revision: 0x00000012
microcode: sig=0x806ec, pf=0x80, revision=0xde
+
kernel: microcode: Updated early from: 0x0000000e
microcode: Microcode Update Driver: v2.2.
 
   
{{Note|表示される日付{{pkg|intel-ucode}} パッケバージョンとは応しません。Intel マイクロコードのアップデートを行った最後の日付表示されます。}}
+
場合によって(特に最新のハドウェア場合)、 CPU に対するマイクロコードのアップデートが無い場合もあります。
   
最新のハードウェアの場合CPU のマイクロコードアップデート存在しないという可能性も考えらます。そときは、以下ような出力されます:
+
AMD システムで遅延ロードを使用すると新しいマイクロコードが再読み込みさる前古い方バージョン表示されます
 
microcode: sig=0x806ec, pf=0x80, revision=0xde
 
microcode: Microcode Update Driver: v2.2.
 
 
AMD 環境でマイクロコードを早期ロードしている場合、以下のように出力されます:
 
 
microcode: microcode updated early to new patch_level=0x0700010f
 
microcode: CPU0: patch_level=0x0700010f
 
microcode: CPU1: patch_level=0x0700010f
 
microcode: CPU2: patch_level=0x0700010f
 
microcode: CPU3: patch_level=0x0700010f
 
microcode: Microcode Update Driver: v2.2.
 
 
AMD 環境で起動後にマイクロコードをアップデートしている場合、古いマイクロコードのバージョンが表示されてからマイクロコードがリロードされ、新しいマイクロコードのバージョンが表示されます。例:
 
 
microcode: CPU0: patch_level=0x0700010b
 
microcode: CPU1: patch_level=0x0700010b
 
microcode: CPU2: patch_level=0x0700010b
 
microcode: CPU3: patch_level=0x0700010b
 
microcode: Microcode Update Driver: v2.2.
 
microcode: CPU2: new patch_level=0x0700010f
 
microcode: CPU0: new patch_level=0x0700010f
 
microcode: CPU1: new patch_level=0x0700010f
 
microcode: CPU3: new patch_level=0x0700010f
 
x86/CPU: CPU features have changed after loading microcode, but might not take effect.
 
   
 
== マイクロコードのアップデートができる CPU ==
 
== マイクロコードのアップデートができる CPU ==
213行目: 203行目:
 
特定のモデルがサポートされているのかどうかは以下のリンクから Intel のサイトや AMD の Gentoo Wiki サイトで確認することができます:
 
特定のモデルがサポートされているのかどうかは以下のリンクから Intel のサイトや AMD の Gentoo Wiki サイトで確認することができます:
   
* [[Gentoo:AMD microcode#Specific firmware only]]。
+
* [[Gentoo:AMD microcode#Microcode firmware files]]。
 
* [https://downloadcenter.intel.com/SearchResult.aspx?lang=eng&keyword=processor%20microcode%20data%20file Intel のダウンロードセンター]。
 
* [https://downloadcenter.intel.com/SearchResult.aspx?lang=eng&keyword=processor%20microcode%20data%20file Intel のダウンロードセンター]。
   
 
=== マイクロコードのアップデートが必要かどうか確認する ===
 
=== マイクロコードのアップデートが必要かどうか確認する ===
   
{{Pkg|iucode-tool}} を使って、使用している CPU のマイクロコードイメージが {{ic|intel-ucode.img}} に含まれているかどうか確認できます。
+
Intel CPU の場合は、{{man|8|iucode_tool}} コマンドを使うことで現在使用中の CPU 向けのマイクロコードが {{ic|/usr/lib/firmware/intel-ucode/}} に含まれているかどうか確認することができます。
   
# {{Pkg|intel-ucode}} を[[インストール]] (アップデートがあるかどうか確認するのに initrd の変更は必要ありません)
+
# {{Pkg|intel-ucode}} と {{Pkg|iucode-tool}} を[[インストール]]してください。
# {{Pkg|iucode-tool}} を[[インストール]]
 
 
# {{ic|cpuid}} カーネルモジュールをロード: {{bc|# modprobe cpuid}}
 
# {{ic|cpuid}} カーネルモジュールをロード: {{bc|# modprobe cpuid}}
# マイクロコードイメージを展開して cpuid 検索:<br/>{{bc|# bsdtar -Oxf /boot/intel-ucode.img {{!}} iucode_tool -tb -lS -}}
+
# 該当する cpuid 検索: {{bc|$ iucode_tool -lS /usr/lib/firmware/intel-ucode/}}
 
# アップデートが存在する場合は、''selected microcodes'' の下に表示されます。
 
# アップデートが存在する場合は、''selected microcodes'' の下に表示されます。
 
# メーカーの BIOS にマイクロコードが既に含まれていてロードされたことが ''dmesg'' に表示されていない可能性もあります。{{ic|grep microcode /proc/cpuinfo}} を実行して現在のマイクロコードを比較してください。
 
# メーカーの BIOS にマイクロコードが既に含まれていてロードされたことが ''dmesg'' に表示されていない可能性もあります。{{ic|grep microcode /proc/cpuinfo}} を実行して現在のマイクロコードを比較してください。
  +
  +
AMD CPU の場合、手動により確認することができます。
  +
  +
# {{man|1|lscpu}} か {{ic|/proc/cpuinfo}} の出力を見る。
  +
# CPU のファミリ、モデル、ステッピングを確認する。これらの値を16進数に変更する。
  +
# {{ic|/usr/lib/firmware/amd-ucode/README}} に書かれてあるリストにそれらの値とマッチするものを見つける。
  +
# 見つかった場合は、現在使用中のマイクロコードのバージョンとリストにある {{ic|Patch}} の値を比較する。
  +
  +
== マイクロコードローダーを無効化する ==
  +
  +
更新後の CPU マイクロコードが問題を引き起こす場合、一時的にマイクロコードローダーを無効化してブートできるようにし、パッケージをダウングレードする必要がある場合があります。カーネルのマイクロコードローダーを無効化するには、{{ic|dis_ucode_ldr}} [[カーネルパラメータ]]を指定してください。
   
 
== 参照 ==
 
== 参照 ==
231行目: 231行目:
 
* [https://flossexperiences.wordpress.com/2013/11/17/updating-microcodes/ Updating microcodes – Experiences in the community]
 
* [https://flossexperiences.wordpress.com/2013/11/17/updating-microcodes/ Updating microcodes – Experiences in the community]
 
* [http://inertiawar.com/microcode/ Intel マイクロコードアップデートのノート – Ben Hawkes]
 
* [http://inertiawar.com/microcode/ Intel マイクロコードアップデートのノート – Ben Hawkes]
* [https://docs.kernel.org/x86/microcode.html カーネルマイクロコードローダ – カーネルドキュメント]
+
* [https://docs.kernel.org/arch/x86/microcode.html カーネルマイクロコードローダ – カーネルドキュメント]
 
* [https://www.anandtech.com/show/8376/intel-disables-tsx-instructions-erratum-found-in-haswell-haswelleep-broadwelly Haswell/Broadwell で見つかったエラッタ – AnandTech]
 
* [https://www.anandtech.com/show/8376/intel-disables-tsx-instructions-erratum-found-in-haswell-haswelleep-broadwelly Haswell/Broadwell で見つかったエラッタ – AnandTech]
 
* [https://gitlab.com/iucode-tool/iucode-tool iucode-tool GitLab プロジェクト]
 
* [https://gitlab.com/iucode-tool/iucode-tool iucode-tool GitLab プロジェクト]
  +
  +
{{TranslationStatus|Microcode|2024-03-28|804655}}

2024年3月28日 (木) 06:53時点における版

プロセッサの製造者はプロセッサマイクロコードに安定性とセキュリティのアップデートをリリースしています。そのようなアップデートには、システムの安定性に深く関わるバグフィックスが含まれています。これがないと、追跡困難な疑わしいクラッシュや予期しないシステム停止を引き起こす場合があります。

AMD や Intel CPU を持つすべてのユーザは、システムの安定性を確保するためにマイクロコードのアップデートをインストールすべきです。仮想マシンやコンテナ内では、マイクロコードのアップデートはゲストシステムではなく、ホストに属します。

マイクロコードをロードする

通常、マイクロコードのアップデートはマザーボードのファームウェアに同梱されており、ファームウェアの初期化中に適用されます。しかし、OEM はファームウェアのアップデートをタイムリーにリリースしないかもしれない上、古いシステムでは新しいファームウェアアップデートは全くリリースされないので、起動中に CPU マイクロコードアップデートを適用する機能が Linux カーネルに追加されました。Linux マイクロコードローダは3つの方法をサポートします:

  1. 組み込みマイクロコード は、カーネルに組み込んでコンパイルし、早期ローダ (early loader) を使って適用することができます。
  2. 早期ロード は、起動中の非常に早い段階 (initramfs ステージよりも前) でマイクロコードをアップデートします。遅延ロードよりもこちらが推奨されます。Intel の Haswell や Broadwell プロセッサファミリのように CPU に深刻なハードウェアバグが存在する場合、早期ロードが必須です。
  3. 遅延ロード (危険) は、起動後にマイクロコードをアップデートします。CPU が欠陥のある命令の使用をすでに試みたかもしれないので、これでは遅すぎる可能性があります。「早期ロード」をすでに使用している場合でも、「遅延ロード」を使用して再起動せずに新しいマイクロコードのアップデートを適用できます。

更新されたマイクロコードを取得するには、プロセッサに応じて以下のいずれかのパッケージをインストールしてください:

早期ロード

マイクロコードは、カーネルに組み込まない場合、早期ローダ (early loader) によって読み込む必要があります。

早期ローダは、マイクロコードのアップデートファイルが未圧縮 CPIO アーカイブ (initramfs イメージ) 内の /kernel/x86/microcode/GenuineIntel.bin または /kernel/x86/microcode/AuthenticAMD.bin として存在していることを期待します。

早期 initramfs イメージ (マイクロコードのアップデートファイル) は、メインの initramfs イメージと合体して1つのファイルにし、(ブートローダーで initrd= カーネルコマンドラインオプションを使うか、unified カーネルイメージ内にパックして) 単一の initramfs ファイルとしてカーネルに渡すこともできますし、個別のファイルとして使用することもできます (この場合、initrd= カーネルコマンドラインオプションを複数回使用する必要があります)。いずれにせよ、マイクロコードを含んでいる未圧縮 CPIO アーカイブはメインの initramfs より前に配置しなければなりません

注意点として、ユーザーの初期ブート構成は多様なので、Arch のデフォルトの設定ではマイクロコードのアップデートは自動的にトリガーされません。

カスタムビルドされたカーネル

早期ローダーをカスタムカーネルで動作させるには、"CPU microcode loading support" を、モジュールとしてコンパイルせずに、カーネルに組み込む必要があります。これにより "Early load microcode" プロンプトが有効化され、これを Y に設定する必要があります。

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

Unified カーネルイメージ

Unified カーネルイメージ の記事で、単一ファイルのイメージにマイクロコードを埋め込む方法を見てください。

マイクロコード initramfs とメインの initramfs を1つのファイルに一緒にパックする

未圧縮のマイクロコード CPIO は initramfs の先頭に追加することが可能であり、単一の initramfs ファイルとして利用できるようになります。この方法は、追加のブートパラメータの設定が必要ないため、#別個のマイクロコード initramfs ファイルを使う の方法よりも推奨されます。

mkinitcpiodracut は、このような複数のファイルが混合された initramfs ファイルの生成をサポートしており、この動作がデフォルトです。しかし、Booster複数のファイルが混合された initramfs ファイルの生成をサポートしていません

mkinitcpio

mkinitcpio でマイクロコードを含んでいる initramfs ファイルを生成するには、/etc/mkinitcpio.confHOOKS 配列に microcode フックが含まれていることを確認してください。

autodetect フックが microcode フックよりも前にある場合、現在使用している CPU のマイクロコードのみが追加されます。システム上に存在する全ての CPU マイクロコードファイルを追加するには、microcode フックを autodetect フックより前に移動するか、autodetect フックを削除してください。

Initramfs の生成時に mkinitcpio は以下のようなメッセージを表示します:

-> Early uncompressed CPIO image generation successful

lsinitcpio(1) コマンドを使えば、マイクロコードのアップデートファイルが initramfs 内に存在していることを確認できます。例えば:

# lsinitcpio --early /boot/initramfs-linux.img
early_cpio
kernel/
kernel/x86/
kernel/x86/microcode/
kernel/x86/microcode/AuthenticAMD.bin
dracut

dracut に関しては dracut.conf(5) § DESCRIPTION を見てください。

別個のマイクロコード initramfs ファイルを使う

先の方法を用いない場合、マイクロコードの早期アップデートは /boot/amd-ucode.img/boot/intel-ucode.imgブートローダーの設定ファイルで最初の initrd として追加することで有効化する必要があります。マイクロコードの initrd は通常の initrd ファイルよりも前に来る必要があります。一般的なブートローダーにおける手順は以下を参照してください。

以下の章では、cpu_manufacturer という記述はあなたの CPU の製造業者名 (つまり、amdintel) に置き換えてください。

GRUB

grub-mkconfig はマイクロコードのアップデートを自動的に検出し、GRUB を適切に設定します。マイクロコードのインストール後に以下を実行して GRUB 設定ファイルを再生成し、マイクロコードアップデートのロードを有効化してください:

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

あるいは、GRUB 設定ファイルを手動で管理しているユーザは、以下のように /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 ディスクより前に使用してください:

/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 システムパーティション (ESP) に存在していなければなりません。amd-ucode または intel-ucode を更新したときはマイクロコードが更新されるように /boot に ESP をマウントしてください。もしくは、マイクロコードパッケージのアップデートがあるたびに ESP に /boot/cpu_manufacturer-ucode.img をコピーしてください。

EFISTUB

2つの initrd= オプションを末尾に追加してください:

initrd=\cpu_manufacturer-ucode.img initrd=\initramfs-linux.img
rEFInd
ヒント: 以前に initrd カーネルパラメータを指定しなかったユーザは、複数の initrd パラメータを渡せるようにするために rEFInd#設定 で説明されている手順に従う必要があります。

/boot/refind_linux.conf のブートオプションを編集し、マイクロコードイメージをロードするための initrd= オプションを最初の initrd 引数として追加してください。/boot 内のファイルが別のパーティションの直下にあるかどうかに応じて、initrd=boot\cpu_manufacturer-ucode.imginitrd=cpu_manufacturer-ucode.img のどちらかを使ってください。

マイクロコードは、ブートオプションのリストの中で最初に宣言された initramfs でなければなりません。例えば:

"Boot using default options"  "root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rw add_efi_memmap initrd=boot\cpu_manufacturer-ucode.img initrd=boot\initramfs-%v.img"
手動でブートオプションを記述する

手動esp/EFI/refind/refind.conf にカーネルを定義している場合は、initrd= パラメータを追加して、ブートパーティション内の適切なパスに設定する必要があります。このパラメータは options 行の一部である必要があり、設定のメインの部分ではありません。例:

options  "root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rw add_efi_memmap initrd=boot\cpu_manufacturer-ucode.img"
Syslinux
ノート: initrd ファイルの cpu_manufacturer-ucode.imginitramfs-linux の間に空白は挟まないで下さい。INITRD の行は以下の記述そのままに編集しなければなりません。

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

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

LILO は複数の初期 RAM ディスクイメージの読み込みをサポートしておらず、他の古いブートローダーも同じくサポートしていない可能性があります。代わりに #マイクロコード initramfs とメインの initramfs を1つのファイルに一緒にパックする で説明されている方法に従ってください。

Limine

Limine においては、limine.cfg ファイル内の MODULE_PATH オプションにマイクロコードへのパスを追加するだけで良いです。以下は例です:

limine.cfg
DEFAULT_ENTRY=1
TIMEOUT=3

:Arch
    COMMENT=Arch Linux

    PROTOCOL=linux
    KERNEL_PATH=boot:///vmlinuz-linux
    CMDLINE=root=UUID=c0748521-eca9-4f38-989c-43811b6e39a1 rw loglevel=3
    MODULE_PATH=boot:///cpu_manufacturer-ucode.img
    MODULE_PATH=boot:///initramfs-linux.img

遅延ロード

警告: マイクロコードの遅延ロードは危険であるとみなされています(Linux 5.19 以降で遅延ロードを行うとカーネルに汚染マークが付きます)。[1]

マイクロコードアップデートの遅延ロードは、システムが起動し終わった後に行われます。その時、/usr/lib/firmware/amd-ucode//usr/lib/firmware/intel-ucode/ にあるファイルが使用されます。AMD CPU と Intel CPU のマイクロコードのアップデートファイルは、それぞれ amd-ucodeintel-ucode によって提供されています。

遅延ロードを行うには、CONFIG_MICROCODE_LATE_LOADING=y でビルドされたカーネルが必要です。現時点では、Arch の公式サポートカーネルはこのフラグが有効化されていません。[2]

マイクロコードのアップデートの遅延ロード

実行中のシステムで手動でマイクロコードをアップデートするには (例: /usr/lib/firmware/amd-ucode//usr/lib/firmware/intel-ucode/ 内のマイクロコードファイルをアップデートした後に):

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

これにより、システムを再起動せずに新しいマイクロコードのアップデートを適用できます。

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

マイクロコードがアップデートされたかどうか確認するには journalctl でカーネルメッセージを確認してください:

# journalctl -k --grep='microcode:'

ブート時に毎回以下のような出力がなされるはずです (以下ではマイクロコードが非常に早い段階でアップデートされていることを示しています):

kernel: microcode: Current revision: 0x00000012
kernel: microcode: Updated early from: 0x0000000e

場合によっては (特に最新のハードウェアの場合)、対象 CPU に対するマイクロコードのアップデートが無い場合もあります。

AMD システムで遅延ロードを使用すると、新しいマイクロコードが再読み込みされる前の古い方のバージョンが表示されます。

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

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

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

Intel CPU の場合は、iucode_tool(8) コマンドを使うことで、現在使用中の CPU 向けのマイクロコードが /usr/lib/firmware/intel-ucode/ に含まれているかどうかを確認することができます。

  1. intel-ucodeiucode-toolインストールしてください。
  2. cpuid カーネルモジュールをロード:
    # modprobe cpuid
  3. 該当する cpuid を検索:
    $ iucode_tool -lS /usr/lib/firmware/intel-ucode/
  4. アップデートが存在する場合は、selected microcodes の下に表示されます。
  5. メーカーの BIOS にマイクロコードが既に含まれていてロードされたことが dmesg に表示されていない可能性もあります。grep microcode /proc/cpuinfo を実行して現在のマイクロコードを比較してください。

AMD CPU の場合、手動により確認することができます。

  1. lscpu(1)/proc/cpuinfo の出力を見る。
  2. CPU のファミリ、モデル、ステッピングを確認する。これらの値を16進数に変更する。
  3. /usr/lib/firmware/amd-ucode/README に書かれてあるリストにそれらの値とマッチするものを見つける。
  4. 見つかった場合は、現在使用中のマイクロコードのバージョンとリストにある Patch の値を比較する。

マイクロコードローダーを無効化する

更新後の CPU マイクロコードが問題を引き起こす場合、一時的にマイクロコードローダーを無効化してブートできるようにし、パッケージをダウングレードする必要がある場合があります。カーネルのマイクロコードローダーを無効化するには、dis_ucode_ldr カーネルパラメータを指定してください。

参照

翻訳ステータス: このページは en:Microcode の翻訳バージョンです。最後の翻訳日は 2024-03-28 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。