「マイクロコード」の版間の差分
(同期) |
(同期) |
||
(2人の利用者による、間の17版が非表示) | |||
10行目: | 10行目: | ||
AMD や Intel CPU を持つすべてのユーザは、システムの安定性を確保するためにマイクロコードのアップデートをインストールすべきです。仮想マシンやコンテナ内では、マイクロコードのアップデートはゲストシステムではなく、ホストに属します。 |
AMD や Intel CPU を持つすべてのユーザは、システムの安定性を確保するためにマイクロコードのアップデートをインストールすべきです。仮想マシンやコンテナ内では、マイクロコードのアップデートはゲストシステムではなく、ホストに属します。 |
||
− | == |
+ | == インストール == |
+ | 更新されたマイクロコードを入手するには、プロセッサに応じて以下のパッケージのどれかを[[インストール]]してください: |
||
− | 通常、マイクロコードのアップデートはマザーボードのファームウェアに同梱されており、ファームウェアの初期化中に適用されます。しかし、OEM はファームウェアのアップデートをタイムリーにリリースしないかもしれない上、古いシステムでは新しいファームウェアアップデートは全くリリースされないので、起動中に CPU マイクロコードアップデートを適用する機能が Linux カーネルに追加されました。[https://docs.kernel.org/x86/microcode.html Linux マイクロコードローダ]は3つの方法をサポートします: |
||
+ | * {{Pkg|amd-ucode}}: AMD プロセッサ。 |
||
− | # '''組み込みマイクロコード''' は、カーネルに組み込んでコンパイルし、初期ローダ (early loader) を使って適用することができます。 |
||
+ | * {{Pkg|intel-ucode}}: Intel プロセッサ。 |
||
− | # '''早期ロード''' は、起動中の非常に早い段階 (initramfs ステージよりも前) でマイクロコードをアップデートします。遅延ロードよりもこちらが推奨されます。Intel の Haswell や Broadwell プロセッサファミリのように CPU に深刻なハードウェアバグが存在する場合、これは必須です。 |
||
− | # '''遅延ロード''' ('''危険''') は、起動後にマイクロコードをアップデートします。CPU がバグのある命令セットの使用をすでに試みたかもしれないので、これでは遅すぎる可能性があります。「早期ロード」をすでに使用している場合でも、「遅延ロード」を使用して再起動せずに新しいマイクロコードのアップデートを適用できます。 |
||
+ | [[mkinitcpio]] と [[dracut]] はデフォルトで、[[#マイクロコード initramfs とメインの initramfs を1つのファイルに一緒にパックする|(メインの initramfs とマイクロコードを) 混合した initramfs ファイル]]を生成します。マイクロコードはブート時に自動的にロードされます。[[Booster]] は混合 initramfs の生成を[https://github.com/anatol/booster/issues/40 サポートしていません]。[[#別個のマイクロコード initramfs ファイルを使う]] で説明されている、必要なブートローダー設定を参照してください。 |
||
− | 更新されたマイクロコードを取得するには、プロセッサに応じて以下のいずれかのパッケージを[[インストール]]してください: |
||
− | * {{Pkg|amd-ucode}} : AMD プロセッサ |
||
− | * {{Pkg|intel-ucode}} : Intel プロセッサ |
||
− | + | == マイクロコードをロードする == |
|
+ | 通常、マイクロコードのアップデートはマザーボードのファームウェアに同梱されており、ファームウェアの初期化中に適用されます。しかし、OEM はファームウェアのアップデートをタイムリーにリリースしないかもしれない上、古いシステムでは新しいファームウェアアップデートは全くリリースされないので、起動中に CPU マイクロコードアップデートを適用する機能が Linux カーネルに追加されました。[https://docs.kernel.org/arch/x86/microcode.html Linux マイクロコードローダ]は3つの方法をサポートします: |
||
− | [https://docs.kernel.org/x86/microcode.html#early-load-microcode マイクロコード cpio を initramfs 内部に前置する]ことができます。[[dracut]] など ({{man|5|dracut.conf|DESCRIPTION}} を参照) の一部の initramfs ジェネレータは、これをデフォルトで行います。これにより、[[#早期ロード]] と [[#遅延ロード]] は不要になります。しかし、Arch Linux はデフォルトで初期 RAM ディスク (initramfs) の生成に [[mkinitcpio]] を使用し、[[mkinitcpio]] はこの方法をサポートしていません。しかし、UEFI スタブを用いたマイクロコードの読み込みはサポートしています: [[#Unified カーネルイメージ]] を見てください。 |
||
+ | |||
+ | # '''組み込みマイクロコード''' は、カーネルに組み込んでコンパイルし、早期ローダ (early loader) を使って適用することができます。 |
||
+ | # '''早期ロード''' は、起動中の非常に早い段階 (initramfs ステージよりも前) でマイクロコードをアップデートします。遅延ロードよりもこちらが推奨されます。Intel の Haswell や Broadwell プロセッサファミリのように CPU に深刻なハードウェアバグが存在する場合、早期ロードが必須です。 |
||
+ | # '''遅延ロード''' ([https://github.com/torvalds/linux/commit/9407bda845dd19756e276d4f3abc15a20777ba45 場合によって]は[https://docs.kernel.org/arch/x86/microcode.html#why-is-late-loading-dangerous 危険]) は、起動後にマイクロコードをアップデートします。CPU が欠陥のある命令の使用をすでに試みたかもしれないので、これでは遅すぎる可能性があります。「早期ロード」をすでに使用している場合でも、「遅延ロード」を使用して再起動せずに新しいマイクロコードのアップデートを適用できます。 |
||
=== 早期ロード === |
=== 早期ロード === |
||
− | マイクロコードは、カーネルに組み込まない場合、 |
+ | マイクロコードは、カーネルに組み込まない場合、早期ローダ (early loader) によって読み込む必要があります。 |
− | |||
− | ユーザの初期ブート構成は様々なので、マイクロコードのアップデートは Arch のデフォルトの設定では自動的にトリガーされないことに注意してください。 |
||
− | |||
− | ==== Unified カーネルイメージ ==== |
||
− | |||
− | [[Unified カーネルイメージ]] の記事で、単一ファイルのイメージにマイクロコードを埋め込む方法を見てください。 |
||
− | |||
− | ==== 初期 RAM ディスクイメージ ==== |
||
+ | 早期ローダは、マイクロコードのアップデートファイルが未圧縮 CPIO アーカイブ (initramfs イメージ) 内の {{ic|/kernel/x86/microcode/GenuineIntel.bin}} または {{ic|/kernel/x86/microcode/AuthenticAMD.bin}} として存在していることを期待します。 |
||
− | あるいは、マイクロコードのアップデートを有効にするには、{{ic|/boot/amd-ucode.img}} または {{ic|/boot/intel-ucode.img}} を'''ブートローダーの設定ファイルの 一番目の初期 RAM ディスクイメージ''' として追加しなければなりません。これは、通常の初期 RAM ディスクイメージファイルよりも前です。一般的なブートローダの場合における手順は以下を見てください。 |
||
+ | 早期 initramfs イメージ (マイクロコードのアップデートファイル) は、メインの initramfs イメージと合体して1つのファイルにし、(ブートローダーで {{ic|1=initrd=}} カーネルコマンドラインオプションを使うか、ユニファイドカーネルイメージ内にパックして) 単一の 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}} に設定する必要があります。 |
CONFIG_BLK_DEV_INITRD=Y |
CONFIG_BLK_DEV_INITRD=Y |
||
52行目: | 45行目: | ||
CONFIG_MICROCODE_INTEL=Y |
CONFIG_MICROCODE_INTEL=Y |
||
CONFIG_MICROCODE_AMD=y |
CONFIG_MICROCODE_AMD=y |
||
+ | |||
+ | ==== マイクロコード initramfs とメインの initramfs を1つのファイルに一緒にパックする ==== |
||
+ | |||
+ | 未圧縮のマイクロコード CPIO は [https://docs.kernel.org/arch/x86/microcode.html#early-load-microcode initramfs の先頭に追加する]ことが可能であり、単一の initramfs ファイルとして利用できるようになります。この方法は、追加のブートパラメータの設定が必要ないため、[[#別個のマイクロコード initramfs ファイルを使う]] の方法よりも推奨されます。 |
||
+ | |||
+ | {{Tip|{{ic|/etc/pacman.conf}} の [[NoExtract]] オプションに {{ic|boot/*-ucode.img}} を追加することもできます。マイクロコードのファイルは {{ic|/usr/lib/firmware/*-ucode/}} のものが直接使用されるからです。}} |
||
+ | |||
+ | ===== 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 {{!}} grep microcode | |
||
+ | 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 ===== |
||
72行目: | 98行目: | ||
===== systemd-boot ===== |
===== systemd-boot ===== |
||
− | 以下のように初期 RAM ディスク |
+ | 以下のように、マイクロコードを読み込むオプションを初期 RAM ディスクより前に使用してください: |
{{hc|/boot/loader/entries/''entry''.conf| |
{{hc|/boot/loader/entries/''entry''.conf| |
||
92行目: | 118行目: | ||
===== 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'''" |
||
116行目: | 146行目: | ||
===== LILO ===== |
===== LILO ===== |
||
− | [[LILO]] |
+ | [[LILO]] は複数の初期 RAM ディスクイメージの読み込みをサポートしておらず、他の古いブートローダーも同じくサポートしていない可能性があります。代わりに [[#マイクロコード initramfs とメインの initramfs を1つのファイルに一緒にパックする]] で説明されている方法に従ってください。 |
− | |||
− | {{Warning|カーネルをアップデートするたびに毎回イメージをマージして再生成する必要があります。}} |
||
− | |||
− | {{Note|イメージの順番は重要です。オリジナルのイメージである {{ic|initramfs-linux}} は {{ic|''cpu_manufacturer''-ucode.img}} イメージよりも先に来るように結合する必要があります。}} |
||
− | |||
− | ふたつのイメージを {{ic|initramfs-merged.img}} という名前のイメージにマージするには、以下のコマンドを使用: |
||
− | |||
− | # cat /boot/''cpu_manufacturer''-ucode.img /boot/initramfs-linux.img > /boot/initramfs-merged.img |
||
− | |||
− | マージできたら {{ic|/etc/lilo.conf}} を編集して新しいイメージをロードします: |
||
− | |||
− | ... |
||
− | initrd=/boot/initramfs-merged.img |
||
− | ... |
||
− | |||
− | root で {{ic|lilo}} を実行してください: |
||
− | |||
− | # lilo |
||
===== Limine ===== |
===== Limine ===== |
||
− | [[Limine]] においては、[[Limine#設定|limine. |
+ | [[Limine]] においては、[[Limine#設定|limine.conf]] ファイル内の {{ic|MODULE_PATH}} オプションにマイクロコードへのパスを追加するだけで良いです。以下は例です: |
− | {{hc|limine. |
+ | {{hc|limine.conf|2= |
+ | default_entry: 1 |
||
− | DEFAULT_ENTRY=1 |
||
+ | timeout: 3 |
||
− | TIMEOUT=3 |
||
− | + | /Arch |
|
− | + | comment: Arch Linux |
|
− | + | protocol: linux |
|
− | + | kernel_path: boot():/vmlinuz-linux |
|
− | + | kernel_cmdline: root=UUID=c0748521-eca9-4f38-989c-43811b6e39a1 rw loglevel=3 |
|
− | ''' |
+ | '''module_path: boot():/''cpu_manufacturer-ucode''.img''' |
− | + | module_path: boot():/initramfs-linux.img |
|
}} |
}} |
||
=== 遅延ロード === |
=== 遅延ロード === |
||
− | {{Warning|1=マイクロコードの遅延ロードは危険であるとみなされています(Linux 5.19 で遅延ロードを行うとカーネルに汚染マークが付きます)。[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=9784edd73a08ea08d0ce5606e1f0f729df688c59]}} |
+ | {{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/}} にあるファイルが使用されます。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] |
||
− | AMD プロセッサの場合、マイクロコードのアップデートファイルは {{Pkg|linux-firmware}} により提供されます。 |
||
+ | ==== マイクロコードのアップデートの遅延ロード ==== |
||
− | Intel プロセッサの場合、マイクロコードのアップデートファイルが含まれるパッケージはありません ({{Bug|59841}})。遅延ロードするには [https://github.com/intel/Intel-Linux-Processor-Microcode-Data-Files/releases Intel が提供しているアーカイブ]から手動で {{ic|intel-ucode/}} を抽出する必要があります。 |
||
+ | 実行中のシステムで手動でマイクロコードをアップデートするには (例: {{ic|/usr/lib/firmware/amd-ucode/}} か {{ic|/usr/lib/firmware/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/}} 内のマイクロコードファイルをアップデートした後): |
||
# 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 |
||
== 起動時にマイクロコードのアップデートがされたか確認する == |
== 起動時にマイクロコードのアップデートがされたか確認する == |
||
188行目: | 186行目: | ||
マイクロコードがアップデートされたかどうか確認するには ''journalctl'' でカーネルメッセージを確認してください: |
マイクロコードがアップデートされたかどうか確認するには ''journalctl'' でカーネルメッセージを確認してください: |
||
− | # journalctl -k --grep=microcode |
+ | # journalctl -k --grep='microcode:' |
− | + | ブート時に毎回以下のような出力がなされるはずです (以下ではマイクロコードが非常に早い段階でアップデートされていることを示しています): |
|
− | + | kernel: microcode: Current revision: 0x00000012 |
|
− | microcode: |
+ | kernel: microcode: Updated early from: 0x0000000e |
− | microcode: Microcode Update Driver: v2.2. |
||
− | + | 場合によっては (特に最新のハードウェアの場合)、対象 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 == |
||
229行目: | 201行目: | ||
特定のモデルがサポートされているのかどうかは以下のリンクから Intel のサイトや AMD の Gentoo Wiki サイトで確認することができます: |
特定のモデルがサポートされているのかどうかは以下のリンクから Intel のサイトや AMD の Gentoo Wiki サイトで確認することができます: |
||
− | * [[Gentoo:AMD microcode# |
+ | * [[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 のダウンロードセンター]。 |
||
=== マイクロコードのアップデートが必要かどうか確認する === |
=== マイクロコードのアップデートが必要かどうか確認する === |
||
− | {{ |
+ | Intel CPU の場合は、{{man|8|iucode_tool}} コマンドを使うことで、現在使用中の CPU 向けのマイクロコードが {{ic|/usr/lib/firmware/intel-ucode/}} に含まれているかどうかを確認することができます。 |
− | # {{Pkg|intel-ucode}} を[[インストール]] |
+ | # {{Pkg|intel-ucode}} と {{Pkg|iucode-tool}} を[[インストール]]してください。 |
− | # {{Pkg|iucode-tool}} を[[インストール]] |
||
# {{ic|cpuid}} カーネルモジュールをロード: {{bc|# modprobe cpuid}} |
# {{ic|cpuid}} カーネルモジュールをロード: {{bc|# modprobe cpuid}} |
||
− | # |
+ | # 該当する 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 の場合、手動により確認することができます。 |
||
+ | |||
+ | # CPU のファミリ、モデル、ステッピングを調べてください。例えば、{{bc|1=# journalctl -k --grep='CPU0:'}} の出力を見ると {{ic|(family: 0x15, model: 0x10, stepping: 0x1)}} といった部分があります。 |
||
+ | # これらの値を [https://gitlab.com/kernel-firmware/linux-firmware/-/blob/main/amd-ucode/README amd-ucode README] から見つけてください。 |
||
+ | # 合うものが見つかったら、実行中のマイクロコードの[[#起動時にマイクロコードのアップデートがされたか確認する|現在のリビジョン]]と README に載っている {{ic|Patch}} の値とを比べてください。 |
||
+ | |||
+ | {{Note|ファミリ、モデル、ステッピングは {{man|1|lscpu}} や {{ic|/proc/cpuinfo}} の出力でも確認できます。ただし、出力された値を16進数に変換する必要があります。}} |
||
+ | |||
+ | == マイクロコードローダーを無効化する == |
||
+ | |||
+ | 更新後の CPU マイクロコードが問題を引き起こす場合、一時的にマイクロコードローダーを無効化してブートできるようにし、パッケージをダウングレードする必要がある場合があります。カーネルのマイクロコードローダーを無効化するには、{{ic|dis_ucode_ldr}} [[カーネルパラメータ]]を指定してください。 |
||
== 参照 == |
== 参照 == |
||
247行目: | 230行目: | ||
* [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| |
+ | {{TranslationStatus|Microcode|2024-11-04|819837}} |
2024年11月4日 (月) 18:18時点における最新版
プロセッサの製造者はプロセッサマイクロコードに安定性とセキュリティのアップデートをリリースしています。そのようなアップデートには、システムの安定性に深く関わるバグフィックスが含まれています。これがないと、追跡困難な疑わしいクラッシュや予期しないシステム停止を引き起こす場合があります。
AMD や Intel CPU を持つすべてのユーザは、システムの安定性を確保するためにマイクロコードのアップデートをインストールすべきです。仮想マシンやコンテナ内では、マイクロコードのアップデートはゲストシステムではなく、ホストに属します。
目次
インストール
更新されたマイクロコードを入手するには、プロセッサに応じて以下のパッケージのどれかをインストールしてください:
- amd-ucode: AMD プロセッサ。
- intel-ucode: Intel プロセッサ。
mkinitcpio と dracut はデフォルトで、(メインの initramfs とマイクロコードを) 混合した initramfs ファイルを生成します。マイクロコードはブート時に自動的にロードされます。Booster は混合 initramfs の生成をサポートしていません。#別個のマイクロコード initramfs ファイルを使う で説明されている、必要なブートローダー設定を参照してください。
マイクロコードをロードする
通常、マイクロコードのアップデートはマザーボードのファームウェアに同梱されており、ファームウェアの初期化中に適用されます。しかし、OEM はファームウェアのアップデートをタイムリーにリリースしないかもしれない上、古いシステムでは新しいファームウェアアップデートは全くリリースされないので、起動中に CPU マイクロコードアップデートを適用する機能が Linux カーネルに追加されました。Linux マイクロコードローダは3つの方法をサポートします:
- 組み込みマイクロコード は、カーネルに組み込んでコンパイルし、早期ローダ (early loader) を使って適用することができます。
- 早期ロード は、起動中の非常に早い段階 (initramfs ステージよりも前) でマイクロコードをアップデートします。遅延ロードよりもこちらが推奨されます。Intel の Haswell や Broadwell プロセッサファミリのように CPU に深刻なハードウェアバグが存在する場合、早期ロードが必須です。
- 遅延ロード (場合によっては危険) は、起動後にマイクロコードをアップデートします。CPU が欠陥のある命令の使用をすでに試みたかもしれないので、これでは遅すぎる可能性があります。「早期ロード」をすでに使用している場合でも、「遅延ロード」を使用して再起動せずに新しいマイクロコードのアップデートを適用できます。
早期ロード
マイクロコードは、カーネルに組み込まない場合、早期ローダ (early loader) によって読み込む必要があります。
早期ローダは、マイクロコードのアップデートファイルが未圧縮 CPIO アーカイブ (initramfs イメージ) 内の /kernel/x86/microcode/GenuineIntel.bin
または /kernel/x86/microcode/AuthenticAMD.bin
として存在していることを期待します。
早期 initramfs イメージ (マイクロコードのアップデートファイル) は、メインの initramfs イメージと合体して1つのファイルにし、(ブートローダーで initrd=
カーネルコマンドラインオプションを使うか、ユニファイドカーネルイメージ内にパックして) 単一の 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
マイクロコード initramfs とメインの initramfs を1つのファイルに一緒にパックする
未圧縮のマイクロコード CPIO は initramfs の先頭に追加することが可能であり、単一の initramfs ファイルとして利用できるようになります。この方法は、追加のブートパラメータの設定が必要ないため、#別個のマイクロコード initramfs ファイルを使う の方法よりも推奨されます。
mkinitcpio
mkinitcpio でマイクロコードを含んでいる initramfs ファイルを生成するには、/etc/mkinitcpio.conf
の HOOKS
配列に 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 | grep microcode
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 の製造業者名 (つまり、amd
か intel
) に置き換えてください。
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
/boot/refind_linux.conf
のブートオプションを編集し、マイクロコードイメージをロードするための initrd=
オプションを最初の initrd
引数として追加してください。/boot
内のファイルが別のパーティションの直下にあるかどうかに応じて、initrd=boot\cpu_manufacturer-ucode.img
か initrd=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
/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.conf ファイル内の MODULE_PATH
オプションにマイクロコードへのパスを追加するだけで良いです。以下は例です:
limine.conf
default_entry: 1 timeout: 3 /Arch comment: Arch Linux protocol: linux kernel_path: boot():/vmlinuz-linux kernel_cmdline: root=UUID=c0748521-eca9-4f38-989c-43811b6e39a1 rw loglevel=3 module_path: boot():/cpu_manufacturer-ucode.img module_path: boot():/initramfs-linux.img
遅延ロード
マイクロコードアップデートの遅延ロードは、システムが起動し終わった後に行われます。その時、/usr/lib/firmware/amd-ucode/
と /usr/lib/firmware/intel-ucode/
にあるファイルが使用されます。AMD CPU と Intel CPU のマイクロコードのアップデートファイルは、それぞれ amd-ucode と intel-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/
に含まれているかどうかを確認することができます。
- intel-ucode と iucode-tool をインストールしてください。
cpuid
カーネルモジュールをロード:# modprobe cpuid
- 該当する cpuid を検索:
$ iucode_tool -lS /usr/lib/firmware/intel-ucode/
- アップデートが存在する場合は、selected microcodes の下に表示されます。
- メーカーの BIOS にマイクロコードが既に含まれていてロードされたことが dmesg に表示されていない可能性もあります。
grep microcode /proc/cpuinfo
を実行して現在のマイクロコードを比較してください。
AMD CPU の場合、手動により確認することができます。
- CPU のファミリ、モデル、ステッピングを調べてください。例えば、
# journalctl -k --grep='CPU0:'
の出力を見ると(family: 0x15, model: 0x10, stepping: 0x1)
といった部分があります。 - これらの値を amd-ucode README から見つけてください。
- 合うものが見つかったら、実行中のマイクロコードの現在のリビジョンと README に載っている
Patch
の値とを比べてください。
マイクロコードローダーを無効化する
更新後の CPU マイクロコードが問題を引き起こす場合、一時的にマイクロコードローダーを無効化してブートできるようにし、パッケージをダウングレードする必要がある場合があります。カーネルのマイクロコードローダーを無効化するには、dis_ucode_ldr
カーネルパラメータを指定してください。