「マイクロコード」の版間の差分
Kusakata.bot (トーク | 投稿記録) (Pkg/AUR テンプレートの更新) |
(同期) |
||
1行目: | 1行目: | ||
[[Category:CPU]] |
[[Category:CPU]] |
||
+ | [[Category:セキュリティ]] |
||
[[de:Microcode]] |
[[de:Microcode]] |
||
[[en:Microcode]] |
[[en:Microcode]] |
||
9行目: | 10行目: | ||
:''マイクロコードのデータファイルには全ての Intel プロセッサのための最新のマイクロコードが定義されています。Intel はマイクロコードのアップデートをリリースすることで、それぞれのプロセッサの仕様のアプリケーションに文書化されているようにプロセッサの挙動を修正します。一般的に、このマイクロコードの更新を行うのは BIOS のアップデートによりますが、これは管理者を困らせるような羽目になることがあるのを Intel は了解しています。Linux オペレーティングシステムや VMware ESX プロダクトには起動後にマイクロコードを更新する仕組みが備わっています。例えば、Linux システムの {{ic|/etc/firmware}} ディレクトリにファイルが配置されると、オペレーティングシステムの仕組みがこのファイルを使用します。'' |
:''マイクロコードのデータファイルには全ての Intel プロセッサのための最新のマイクロコードが定義されています。Intel はマイクロコードのアップデートをリリースすることで、それぞれのプロセッサの仕様のアプリケーションに文書化されているようにプロセッサの挙動を修正します。一般的に、このマイクロコードの更新を行うのは BIOS のアップデートによりますが、これは管理者を困らせるような羽目になることがあるのを Intel は了解しています。Linux オペレーティングシステムや VMware ESX プロダクトには起動後にマイクロコードを更新する仕組みが備わっています。例えば、Linux システムの {{ic|/etc/firmware}} ディレクトリにファイルが配置されると、オペレーティングシステムの仕組みがこのファイルを使用します。'' |
||
+ | 全てのユーザーがアップデートをインストールすべきですが、Intel Haswell と Broadwell プロセッサファミリーに属する CPU を使っている場合は特に、システムを安定させるためにマイクロコードのアップデートをインストールしてください。 |
||
− | {{Note|Arch Linux はアップデートを処理するのに {{ic|/etc/firmware}} は使いません、代わりにファームウェアのバイナリは {{ic|/usr/lib/firmware/*.}} に作成されます。}} |
||
− | == |
+ | == インストール == |
Intel のプロセッサの場合、{{Pkg|intel-ucode}} をインストールしてください。 |
Intel のプロセッサの場合、{{Pkg|intel-ucode}} をインストールしてください。 |
||
− | AMD のプロセッサの場合、 |
+ | AMD のプロセッサの場合、{{Pkg|amd-ucode}} をインストールしてください。 |
+ | Arch 環境を[[USB キーに Arch Linux をインストール|リムーバブルドライブ]]上に構築していて、両方のメーカーのマイクロコードが必要な場合、両方のパッケージをインストールしてください。 |
||
− | === Intel のマイクロコードのアップデートを有効にする === |
||
+ | == 起動初期にマイクロコードをアップデート == |
||
− | {{warning|linux 3.17-2 と linux-lts 3.14.21-2 以降から、Intel のマイクロコードのアップデートは自動では行われなくなりました。多くの AUR のカーネルも公式の Arch カーネルと同じようになっています: linux-ck 3.16.6-3 から、Intel のマイクロコードのアップデートは自動で行われないようになりました。}} |
||
+ | マイクロコードは[[ブートローダー]]からロードする必要があります。ブートの設定はユーザーによって様々であるため、Arch のデフォルト設定ではマイクロコードのアップデートは自動的に使われないようになっています。この点について AUR カーネルの多くは Arch の公式[[カーネル]]と同じようになっています。 |
||
− | アップデートを有効にするにはブートローダーの設定ファイルに {{ic|/boot/intel-ucode.img}} を一番目の initrd として追加する必要があります。通常の initrd ファイルとは別に追加します。 |
||
+ | アップデートを有効にするにはブートローダーの設定ファイルに {{ic|/boot/amd-ucode.img}} または {{ic|/boot/intel-ucode.img}} を一番目の initrd として追加する必要があります。通常の initrd ファイルとは別に追加します。 |
||
− | === サンプル === |
||
+ | {{Note|以下のセクションで出てくる {{ic|''cpu_manufacturer''}} はあなたが使っている CPU のメーカー名 ({{ic|amd}} または {{ic|intel}}) に置き換えてください。}} |
||
− | ==== EFI ブートスタブ / EFI ハンドオーバー ==== |
||
+ | {{Tip|[[USB キーに Arch Linux をインストール|リムーバブルドライブ]]に Arch Linux をインストールする場合、ブートローダーの設定にマイクロコードファイルを両方とも {{ic|initrd}} で追加してください。initramfs イメージよりも前に指定していればファイルの順番は関係ありません。}} |
||
− | 2つの {{ic|1=initrd=}} オプションを追加: |
||
+ | === GRUB === |
||
− | {{bc|1=initrd=/intel-ucode.img initrd=/initramfs-linux.img}} |
||
− | ==== |
+ | ==== 自動ロード ==== |
+ | ''grub-mkconfig'' が自動的にマイクロコードのアップデートを処理します。マイクロコードのパッケージをインストールした後に以下のコマンドを実行して、grub の設定を再生成し、マイクロコードのアップデートのロードを有効にしてください: |
||
− | {{ic|/boot/loader/entries/''entry''.conf}} で {{ic|initrd}} オプションを二回使用: |
||
+ | # grub-mkconfig -o /boot/grub/grub.cfg |
||
− | title Arch Linux |
||
− | linux /vmlinuz-linux |
||
− | initrd /intel-ucode.img |
||
− | initrd /initramfs-linux.img |
||
− | options ... |
||
+ | ==== 手動ロード ==== |
||
− | [[EFI システムパーティション]]を {{ic|/boot}} にマウントしていない場合、{{ic|/boot/intel-ucode.img}} を EFI システムパーティションにコピーしてください。 |
||
+ | もしくは、[[GRUB]] の設定ファイルを手動で管理したい場合、以下のように {{ic|grub.cfg}} に {{ic|/boot/''cpu_manufacturer''-ucode.img}} ({{ic|/boot}} パーティションを分けている場合は {{ic|/''cpu_manufacturer''-ucode.img}}) を追加します: |
||
− | ==== rEFInd ==== |
||
+ | {{hc|/boot/grub/grub.cfg| |
||
− | 上記の EFI ブートスタブと同じように {{ic|/boot/refind_linux.conf}} のブートオプションを編集する、例: |
||
+ | ... |
||
+ | echo 'Loading initial ramdisk' |
||
+ | initrd '''/boot/''cpu_manufacturer''-ucode.img''' /boot/initramfs-linux.img |
||
+ | ... |
||
+ | }} |
||
+ | すべてのメニューエントリに追加してください。 |
||
− | "Boot with standard options" "rw root=UUID=(...) quiet initrd=/boot/intel-ucode.img initrd=/boot/initramfs-linux.img" |
||
+ | === systemd-boot === |
||
− | [[rEFInd#手動でブートエントリを記述|手動]]で {{ic|/boot/refind.conf}} にカーネルを定義している場合はメインの部分ではなく options 行に {{ic|1=initrd=/intel-ucode.img}} や {{ic|/boot/intel-ucode.img}} を追加してください。 |
||
+ | 以下のように初期 RAM ディスクの前に {{ic|initrd}} オプションを使ってマイクロコードをロード: |
||
− | ==== Grub ==== |
||
− | grub-1:2.02-beta2-5 から、''grub-mkconfig'' が自動的にマイクロコードのアップデートを処理します。{{Pkg|intel-ucode}} をインストールした後に {{ic|# grub-mkconfig -o /boot/grub/grub.cfg}} を実行して、grub の設定を再生成し、マイクロコードのアップデートのロードを有効にしてください。 |
||
+ | {{hc|/boot/loader/entries/''entry''.conf| |
||
− | もしくは、[[GRUB]] の設定ファイルを手動で管理したい場合、以下のように {{ic|grub.cfg}} に {{ic|/intel-ucode.img}} や {{ic|/boot/intel-ucode.img}} を追加します: |
||
+ | title Arch Linux |
||
+ | linux /vmlinuz-linux |
||
+ | '''initrd /''cpu_manufacturer''-ucode.img''' |
||
+ | initrd /initramfs-linux.img |
||
+ | ... |
||
+ | }} |
||
+ | 最新のマイクロコード {{ic|''cpu_manufacturer''-ucode.img}} が起動時に [[EFI システムパーティション]]に必要となります。{{Pkg|amd-ucode}} または {{Pkg|intel-ucode}} を更新したときはマイクロコードが更新されるように {{ic|/boot}} に ESP をマウントしてください。もしくは ESP に {{ic|/boot/''cpu_manufacturer''-ucode.img}} をコピーしてください。 |
||
− | [...] |
||
− | echo 'Loading initial ramdisk ...' |
||
− | initrd /intel-ucode.img /initramfs-linux.img |
||
− | [...] |
||
+ | === EFI ブートスタブ / EFI ハンドオーバー === |
||
− | {{Note|すべてのメニューエントリに追加してください。}} |
||
+ | {{ic|1=initrd=}} オプションを2つ追加: |
||
− | {{warning|更新があると {{ic|/usr/bin/grub-mkconfig}} によってファイルが自動的に上書きされるため、ファイルの変更は取り消されてしまいます。}} |
||
+ | '''initrd=/''cpu_manufacturer''-ucode.img''' initrd=/initramfs-linux.img |
||
− | ==== Syslinux ==== |
||
+ | 全ての initrd とコマンドライン、カーネルを含むひとつのファイルとしてカーネルを生成した場合、まず以下のように新しい initrd を作成して統合してください: |
||
− | {{Note|initrd ファイルの {{ic|intel-ucode}} と {{ic|initramfs-linux}} の間に空白は挟まないで下さい。ピリオド記号は省略ではありません。以下の記述そのままに編集するようにしてください。}} |
||
+ | |||
+ | {{bc|1= |
||
+ | cat /boot/''cpu_manufacturer''-ucode.img /boot/initramfs-linux.img > my_new_initrd |
||
+ | objcopy ... --add-section .initrd=my_new_initrd |
||
+ | }} |
||
+ | |||
+ | === rEFInd === |
||
+ | |||
+ | 上記の EFI ブートスタブと同じように {{ic|/boot/refind_linux.conf}} のブートオプションを編集する、例: |
||
+ | |||
+ | "Boot with standard options" "rw root=UUID=(...) '''initrd=/boot/''cpu_manufacturer''-ucode.img''' initrd=/boot/initramfs-linux.img" |
||
+ | |||
+ | [[rEFInd#手動でブートエントリを記述|手動]]で {{ic|''esp''/EFI/refind/refind.conf}} にカーネルを定義している場合はメインの部分ではなく options 行に {{ic|/boot/''cpu_manufacturer''-ucode.img}} ({{ic|/boot}} パーティションを分けている場合は {{ic|/''cpu_manufacturer''-ucode.img}}) を追加してください。例: |
||
+ | |||
+ | options "root=root=UUID=(...) rw add_efi_memmap '''initrd=/boot/''cpu_manufacturer''-ucode.img'''" |
||
+ | |||
+ | === Syslinux === |
||
+ | |||
+ | {{Note|initrd ファイルの {{ic|''cpu_manufacturer''-ucode.img}} と {{ic|initramfs-linux}} の間に空白は挟まないで下さい。以下の記述そのままに編集するようにしてください。}} |
||
{{ic|/boot/syslinux/syslinux.cfg}} で複数の initrd をカンマで区切って指定できます: |
{{ic|/boot/syslinux/syslinux.cfg}} で複数の initrd をカンマで区切って指定できます: |
||
74行目: | 97行目: | ||
MENU LABEL Arch Linux |
MENU LABEL Arch Linux |
||
LINUX ../vmlinuz-linux |
LINUX ../vmlinuz-linux |
||
− | INITRD ../ |
+ | INITRD '''../''cpu_manufacturer''-ucode.img''',../initramfs-linux.img |
+ | ... |
||
− | APPEND ''<your kernel parameters>'' |
||
− | + | === LILO === |
|
+ | |||
+ | LILO などの旧式のブートローダーは複数の initrd イメージをサポートしていません。そのような場合 {{ic|''cpu_manufacturer''-ucode.img}} と {{ic|initramfs-linux.img}} をひとつのイメージにまとめる必要があります。 |
||
− | LILO などの旧式のブートローダーは複数の initrd イメージをサポートしていません。そのような場合 {{ic|intel-ucode}} と {{ic|initramfs-linux}} をひとつのイメージにまとめる必要があります。 |
||
{{Warning|カーネルをアップデートするたびに毎回イメージをマージして再生成する必要があります。}} |
{{Warning|カーネルをアップデートするたびに毎回イメージをマージして再生成する必要があります。}} |
||
+ | |||
− | {{Note|{{ic|intel-ucode}} などの追加イメージは圧縮してはいけません。圧縮すると未圧縮イメージのごみしか認識されずカーネルがエラーを吐いて起動に失敗してしまいます。}} |
||
+ | {{Note|イメージの順番は重要です。オリジナルのイメージである {{ic|initramfs-linux}} は {{ic|''cpu_manufacturer''-ucode.img}} イメージよりも先に来るように結合する必要があります。}} |
||
− | {{ic|intel-ucode.img}} は cpio アーカイブになっています。マイクロコードのアップデートがあるたびにアーカイブが圧縮されているかどうか確認することを推奨します。今後もイメージが同じフォーマットである保証はありません。{{ic|intel-ucode}} が圧縮されているかどうか確認するには {{ic|file}} コマンドを使います: |
||
+ | |||
− | $ file /boot/intel-ucode.img |
||
− | /boot/intel-ucode.img: ASCII cpio archive (SVR4 with no CRC) |
||
− | {{Note|イメージの順番は重要です。オリジナルのイメージである {{ic|initramfs-linux}} は {{ic|intel-ucode}} イメージよりも先に来るように結合する必要があります。}} |
||
ふたつのイメージを {{ic|initramfs-merged.img}} という名前のイメージにマージするには、以下のコマンドを使用: |
ふたつのイメージを {{ic|initramfs-merged.img}} という名前のイメージにマージするには、以下のコマンドを使用: |
||
− | # cat /boot/ |
+ | # cat /boot/''cpu_manufacturer''-ucode.img /boot/initramfs-linux.img > /boot/initramfs-merged.img |
マージできたら {{ic|/etc/lilo.conf}} を編集して新しいイメージをロードします: |
マージできたら {{ic|/etc/lilo.conf}} を編集して新しいイメージをロードします: |
||
− | + | ... |
|
− | + | initrd=/boot/initramfs-merged.img |
|
− | + | ... |
|
root で {{ic|lilo}} を実行してください: |
root で {{ic|lilo}} を実行してください: |
||
# lilo |
# lilo |
||
+ | |||
+ | == 起動後にマイクロコードをアップデート == |
||
+ | |||
+ | システムを起動した後にマイクロコードのアップデートをロードすることもできます。{{ic|/usr/lib/firmware/amd-ucode/}} と {{ic|/usr/lib/firmware/intel-ucode/}} のファイルを使用します。 |
||
+ | |||
+ | AMD プロセッサの場合、マイクロコードのアップデートファイルは {{Pkg|linux-firmware}} によって提供されます。 |
||
+ | |||
+ | Intel プロセッサの場合、マイクロコードのアップデートファイルが含まれるパッケージはありません ({{Bug|59841}})。起動後にロードするには Intel が提供しているアーカイブから手動で {{ic|intel-ucode/}} を抽出する必要があります。 |
||
+ | |||
+ | === マイクロコードのアップデートを有効にする === |
||
+ | |||
+ | 起動初期のロードとは異なり、起動後のマイクロコードのアップデートのロードは Arch Linux ではデフォルトで有効になっており {{ic|/usr/lib/tmpfiles.d/linux-firmware.conf}} を使用します。起動後に {{man|8|systemd-tmpfiles-setup.service}} によってファイルが読み込まれて CPU のマイクロコードが更新されます。 |
||
+ | |||
+ | 実行中のシステムで手動でマイクロコードをアップデートするには: |
||
+ | |||
+ | # echo 1 > /sys/devices/system/cpu/microcode/reload |
||
+ | |||
+ | このコマンドを使えば {{Pkg|linux-firmware}} が更新されたときにシステムを再起動することなくマイクロコードのアップデートを適用することができます。[[pacman フック]]を使って自動的にコマンドを実行することも可能です: |
||
+ | |||
+ | {{hc|/etc/pacman.d/hooks/microcode_reload.hook|2= |
||
+ | [Trigger] |
||
+ | Operation = Install |
||
+ | Operation = Upgrade |
||
+ | Operation = Remove |
||
+ | Type = File |
||
+ | Target = usr/lib/firmware/amd-ucode/* |
||
+ | |||
+ | [Action] |
||
+ | Description = Applying CPU microcode updates... |
||
+ | When = PostTransaction |
||
+ | Depends = sh |
||
+ | Exec = /bin/sh -c 'echo 1 > /sys/devices/system/cpu/microcode/reload' |
||
+ | }} |
||
+ | |||
+ | === マイクロコードのアップデートを無効にする === |
||
+ | |||
+ | AMD 環境では {{Pkg|amd-ucode}} がインストールされてなくても {{Pkg|linux-firmware}} にファイルが含まれているため CPU のマイクロコードはアップデートされてしまいます ({{Bug|59840}})。起動後のロードを無効にしたい場合は {{ic|/usr/lib/tmpfiles.d/linux-firmware.conf}} を無効にしてください。{{ic|/etc/tmpfiles.d/}} に同名のファイルを作成することで無効化できます: |
||
+ | |||
+ | # ln -s /dev/null /etc/tmpfiles.d/linux-firmware.conf |
||
== 起動時にマイクロコードのアップデートがされたか確認する == |
== 起動時にマイクロコードのアップデートがされたか確認する == |
||
119行目: | 180行目: | ||
[ 0.507296] microcode: CPU6 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.507300] microcode: CPU7 sig=0x306a9, pf=0x2, revision=0x1b |
||
− | [ 0.507335] microcode: Microcode Update Driver: v2. |
+ | [ 0.507335] microcode: Microcode Update Driver: v2.2. |
+ | |||
+ | {{Note|表示される日付は {{pkg|intel-ucode}} パッケージのバージョンとは対応しません。Intel がマイクロコードのアップデートを行った最後の日付が表示されます。}} |
||
最新のハードウェアの場合、CPU のマイクロコードアップデートが存在しないという可能性も考えられます。そのときは、以下のような出力がなされます: |
最新のハードウェアの場合、CPU のマイクロコードアップデートが存在しないという可能性も考えられます。そのときは、以下のような出力がなされます: |
||
127行目: | 190行目: | ||
[ 0.292906] microcode: CPU2 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.292912] microcode: CPU3 sig=0x306c3, pf=0x2, revision=0x1c |
||
− | [ 0.292956] microcode: Microcode Update Driver: v2. |
+ | [ 0.292956] microcode: Microcode Update Driver: v2.2. |
− | AMD 環境で |
+ | AMD 環境で起動初期にマイクロコードをアップデートしている場合、以下のように出力されます: |
− | [ |
+ | [ 2.119089] microcode: microcode updated early to new patch_level=0x0700010f |
− | [ |
+ | [ 2.119157] microcode: CPU0: patch_level=0x0700010f |
− | [ |
+ | [ 2.119171] microcode: CPU1: patch_level=0x0700010f |
− | [ |
+ | [ 2.119183] microcode: CPU2: patch_level=0x0700010f |
− | [ |
+ | [ 2.119189] microcode: CPU3: patch_level=0x0700010f |
+ | [ 2.119269] microcode: Microcode Update Driver: v2.2. |
||
− | + | AMD 環境で起動後にマイクロコードをアップデートしている場合、古いマイクロコードのバージョンが表示されてからマイクロコードがリロードされ、新しいマイクロコードのバージョンが表示されます。例: |
|
+ | |||
+ | [ 2.112919] microcode: CPU0: patch_level=0x0700010b |
||
+ | [ 2.112931] microcode: CPU1: patch_level=0x0700010b |
||
+ | [ 2.112940] microcode: CPU2: patch_level=0x0700010b |
||
+ | [ 2.112951] microcode: CPU3: patch_level=0x0700010b |
||
+ | [ 2.113043] microcode: Microcode Update Driver: v2.2. |
||
+ | [ 6.429109] microcode: CPU2: new patch_level=0x0700010f |
||
+ | [ 6.430416] microcode: CPU0: new patch_level=0x0700010f |
||
+ | [ 6.431722] microcode: CPU1: new patch_level=0x0700010f |
||
+ | [ 6.433029] microcode: CPU3: new patch_level=0x0700010f |
||
+ | [ 6.433073] x86/CPU: CPU features have changed after loading microcode, but might not take effect. |
||
== マイクロコードのアップデートができる CPU == |
== マイクロコードのアップデートができる CPU == |
||
144行目: | 219行目: | ||
* [http://www.amd64.org/microcode.html AMD の Operating System Research Center]。 |
* [http://www.amd64.org/microcode.html AMD の Operating System Research Center]。 |
||
− | * [https://downloadcenter.intel.com/ |
+ | * [https://downloadcenter.intel.com/SearchResult.aspx?lang=eng&keyword=processor%20microcode%20data%20file Intel のダウンロードセンター]。 |
=== マイクロコードのアップデートが必要かどうか確認する === |
=== マイクロコードのアップデートが必要かどうか確認する === |
||
151行目: | 226行目: | ||
* {{Pkg|intel-ucode}} をインストール (アップデートがあるかどうか確認するのに initrd の変更は必要ありません) |
* {{Pkg|intel-ucode}} をインストール (アップデートがあるかどうか確認するのに initrd の変更は必要ありません) |
||
− | * |
+ | * {{Pkg|iucode-tool}} をインストール |
* {{ic|# modprobe cpuid}} |
* {{ic|# modprobe cpuid}} |
||
* {{ic|<nowiki># bsdtar -Oxf /boot/intel-ucode.img | iucode_tool -tb -lS - </nowiki>}}<br />(マイクロコードイメージを展開して cpuid を検索します) |
* {{ic|<nowiki># bsdtar -Oxf /boot/intel-ucode.img | iucode_tool -tb -lS - </nowiki>}}<br />(マイクロコードイメージを展開して cpuid を検索します) |
||
164行目: | 239行目: | ||
CONFIG_MICROCODE=y |
CONFIG_MICROCODE=y |
||
CONFIG_MICROCODE_INTEL=Y |
CONFIG_MICROCODE_INTEL=Y |
||
+ | CONFIG_MICROCODE_AMD=y |
||
== 参照 == |
== 参照 == |
||
169行目: | 245行目: | ||
* [https://flossexperiences.wordpress.com/2013/11/17/updating-microcodes/ Updating microcodes] |
* [https://flossexperiences.wordpress.com/2013/11/17/updating-microcodes/ Updating microcodes] |
||
* [http://inertiawar.com/microcode/ Intel によるマイクロコードアップデートのノート] |
* [http://inertiawar.com/microcode/ Intel によるマイクロコードアップデートのノート] |
||
− | * [https://www.kernel.org/doc/Documentation/x86/ |
+ | * [https://www.kernel.org/doc/Documentation/x86/microcode.txt マイクロコードのカーネルドキュメント] |
* [http://www.anandtech.com/show/8376/intel-disables-tsx-instructions-erratum-found-in-haswell-haswelleep-broadwelly Haswell/Broadwell で見つかったエラッタ] |
* [http://www.anandtech.com/show/8376/intel-disables-tsx-instructions-erratum-found-in-haswell-haswelleep-broadwelly Haswell/Broadwell で見つかったエラッタ] |
||
− | * [https://gitlab.com/iucode-tool/iucode-tool |
+ | * [https://gitlab.com/iucode-tool/iucode-tool iucode-tool GitLab プロジェクト] |
2018年12月12日 (水) 20:30時点における版
プロセッサのマイクロコードはプロセッサのファームウェアと同種のものです。カーネルは BIOS のアップデートをすることなくプロセッサのファームウェアをアップデートすることができます。Intel のウェブサイトより:
- マイクロコードのデータファイルには全ての Intel プロセッサのための最新のマイクロコードが定義されています。Intel はマイクロコードのアップデートをリリースすることで、それぞれのプロセッサの仕様のアプリケーションに文書化されているようにプロセッサの挙動を修正します。一般的に、このマイクロコードの更新を行うのは BIOS のアップデートによりますが、これは管理者を困らせるような羽目になることがあるのを Intel は了解しています。Linux オペレーティングシステムや VMware ESX プロダクトには起動後にマイクロコードを更新する仕組みが備わっています。例えば、Linux システムの
/etc/firmware
ディレクトリにファイルが配置されると、オペレーティングシステムの仕組みがこのファイルを使用します。
全てのユーザーがアップデートをインストールすべきですが、Intel Haswell と Broadwell プロセッサファミリーに属する CPU を使っている場合は特に、システムを安定させるためにマイクロコードのアップデートをインストールしてください。
目次
インストール
Intel のプロセッサの場合、intel-ucode をインストールしてください。
AMD のプロセッサの場合、amd-ucode をインストールしてください。
Arch 環境をリムーバブルドライブ上に構築していて、両方のメーカーのマイクロコードが必要な場合、両方のパッケージをインストールしてください。
起動初期にマイクロコードをアップデート
マイクロコードはブートローダーからロードする必要があります。ブートの設定はユーザーによって様々であるため、Arch のデフォルト設定ではマイクロコードのアップデートは自動的に使われないようになっています。この点について AUR カーネルの多くは Arch の公式カーネルと同じようになっています。
アップデートを有効にするにはブートローダーの設定ファイルに /boot/amd-ucode.img
または /boot/intel-ucode.img
を一番目の initrd として追加する必要があります。通常の initrd ファイルとは別に追加します。
GRUB
自動ロード
grub-mkconfig が自動的にマイクロコードのアップデートを処理します。マイクロコードのパッケージをインストールした後に以下のコマンドを実行して、grub の設定を再生成し、マイクロコードのアップデートのロードを有効にしてください:
# grub-mkconfig -o /boot/grub/grub.cfg
手動ロード
もしくは、GRUB の設定ファイルを手動で管理したい場合、以下のように grub.cfg
に /boot/cpu_manufacturer-ucode.img
(/boot
パーティションを分けている場合は /cpu_manufacturer-ucode.img
) を追加します:
/boot/grub/grub.cfg
... echo 'Loading initial ramdisk' initrd /boot/cpu_manufacturer-ucode.img /boot/initramfs-linux.img ...
すべてのメニューエントリに追加してください。
systemd-boot
以下のように初期 RAM ディスクの前に initrd
オプションを使ってマイクロコードをロード:
/boot/loader/entries/entry.conf
title Arch Linux linux /vmlinuz-linux initrd /cpu_manufacturer-ucode.img initrd /initramfs-linux.img ...
最新のマイクロコード cpu_manufacturer-ucode.img
が起動時に EFI システムパーティションに必要となります。amd-ucode または intel-ucode を更新したときはマイクロコードが更新されるように /boot
に ESP をマウントしてください。もしくは ESP に /boot/cpu_manufacturer-ucode.img
をコピーしてください。
EFI ブートスタブ / EFI ハンドオーバー
initrd=
オプションを2つ追加:
initrd=/cpu_manufacturer-ucode.img initrd=/initramfs-linux.img
全ての initrd とコマンドライン、カーネルを含むひとつのファイルとしてカーネルを生成した場合、まず以下のように新しい initrd を作成して統合してください:
cat /boot/cpu_manufacturer-ucode.img /boot/initramfs-linux.img > my_new_initrd objcopy ... --add-section .initrd=my_new_initrd
rEFInd
上記の EFI ブートスタブと同じように /boot/refind_linux.conf
のブートオプションを編集する、例:
"Boot with standard options" "rw root=UUID=(...) initrd=/boot/cpu_manufacturer-ucode.img initrd=/boot/initramfs-linux.img"
手動で esp/EFI/refind/refind.conf
にカーネルを定義している場合はメインの部分ではなく options 行に /boot/cpu_manufacturer-ucode.img
(/boot
パーティションを分けている場合は /cpu_manufacturer-ucode.img
) を追加してください。例:
options "root=root=UUID=(...) rw add_efi_memmap initrd=/boot/cpu_manufacturer-ucode.img"
Syslinux
/boot/syslinux/syslinux.cfg
で複数の initrd をカンマで区切って指定できます:
LABEL arch MENU LABEL Arch Linux LINUX ../vmlinuz-linux INITRD ../cpu_manufacturer-ucode.img,../initramfs-linux.img ...
LILO
LILO などの旧式のブートローダーは複数の initrd イメージをサポートしていません。そのような場合 cpu_manufacturer-ucode.img
と initramfs-linux.img
をひとつのイメージにまとめる必要があります。
ふたつのイメージを initramfs-merged.img
という名前のイメージにマージするには、以下のコマンドを使用:
# cat /boot/cpu_manufacturer-ucode.img /boot/initramfs-linux.img > /boot/initramfs-merged.img
マージできたら /etc/lilo.conf
を編集して新しいイメージをロードします:
... initrd=/boot/initramfs-merged.img ...
root で lilo
を実行してください:
# lilo
起動後にマイクロコードをアップデート
システムを起動した後にマイクロコードのアップデートをロードすることもできます。/usr/lib/firmware/amd-ucode/
と /usr/lib/firmware/intel-ucode/
のファイルを使用します。
AMD プロセッサの場合、マイクロコードのアップデートファイルは linux-firmware によって提供されます。
Intel プロセッサの場合、マイクロコードのアップデートファイルが含まれるパッケージはありません (FS#59841)。起動後にロードするには Intel が提供しているアーカイブから手動で intel-ucode/
を抽出する必要があります。
マイクロコードのアップデートを有効にする
起動初期のロードとは異なり、起動後のマイクロコードのアップデートのロードは Arch Linux ではデフォルトで有効になっており /usr/lib/tmpfiles.d/linux-firmware.conf
を使用します。起動後に systemd-tmpfiles-setup.service(8) によってファイルが読み込まれて CPU のマイクロコードが更新されます。
実行中のシステムで手動でマイクロコードをアップデートするには:
# echo 1 > /sys/devices/system/cpu/microcode/reload
このコマンドを使えば linux-firmware が更新されたときにシステムを再起動することなくマイクロコードのアップデートを適用することができます。pacman フックを使って自動的にコマンドを実行することも可能です:
/etc/pacman.d/hooks/microcode_reload.hook
[Trigger] Operation = Install Operation = Upgrade Operation = Remove Type = File Target = usr/lib/firmware/amd-ucode/* [Action] Description = Applying CPU microcode updates... When = PostTransaction Depends = sh Exec = /bin/sh -c 'echo 1 > /sys/devices/system/cpu/microcode/reload'
マイクロコードのアップデートを無効にする
AMD 環境では amd-ucode がインストールされてなくても linux-firmware にファイルが含まれているため CPU のマイクロコードはアップデートされてしまいます (FS#59840)。起動後のロードを無効にしたい場合は /usr/lib/tmpfiles.d/linux-firmware.conf
を無効にしてください。/etc/tmpfiles.d/
に同名のファイルを作成することで無効化できます:
# ln -s /dev/null /etc/tmpfiles.d/linux-firmware.conf
起動時にマイクロコードのアップデートがされたか確認する
マイクロコードがアップデートされたかどうか確認するには /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.2.
最新のハードウェアの場合、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.2.
AMD 環境で起動初期にマイクロコードをアップデートしている場合、以下のように出力されます:
[ 2.119089] microcode: microcode updated early to new patch_level=0x0700010f [ 2.119157] microcode: CPU0: patch_level=0x0700010f [ 2.119171] microcode: CPU1: patch_level=0x0700010f [ 2.119183] microcode: CPU2: patch_level=0x0700010f [ 2.119189] microcode: CPU3: patch_level=0x0700010f [ 2.119269] microcode: Microcode Update Driver: v2.2.
AMD 環境で起動後にマイクロコードをアップデートしている場合、古いマイクロコードのバージョンが表示されてからマイクロコードがリロードされ、新しいマイクロコードのバージョンが表示されます。例:
[ 2.112919] microcode: CPU0: patch_level=0x0700010b [ 2.112931] microcode: CPU1: patch_level=0x0700010b [ 2.112940] microcode: CPU2: patch_level=0x0700010b [ 2.112951] microcode: CPU3: patch_level=0x0700010b [ 2.113043] microcode: Microcode Update Driver: v2.2. [ 6.429109] microcode: CPU2: new patch_level=0x0700010f [ 6.430416] microcode: CPU0: new patch_level=0x0700010f [ 6.431722] microcode: CPU1: new patch_level=0x0700010f [ 6.433029] microcode: CPU3: new patch_level=0x0700010f [ 6.433073] x86/CPU: CPU features have changed after loading microcode, but might not take effect.
マイクロコードのアップデートができる CPU
特定のモデルがサポートされているのかどうかは以下のリンクから Intel や AMD のサイトで確認することができます:
マイクロコードのアップデートが必要かどうか確認する
iucode-tool を使って、使用している cpu のマイクロコードイメージが intel-ucode.img
に含まれているかどうか確認できます:
- intel-ucode をインストール (アップデートがあるかどうか確認するのに initrd の変更は必要ありません)
- iucode-tool をインストール
# 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 CONFIG_MICROCODE_AMD=y