マイクロコード

提供: ArchWiki
2024年3月18日 (月) 21:36時点におけるAshMyzk (トーク | 投稿記録)による版 (同期)
ナビゲーションに移動 検索に移動

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

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 の値を比較する。

参照

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