Microcode (日本語) - ArchWiki

# Microcode (日本語)

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

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

Note: Arch Linux はアップデートを処理するのに `/etc/firmware` は使いません、代わりにファームウェアのバイナリは `/usr/lib/firmware/*.` に作成されます。

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

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

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

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

Warning: linux 3.17-2 と linux-lts 3.14.21-2 以降から、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
    	[...]

Note: すべてのメニューエントリに追加してください。
Warning: 更新があると `/usr/bin/grub-mkconfig` によってファイルが自動的に上書きされるため、ファイルの変更は取り消されてしまいます。
Tip: initramfs のパスと同じように、`/intel-ucode.img` のパスは boot パーティションとの相対パスです。つまり別個の `/boot` パーティションを使用する場合は `/intel-ucode.img` を使用し、`/boot` を分割しない場合は `/boot/intel-ucode.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

Note: このファイルに変更を加えると上流でパッケージのバージョンが上がった時に正しくインストールされない可能性があります。Pacnew and Pacsave Files (日本語) を見て下さい。

#### 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

Note: 表示される日付は intel-ucode パッケージのバージョンとは対応しません。Intel がマイクロコードのアップデートを行った最後の日付が表示されます。

## マイクロコードのアップデートができる CPU

特定のモデルがサポートされているのかどうかは以下のリンクから Intel や AMD のサイトで確認することができます:

- AMD の Operating System Research Center。
- Intel のダウンロードセンター。

#### マイクロコードのアップデートが必要かどうか確認する

iucode-tool を使って、使用している cpu のマイクロコードイメージが `intel-ucode.img` に含まれているかどうか確認できます:

- intel-ucode をインストール (アップデートがあるかどうか確認するのに initrd の変更は必要ありません)
- AUR から iucode-tool をインストール
- `# 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

Category:

- CPU (日本語)