マイクロコード

提供: ArchWiki
2017年8月7日 (月) 02:04時点におけるKusakata (トーク | 投稿記録)による版 (同期)
ナビゲーションに移動 検索に移動

プロセッサのマイクロコードはプロセッサのファームウェアと同種のものです。カーネルは BIOS のアップデートをすることなくプロセッサのファームウェアをアップデートすることができます。Intel のウェブサイトより:

マイクロコードのデータファイルには全ての Intel プロセッサのための最新のマイクロコードが定義されています。Intel はマイクロコードのアップデートをリリースすることで、それぞれのプロセッサの仕様のアプリケーションに文書化されているようにプロセッサの挙動を修正します。一般的に、このマイクロコードの更新を行うのは BIOS のアップデートによりますが、これは管理者を困らせるような羽目になることがあるのを Intel は了解しています。Linux オペレーティングシステムや VMware ESX プロダクトには起動後にマイクロコードを更新する仕組みが備わっています。例えば、Linux システムの /etc/firmware ディレクトリにファイルが配置されると、オペレーティングシステムの仕組みがこのファイルを使用します。
ノート: Arch Linux はアップデートを処理するのに /etc/firmware は使いません、代わりにファームウェアのバイナリは /usr/lib/firmware/*. に作成されます。

マイクロコードのアップデート

Intel のプロセッサの場合、intel-ucode をインストールしてください。

AMD のプロセッサの場合、マイクロコードのアップデートは linux-firmware で利用することができ、このパッケージはベースシステムの一部としてインストールされます。

Intel のマイクロコードのアップデートを有効にする

警告: linux 3.17-2 と linux-lts 3.14.21-2 以降から、Intel のマイクロコードのアップデートは自動では行われなくなりました。多くの AUR のカーネルも公式の Arch カーネルと同じようになっています: linux-ck 3.16.6-3 から、Intel のマイクロコードのアップデートは自動で行われないようになりました。

アップデートを有効にするにはブートローダーの設定ファイルに /boot/intel-ucode.img を一番目の initrd として追加する必要があります。通常の initrd ファイルとは別に追加します。

サンプル

EFI ブートスタブ / EFI ハンドオーバー

2つの initrd= オプションを追加:

initrd=/intel-ucode.img initrd=/initramfs-linux.img

systemd-boot

/boot/loader/entries/entry.confinitrd オプションを二回使用:

title   Arch Linux
linux   /vmlinuz-linux
initrd  /intel-ucode.img
initrd  /initramfs-linux.img
options ...

EFI システムパーティション/boot にマウントしていない場合、/boot/intel-ucode.img を EFI システムパーティションにコピーしてください。

rEFInd

上記の EFI ブートスタブと同じように /boot/refind_linux.conf のブートオプションを編集する、例:

"Boot with standard options" "rw root=UUID=(...) quiet initrd=/boot/intel-ucode.img initrd=/boot/initramfs-linux.img"

手動/boot/refind.conf にカーネルを定義している場合はメインの部分ではなく options 行に initrd=/intel-ucode.img/boot/intel-ucode.img を追加してください。

Grub

grub-1:2.02-beta2-5 から、grub-mkconfig が自動的にマイクロコードのアップデートを処理します。intel-ucode をインストールした後に # grub-mkconfig -o /boot/grub/grub.cfg を実行して、grub の設定を再生成し、マイクロコードのアップデートのロードを有効にしてください。

もしくは、GRUB の設定ファイルを手動で管理したい場合、以下のように grub.cfg/intel-ucode.img/boot/intel-ucode.img を追加します:

[...]
    echo	'Loading initial ramdisk ...'
    initrd	/intel-ucode.img /initramfs-linux.img
[...]
ノート: すべてのメニューエントリに追加してください。
警告: 更新があると /usr/bin/grub-mkconfig によってファイルが自動的に上書きされるため、ファイルの変更は取り消されてしまいます。

Syslinux

ノート: initrd ファイルの intel-ucodeinitramfs-linux の間に空白は挟まないで下さい。ピリオド記号は省略ではありません。以下の記述そのままに編集するようにしてください。

/boot/syslinux/syslinux.cfg で複数の initrd をカンマで区切って指定できます:

LABEL arch
    MENU LABEL Arch Linux
    LINUX ../vmlinuz-linux
    INITRD ../intel-ucode.img,../initramfs-linux.img
    APPEND <your kernel parameters>

LILO

LILO などの旧式のブートローダーは複数の initrd イメージをサポートしていません。そのような場合 intel-ucodeinitramfs-linux をひとつのイメージにまとめる必要があります。

警告: カーネルをアップデートするたびに毎回イメージをマージして再生成する必要があります。
ノート: intel-ucode などの追加イメージは圧縮してはいけません。圧縮すると未圧縮イメージのごみしか認識されずカーネルがエラーを吐いて起動に失敗してしまいます。

intel-ucode.img は cpio アーカイブになっています。マイクロコードのアップデートがあるたびにアーカイブが圧縮されているかどうか確認することを推奨します。今後もイメージが同じフォーマットである保証はありません。intel-ucode が圧縮されているかどうか確認するには file コマンドを使います:

$ file /boot/intel-ucode.img 
/boot/intel-ucode.img: ASCII cpio archive (SVR4 with no CRC)
ノート: イメージの順番は重要です。オリジナルのイメージである initramfs-linuxintel-ucode イメージよりも先に来るように結合する必要があります。

ふたつのイメージを initramfs-merged.img という名前のイメージにマージするには、以下のコマンドを使用:

# cat /boot/intel-ucode.img /boot/initramfs-linux.img > /boot/initramfs-merged.img

マージできたら /etc/lilo.conf を編集して新しいイメージをロードします:

[...]
   initrd=/boot/initramfs-merged.img
[...]

root で lilo を実行してください:

# lilo

起動時にマイクロコードのアップデートがされたか確認する

マイクロコードがアップデートされたかどうか確認するには /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
ノート: 表示される日付は intel-ucode パッケージのバージョンとは対応しません。Intel がマイクロコードのアップデートを行った最後の日付が表示されます。

マイクロコードのアップデートができる 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 の下に表示されます。
  • メーカーの BIOS にマイクロコードが既に含まれていてロードされたことが dmesg に表示されていない可能性もあります。grep microcode /proc/cpuinfo を実行して現在のマイクロコードを比較してください。

カスタムカーネルで Intel のマイクロコードのロードを有効にする

カスタムカーネルでロードを行うには、"CPU microcode loading support" をカーネルに組み込む必要があります。モジュールとしてコンパイルしても動作しません。"Early load microcode" プロンプトが有効になるので "Y" に設定してください。

CONFIG_BLK_DEV_INITRD=Y
CONFIG_MICROCODE=y
CONFIG_MICROCODE_INTEL=Y

参照