マイクロコード
プロセッサのマイクロコードはプロセッサのファームウェアと同種のものです。カーネルは BIOS のアップデートをすることなくプロセッサのファームウェアをアップデートすることができます。
- マイクロコードのデータファイルには全ての Intel プロセッサのための最新のマイクロコードが定義されています。Intel はマイクロコードのアップデートをリリースすることで、それぞれのプロセッサの仕様のアプリケーションに文書化されているようにプロセッサの挙動を修正します。一般的に、このマイクロコードの更新を行うのは BIOS のアップデートによりますが、これは管理者を困らせるような羽目になることがあるのを Intel は了解しています。Linux オペレーティングシステムや VMware ESX プロダクトには起動後にマイクロコードを更新する仕組みが備わっています。例えば、Linux システムの
/etc/firmware
ディレクトリにファイルが配置されると、オペレーティングシステムの仕組みがこのファイルを使用します。 ~Intel
マイクロコードのアップデート
Intel のプロセッサの場合、intel-ucode をインストールしてください。
AMD のプロセッサの場合、マイクロコードのアップデートは linux-firmware で利用することができ、このパッケージはベースシステムの一部としてインストールされます。
Intel のマイクロコードのアップデートを有効にする
アップデートを有効にするにはブートローダーの設定ファイルに /boot/intel-ucode.img
を一番目の initrd として追加する必要があります。通常の initrd ファイルとは別に追加します。
サンプル
EFI ブートスタブ / EFI ハンドオーバー
2つの initrd=
オプションを追加:
initrd=/intel-ucode.img initrd=/initramfs-linux.img
Gummiboot
/boot/loader/entries/*.conf
で initrd
オプションを二回使用:
title Arch Linux linux /vmlinuz-linux initrd /intel-ucode.img initrd /initramfs-linux.img options ...
rEFInd
上記の EFI ブートスタブと同じように /boot/refind_linux.conf
のブートオプションを編集する、例:
"Boot with standard options" "ro root=UUID=(...) quiet initrd=/intel-ucode.img initrd=/initramfs-linux.img"
手動で /boot/refind.conf
にカーネルを定義している場合はメインの部分ではなく options 行に initrd=/intel-ucode.img
や /boot/intel-ucode.img
を追加してください。
Grub
Arch の開発チームが grub におけるマイクロコードのアップデートの処理を決定するまで (FS#42354 を参照)、grub ユーザーはマイクロコードのアップデートの有効化に2つの選択肢が存在します。以下に記載されている二つの方法のうち、どちらか一方を選択してください。
1. grub.cfg を手動で編集
以下のように grub.cfg
に /intel-ucode.img
や /boot/intel-ucode.img
を手動で追加:
[...] echo 'Loading initial ramdisk ...' initrd /intel-ucode.img /initramfs-linux.img [...]
2. /etc/grub.d/10_linux を手動で編集
ファームウェアイメージを検出して適切に grub.cfg
に書き出させるように /etc/grub.d/10_linux
を手動で編集してから、grub-mkconfig -o /boot/grub/grub.cfg
を使って grub.cfg
を再生成します:
/etc/grub.d/10_linux
if test -n "${initrd}" ; then + if test -f "${dirname}/intel-ucode.img"; then + ucode="${rel_dirname}/intel-ucode.img" + else + ucode= + fi # TRANSLATORS: ramdisk isn't identifier. Should be translated. message="$(gettext_printf "Loading initial ramdisk ...")" sed "s/^/$submenu_indentation/" << EOF echo '$(echo "$message" | grub_quote)' - initrd ${rel_dirname}/${initrd} + initrd ${ucode} ${rel_dirname}/${initrd} EOF
Syslinux
/boot/syslinux/syslinux.cfg
で複数の initrd をカンマで区切って指定できます:
LABEL arch MENU LABEL Arch Linux LINUX ../vmlinuz-linux INITRD ../intel-ucode.img,../initramfs-linux.img APPEND ...
起動時にマイクロコードのアップデートがされたか確認する
マイクロコードがアップデートされたかどうか確認するには /usr/bin/dmesg
を使用します: dmesg | grep microcode
。
Intel が載っているシステムでは、マイクロコードのアップデートがされていると以下のような表示がされます:
[ 0.000000] CPU0 microcode updated early to revision 0x1b, date = 2014-05-29 [ 0.221951] CPU1 microcode updated early to revision 0x1b, date = 2014-05-29 [ 0.242064] CPU2 microcode updated early to revision 0x1b, date = 2014-05-29 [ 0.262349] CPU3 microcode updated early to revision 0x1b, date = 2014-05-29 [ 0.507267] microcode: CPU0 sig=0x306a9, pf=0x2, revision=0x1b [ 0.507272] microcode: CPU1 sig=0x306a9, pf=0x2, revision=0x1b [ 0.507276] microcode: CPU2 sig=0x306a9, pf=0x2, revision=0x1b [ 0.507281] microcode: CPU3 sig=0x306a9, pf=0x2, revision=0x1b [ 0.507286] microcode: CPU4 sig=0x306a9, pf=0x2, revision=0x1b [ 0.507292] microcode: CPU5 sig=0x306a9, pf=0x2, revision=0x1b [ 0.507296] microcode: CPU6 sig=0x306a9, pf=0x2, revision=0x1b [ 0.507300] microcode: CPU7 sig=0x306a9, pf=0x2, revision=0x1b [ 0.507335] microcode: Microcode Update Driver: v2.00 <tigran@aivazian.fsnet.co.uk>, Peter Oruba
最新のハードウェアの場合、CPU のマイクロコードアップデートが存在しないという可能性も考えられます。そのときは、以下のような出力がなされます:
[ 0.292893] microcode: CPU0 sig=0x306c3, pf=0x2, revision=0x1c [ 0.292899] microcode: CPU1 sig=0x306c3, pf=0x2, revision=0x1c [ 0.292906] microcode: CPU2 sig=0x306c3, pf=0x2, revision=0x1c [ 0.292912] microcode: CPU3 sig=0x306c3, pf=0x2, revision=0x1c [ 0.292956] microcode: Microcode Update Driver: v2.00 <tigran@aivazian.fsnet.co.uk>, Peter Oruba
AMD 環境では、マイクロコードはブートプロセスのやや後ろのほうでアップデートされます。したがって出力は以下のような感じです:
[ 0.807879] microcode: CPU0: patch_level=0x01000098 [ 0.807888] microcode: CPU1: patch_level=0x01000098 [ 0.807983] microcode: Microcode Update Driver: v2.00 <tigran@aivazian.fsnet.co.uk>, Peter Oruba [ 16.150642] microcode: CPU0: new patch_level=0x010000c7 [ 16.150682] microcode: CPU1: new patch_level=0x010000c7
マイクロコードのアップデートができる CPU
特定のモデルがサポートされているのかどうかは以下のリンクから Intel や AMD のサイトで確認することができます:
マイクロコードのアップデートが必要かどうか確認する
iucode-toolAUR を使って、使用している cpu のマイクロコードイメージが intel-ucode.img
に含まれているかどうか確認できます:
- intel-ucode をインストール (アップデートがあるかどうか確認するのに initrd の変更は必要ありません)
- AUR から iucode-toolAUR をインストール
# modprobe cpuid
# bsdtar -Oxf /boot/intel-ucode.img | iucode_tool -tb -lS -
(マイクロコードイメージを展開して cpuid を検索します)- アップデートが存在する場合は、selected microcodes の下に表示されます。
カスタムカーネルで Intel のマイクロコードのロードを有効にする
カスタムカーネルでロードを行うには、"CPU microcode loading support" をカーネルに組み込む必要があります。モジュールとしてコンパイルしても動作しません。"Early load microcode" プロンプトが有効になるので "Y" に設定してください。
CONFIG_MICROCODE=y CONFIG_MICROCODE_INTEL=y CONFIG_MICROCODE_INTEL_EARLY=y CONFIG_MICROCODE_EARLY=y