Intel マイクロコード

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page Intel microcode and the translation is 100% complete.
Other languages:

この記事では、Intel プロセッサーのマイクロコード を更新する手順を説明します。

インストール

カーネル

カーネルに以下のサポートをビルトインする必要があります:

カーネル CONFIG_BLK_DEV_INITRD、CONFIG_MICROCODE 及び and CONFIG_MICROCODE_INTEL を有功にする
General setup  --->
    [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
Processor type and features  --->
    <*> CPU microcode loading support
    [*]   Intel microcode loading support
警告
早期マイクロコードについてはモジュールは動作しないため、microcode loading は必ずビルトインするようにしてください。
重要
バージョン 6.6 以降のカーネルでは microcode loading support がデフォルトで有効になっており、上記の設定は現在は存在しません:CONFIG_MICROCODE_INTELCONFIG_CPU_SUP_INTEL に変わっています。[1]

emerge

マイクロコードファームウェアパッケージと操作ツールをインストールします:

root #emerge --ask --noreplace sys-firmware/intel-microcode

設定

メモ
initramfs USE フラグが有効になっている場合、intel-microcode の ebuild はすべてのマイクロコードが含まれる cpio アーカイブを /boot/intel-uc.img に自動的にインストールします。

手動でマイクロコードの cpio アーカイブを生成するには、iucode_tool を使用します:

root #iucode_tool -S --write-earlyfw=/boot/early_ucode.cpio /lib/firmware/intel-ucode/*
iucode_tool: system has processor(s) with signature 0x000306c3
iucode_tool: Writing selected microcodes to: /boot/early_ucode.cpio

genkernel

initrd の生成に genkernel を使用している場合は、--microcode-initramfs オプションを追加することで Intel や AMD のマイクロコードを含む早期 cpio を initrd 内の先頭に追加することができます。以下のブートローダーの設定変更は不要です。

Syslinux

INITRD 行では、複数の initrd ファイルはコンマで区切ります。early_ucode.cpio が最初に読み込まれるように設定します:

ファイル /boot/syslinux.cfg
LABEL gentoo
    MENU LABEL Gentoo Linux 4.4.6
    LINUX /vmlinuz-4.4.6-gentoo
    INITRD /early_ucode.cpio,/initrd-4.4.6-gentoo.img

GRUB Legacy

生成されたマイクロコードをカーネルコマンドラインに最初の initrd として追加します。ルート initramfs は、スペースで区切って2番目に指定します。このステップは、起動に initrd イメージを必要としないシステムにおいても必要です。マイクロコードの更新は単に initrd のフックを利用しているに過ぎません:

ファイル /boot/grub/grub.confマイクロコードを更新するための GRUB Legacy の設定例
title Gentoo Linux 4.4.6
root (hd0,0)
kernel /boot/vmlinuz-4.4.6-gentoo root=/dev/sda3
initrd /boot/intel-uc.img /boot/initrd.img

GRUB

バージョン 2.02-r1 から、GRUB は早期マイクロコードの読み込みをサポートしています。マイクロコードファイルの名前が: intel-uc.imgintel-ucode.imgamd-uc.imgamd-ucode.imgearly_ucode.cpio または microcode.cpio のいずれかであれば、grub-mkconfig の実行時に自動的に検出されます。例えば ucode.cpio のような、これらと異なる名前のマイクロコードファイルを宣言するには、/etc/default/grub に以下の行を追加します:

ファイル /etc/default/grub
GRUB_EARLY_INITRD_LINUX_CUSTOM="ucode.cpio"

grub.cfg を再生成します:

root #grub-mkconfig -o /boot/grub/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.6.3-gentoo
Found initrd image: /boot/early_ucode.cpio /initramfs-genkernel-x86_64-4.6.3-gentoo
done

2.02-r1 よりも前のバージョンでは、grub.cfg を直接編集して early_ucode.cpio を最初の initrd として追加します:

ファイル /boot/grub/grub.cfg
menuentry 'Gentoo Linux 4.14' {
  root=hd0,1
  linux /boot/linux-4.14.12 root=LABEL=ROOT rootfstype=ext4 ro
  initrd /boot/early_ucode.cpio /boot/initrd.img
}

最後に再起動します。

rEFInd

ファイル /efi/EFI/refind/refind.conf
menuentry Linux {
  icon EFI/refind/icons/os_gentoo.png
  volume foo
  loader boot/vmlinuz
  options "initrd=boot/early_ucode.cpio initrd=boot/bootsplash-initramfs console=tty1 ro root=foo"
 
  submenuentry "Old Kernel" {
    loader boot/vmlinuz.old
  }
}

この例のシステムでは、EFI パーティションが /efi にマウントされています。Linux カーネルと initrd ファイルは Linux ルートファイルシステム上の /boot に配置されています。

initrd の指定に options キーワードではなく initrd キーワードを使用する場合はそれぞれに initrd キーワードを付けることにより複数の initrd を指定してください。そうでなければ、options に宣言をまとめてください。rEFInd では1つの initrd キーワードで複数の initrd を指定することはできません。いつものように、boot/early_code.cpio を最初に initrd に指定してください。

rEFInd ブートローダーからカーネル cmdline オプションを確認したり編集してみましょう。Gentoo OS の項目を反転させた状態で F2 を押して項目メニューにアクセスし、選びたい項目の上で F2 をもう一度押すことで確認・編集できます。これは、refind.conf を編集しなくても簡単に実験できるのでとても便利です。

ファイル /boot/refind_linux.conf
"Boot using default options"     "root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rw initrd=boot\intel-ucode.img initrd=boot\amd-ucode.img initrd=boot\initramfs-%v.img"

/boot/refind_linux.conf の設定を最終確認してください。rEFInd は initramfs をパーティション内で相対的に探索するため、/boot パーティションが分離している場合には "initrd=intel-ucode.img initrd=initramfs-%v.img" として探索する必要があることを覚えておいてください(boot パーティションには /boot フォルダがないため)。バックスラッシュ \ を使用してください、さもないとカーネルがファイルを見つけられません。キーワードの説明については refind.conf を、rEFInd の使用方法の詳細については rEFInd のホームページ を参照してください。

systemd-boot

マイクロコードを引数とする initrd 行を追加してください。既に initrd 行があるなら、マイクロコードの項目が最初に現れるようにしてください。マイクロコードへのパスは ESP のルートからの絶対パスである必要があります。

ファイル /boot/EFI/loader/entries/example
title      Gentoo/Linux
version    4.13.13
options    root=/dev/sda1
linux      /4.13.13/linux
initrd     /4.13.13/intel_ucode
initrd     /4.13.13/initrd

詳細については、The Boot Loader Specification を参照してください。

Xen (EFI)

xen.cfgucode オプションの行を追加してください。マイクロコードのパスは、xen.efi バイナリからの相対パスです。マイクロコードを適切な場所 (デフォルトは /boot/EFI/Gentoo) に書き込むか、コピーするようにしてください。

ファイル /boot/EFI/Gentoo/xen.cfg
[global]
default=gentoo
 
[gentoo]
kernel=vmlinuz-4.4.6-gentoo root=/dev/sda1
ramdisk=initrd-4.4.6-gentoo.img
ucode=early_ucode.cpio

詳細については、Xen EFI のドキュメントを参照してください。

initram-fs/disk を使用しない新しい方法 (efistub 互換)

警告
この方法は64ビットカーネルでのみ動作し、それ以外では効果がありません。32ビットシステムでは initramfs を使用する必要があります。
メモ
これは、特に EFI スタブを使用するシステム(いくつかのマザーボードのファームウェアにはカスタマイズされているブートコマンドラインオプションを解析したり渡したりする処理に問題があるかもしれません)では推奨される方法です。なぜなら、この方法は、システムを壊れたファームウェアブートエントリーや誤った initram-fs/disk が引き起こすような起動不能な(そしておそらくヘッドレスな機器ではとても使いにくい EFI 互換のレスキューディスクを使用しなければ修復できない)状態にしてしまう可能性が低い上、ディスク上のカスタムブートローダーがある EFI システムでも BIOS システムでも同様に動作するためです。

ソフトウェア

sys-firmware/intel-microcode-20171117-r1 パッケージは、マイクロコードのデータファイルを iucode_tool を使って処理するように書き直されました。ユーザーは、マイクロコードのデータファイルの一部のみをインストールするために MICROCODE_SIGNATURES 変数を使用できます。

そのシステムのプロセッサー用のマイクロコードデータファイルをインストールするには:

ファイル /etc/portage/make.conf
MICROCODE_SIGNATURES="-S"

特定のプロセッサー向けのマイクロコードデータファイルをインストールするには MICROCODE_SIGNATURES="-s 0x000306c3" を、特定のプロセッサーを除外するには MICROCODE_SIGNATURES="-s !0x000306c3" を使用します。MICROCODE_SIGNATURES 変数を空白にしたり定義しないと、すべてのマイクロコードデータファイルがインストールされます。

マイクロコードデータファイルをインストールします:

root #emerge --ask sys-firmware/intel-microcode

sys-firmware/intel-microcode-20171117-r1 は プロセッサーのシグネチャを識別するために使用できる iucode_tool をインストールします。

user $iucode_tool -S
iucode_tool: system has processor(s) with signature 0x000306c3

列挙されたシグネチャ用の適切なファイル名を探すには:

user $iucode_tool -S -l /lib/firmware/intel-ucode/*
iucode_tool: system has processor(s) with signature 0x000306c3
[...]
microcode bundle 49: /lib/firmware/intel-ucode/06-3c-03
[...]
selected microcodes:
  049/001: sig 0x000306c3, pf_mask 0x32, 2017-01-27, rev 0x0022, size 22528

シグネチャがマイクロコードバンドル 49 で見つかったので、使用するファイルの名前は /lib/firmware/intel-ucode/06-3c-03 です。

関連
必要なマイクロコードファイルを入手する簡単な方法については、フォーラムの投稿 intel ucode for Core i7-8650U を参照してください。

カーネル

CONFIG_MICROCODECONFIG_MICROCODE_INTELCONFIG_FIRMWARE_IN_KERNELCONFIG_EXTRA_FIRMWARECONFIG_EXTRA_FIRMWARE_DIR カーネルオプションを有効にし、設定してください。

警告
各オプションは、カーネルモジュールでなく、カーネルにビルトインされるように設定する必要があります
カーネル マイクロコードの読み込みサポートを有功にする
Processor type and features  --->
    <*> CPU microcode loading support
    [*]   Intel microcode loading support

Device Drivers  --->
  Generic Driver Options  --->
    Firmware Loader  --->
      -*-   Firmware loading facility 
      (intel-ucode/06-3c-03) Build named firmware blobs into the kernel binary 
      (/lib/firmware) Firmware blobs root directory
メモ
CONFIG_EXTRA_FIRMWARECONFIG_EXTRA_FIRMWARE_DIR オプションは iucode_tool で特定した値に設定する必要があります。この例では、Intel i7-4790K プロセッサー向けに、CONFIG_EXTRA_FIRMWAREintel-ucode/06-3c-03 に、CONFIG_EXTRA_FIRMWARE_DIR/lib/firmware に設定しています。
メモ
CONFIG_EXTRA_FIRMWARE オプションでは、スペースで区切ることで複数のファームウェアファイルを指定することができます。

いつものように、カーネルを再ビルドし、インストールします。

確認

次の再起動の後に以下を実行すると、読み込まれたマイクロコードのリビジョンを確認できます:

user $grep microcode /proc/cpuinfo
microcode	: 0x22
microcode	: 0x22

dmesg の出力には以下が含まれているはずです:

root #dmesg | grep microcode
[    0.000000] microcode: microcode updated early to revision 0x22, date = 2017-01-27
[    1.153262] microcode: sig=0x306c3, pf=0x2, revision=0x22
[    1.153815] microcode: Microcode Update Driver: v2.2.

これは、使用可能なマイクロコードの更新がない(マイクロコードが既に最新のもの)か、マイクロコードが適切に読み込まれるように設定されていないシステムの例です:

root #dmesg | grep microcode
[    1.196567] microcode: CPU0 sig=0x6fd, pf=0x80, revision=0xa3
[    1.196575] microcode: CPU1 sig=0x6fd, pf=0x80, revision=0xa3
[    1.196623] microcode: Microcode Update Driver: v2.01 <tigran@aivazian.fsnet.co.uk>, Peter Oruba

以下は、同じ CPU ですが、マイクロコードの更新が正しく適用されている例です:

root #dmesg | grep microcode
[    0.000000] microcode: microcode updated early to revision 0xa4, date = 2010-10-02
[    1.207385] microcode: CPU0 sig=0x6fd, pf=0x80, revision=0xa4
[    1.207393] microcode: CPU1 sig=0x6fd, pf=0x80, revision=0xa4
[    1.207445] microcode: Microcode Update Driver: v2.01 <tigran@aivazian.fsnet.co.uk>, Peter Oruba
メモ
genkernel と legacy GRUB を使用している場合、最初の行は表示されないかもしれません。この場合、変更の前後のマイクロコードのリビジョンを確認してください。
メモ
これがカーネルログの初歩であることに注意してください。
重要
マイクロコードが BIOS の製造業者によって既に完全に更新されていることもあります。この場合、dmesg の出力にはファームウェアの更新に関するログメッセージは表示されません。
メモ
マイクロコードの更新がマザーボードのファームウェアに直接挿入されている場合(これは魅力的に聞こえるかもしれませんが)、CPU0 は更新されるものの、残りの CPU(あるいはマルチコアのシステムでは CPU コア) は初期のリビジョンのままになっている可能性があることを知っておいてください(このような状態は、すべての CPU で同じ初期リビジョンが実行されている状態に比べて、問題を引き起こす可能性が高まります)。また、多くのマザーボードの純正ファームウェアに(初期リリースリビジョンであっても)マイクロコードの更新が含まれていることは、すべての人にとって、カーネルにすべての CPU (とコア)を同じバージョンに更新させるようにする正当な理由です(したがって、カーネルが持つバージョンがマザーボードのファームウェアに含まれているものと同じであっても、この更新ドライバーを実行するようにしましょう)。それでも、マイクロコードをファームウェアに挿入することは、(カーネルが読み込まれて残りのマイクロコードが更新できるようになる前に、ブート CPU にファームウェアの更新が読み込まれるようにするために)望ましいことです。

参考資料

外部資料

重要
microcode-ctl ユーティリティはバージョン 1.28-r1 (Gentoo unstable) から非推奨となっており、[2] Gentoo repository からも削除されました

参照

  1. https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=e6bcfdd75d53390a67f67237f4eafc77d9772056
  2. https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=719cc5ef240b766953ddbe1e7a6593f8091eed12 The microcode-ctl utility has been deprecated as of version 1.28-r1 (Gentoo unstable) and no longer contains the init script. It also does not work on certain CPUs such as Intel Haswells.