Intel マイクロコード
この記事では、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_INTEL
は CONFIG_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 が最初に読み込まれるように設定します:
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 のフックを利用しているに過ぎません:
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.img、intel-ucode.img、amd-uc.img、amd-ucode.img、early_ucode.cpio または microcode.cpio のいずれかであれば、grub-mkconfig の実行時に自動的に検出されます。例えば ucode.cpio のような、これらと異なる名前のマイクロコードファイルを宣言するには、/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 として追加します:
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
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 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 のルートからの絶対パスである必要があります。
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.cfg に ucode オプションの行を追加してください。マイクロコードのパスは、xen.efi バイナリからの相対パスです。マイクロコードを適切な場所 (デフォルトは /boot/EFI/Gentoo) に書き込むか、コピーするようにしてください。
[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 変数を使用できます。
そのシステムのプロセッサー用のマイクロコードデータファイルをインストールするには:
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_MICROCODE、CONFIG_MICROCODE_INTEL、CONFIG_FIRMWARE_IN_KERNEL、CONFIG_EXTRA_FIRMWARE、CONFIG_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_FIRMWARE と CONFIG_EXTRA_FIRMWARE_DIR オプションは iucode_tool で特定した値に設定する必要があります。この例では、Intel i7-4790K プロセッサー向けに、CONFIG_EXTRA_FIRMWARE を
intel-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 を使用している場合、最初の行は表示されないかもしれません。この場合、変更の前後のマイクロコードのリビジョンを確認してください。
これがカーネルログの初歩であることに注意してください。
マイクロコードの更新がマザーボードのファームウェアに直接挿入されている場合(これは魅力的に聞こえるかもしれませんが)、CPU0 は更新されるものの、残りの CPU(あるいはマルチコアのシステムでは CPU コア) は初期のリビジョンのままになっている可能性があることを知っておいてください(このような状態は、すべての CPU で同じ初期リビジョンが実行されている状態に比べて、問題を引き起こす可能性が高まります)。また、多くのマザーボードの純正ファームウェアに(初期リリースリビジョンであっても)マイクロコードの更新が含まれていることは、すべての人にとって、カーネルにすべての CPU (とコア)を同じバージョンに更新させるようにする正当な理由です(したがって、カーネルが持つバージョンがマザーボードのファームウェアに含まれているものと同じであっても、この更新ドライバーを実行するようにしましょう)。それでも、マイクロコードをファームウェアに挿入することは、(カーネルが読み込まれて残りのマイクロコードが更新できるようになる前に、ブート CPU にファームウェアの更新が読み込まれるようにするために)望ましいことです。
参考資料
- Microcode — describes various ways to update a CPU's microcode in Gentoo.
- AMD microcode — describes updating the microcode for AMD processors.
外部資料
- http://www.win-raid.com/t154f16-Tool-Guide-News-quot-UEFI-BIOS-Updater-quot-UBU.html - 非公式のマイクロコードのソースの例
microcode-ctl ユーティリティはバージョン 1.28-r1 (Gentoo unstable) から非推奨となっており、[2] Gentoo repository からも削除されました。
参照
- ↑ https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=e6bcfdd75d53390a67f67237f4eafc77d9772056
- ↑ 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.