「マイクロコード」の版間の差分
(英語版と同期) |
(同期) |
||
6行目: | 6行目: | ||
[[ru:Microcode]] |
[[ru:Microcode]] |
||
[[zh-hans:Microcode]] |
[[zh-hans:Microcode]] |
||
− | [[Wikipedia:ja:マイクロプログラム方式| |
+ | プロセッサの製造者はプロセッサ[[Wikipedia:ja:マイクロプログラム方式|マイクロコード]]に安定性とセキュリティのアップデートをリリースしています。そのようなアップデートには、システムの安定性に深く関わるバグフィックスが含まれています。これがないと、追跡困難な疑わしいクラッシュや予期しないシステム停止を引き起こす場合があります。 |
+ | AMD や Intel CPU を持つすべてのユーザは、システムの安定性を確保するためにマイクロコードのアップデートをインストールすべきです。 |
||
− | :''マイクロコードのデータファイルには全ての Intel プロセッサのための最新のマイクロコードが定義されています。Intel はマイクロコードのアップデートをリリースすることで、それぞれのプロセッサの仕様のアプリケーションに文書化されているようにプロセッサの挙動を修正します。一般的に、このマイクロコードの更新を行うのは BIOS のアップデートによりますが、これは管理者を困らせるような羽目になることがあるのを Intel は了解しています。Linux オペレーティングシステムや VMware ESX プロダクトには起動後にマイクロコードを更新する仕組みが備わっています。例えば、Linux システムの {{ic|/etc/firmware}} ディレクトリにファイルが配置されると、オペレーティングシステムの仕組みがこのファイルを使用します。'' |
||
+ | 通常、マイクロコードのアップデートはマザーボードのファームウェアに同梱されており、ファームウェアの初期化中に適用されます。しかし、OEM はファームウェアのアップデートをタイムリーにリリースしないかもしれない上、古いシステムでは新しいファームウェアアップデートは全くリリースされないので、起動中に CPU マイクロコードアップデートを適用する機能が Linux カーネルに追加されました。[https://docs.kernel.org/x86/microcode.html Linux マイクロコードローダ]は3つの方法をサポートします: |
||
− | 全てのユーザーがアップデートをインストールすべきですが、Intel Haswell と Broadwell プロセッサファミリーに属する CPU を使っている場合は特に、システムを安定させるためにマイクロコードのアップデートをインストールしてください。 |
||
+ | # '''早期ロード''' は、起動中の非常に早い段階(initramfs ステージよりも前)でマイクロコードをアップデートします。なので、これは推奨される方法です。Intel の Haswell や Broadwell プロセッサファミリのように CPU に深刻なハードウェアバグが存在する場合、これは必須です。 |
||
− | == インストール == |
||
+ | # '''遅延ロード'''('''危険''') は、起動後にマイクロコードをアップデートします。CPU がバグのある命令セットの使用をすでに試みたかもしれないので、これでは遅すぎる可能性があります。「早期ロード」をすでに使用している場合でも、「遅延ロード」を使用して再起動せずに新しいマイクロコードのアップデートを適用できます。 |
||
+ | # '''組み込みマイクロコード''' はカーネルにコンパイルされます。早期ローダ(early loader)により適用されます。 |
||
+ | == 早期ロード == |
||
− | Intel のプロセッサの場合、{{Pkg|intel-ucode}} をインストールしてください。 |
||
− | + | === インストール === |
|
− | + | プロセッサに応じて以下のパッケージを[[インストール]]してください: |
|
+ | * {{Pkg|amd-ucode}} AMD プロセッサ向け |
||
+ | * {{Pkg|intel-ucode}} Intel プロセッサ向け |
||
+ | マイクロコードは[[ブートローダー]]によって読み込まれなければなりません。初期ブート設定はユーザによって様々なので、マイクロコードのアップデートは Arch のデフォルト設定では自動的にトリガーされない場合があります。この点について AUR カーネルの多くは Arch の公式[[カーネル]]と同じようになっています。 |
||
− | == 起動初期にマイクロコードをアップデート == |
||
+ | アップデートを有効にするには、{{ic|/boot/amd-ucode.img}} または {{ic|/boot/intel-ucode.img}} を'''ブートローダーの設定ファイルの 一番目の initrd''' として追加しなければなりません。これは、通常の initrd ファイルよりも前です。一般的なブートローダの場合における手順は以下を見てください。 |
||
− | マイクロコードは[[ブートローダー]]からロードする必要があります。ブートの設定はユーザーによって様々であるため、Arch のデフォルト設定ではマイクロコードのアップデートは自動的に使われないようになっています。この点について AUR カーネルの多くは Arch の公式[[カーネル]]と同じようになっています。 |
||
+ | 以下のセクションでは {{ic|''cpu_manufacturer''}} の部分をあなたの CPU の製造業者名に置き換えてください、例: {{ic|amd}} か {{ic|intel}}。 |
||
− | アップデートを有効にするにはブートローダーの設定ファイルに {{ic|/boot/amd-ucode.img}} または {{ic|/boot/intel-ucode.img}} を一番目の initrd として追加する必要があります。通常の initrd ファイルとは別に追加します。 |
||
+ | {{Tip|[[リムーバブルメディアに Arch Linux をインストール|リムーバブルドライブ上の Arch Linux]] をこれらのプロセッサの両方で動かす可能性がある場合、両方のパッケージをインストールし両方のマイクロコードファイルを {{ic|initrd}} としてブートローダの設定に追加してください。initramfs イメージよりも前に指定していればファイルの順番は関係ありません。}} |
||
− | {{Note|以下のセクションで出てくる {{ic|''cpu_manufacturer''}} はあなたが使っている CPU のメーカー名 ({{ic|amd}} または {{ic|intel}}) に置き換えてください。}} |
||
+ | === 設定 === |
||
− | {{Tip|[[USB キーに Arch Linux をインストール|リムーバブルドライブ]]に Arch Linux をインストールする場合、ブートローダーの設定にマイクロコードファイルを両方とも {{ic|initrd}} で追加してください。initramfs イメージよりも前に指定していればファイルの順番は関係ありません。}} |
||
+ | ==== カスタムカーネルでマイクロコードの早期ロードを有効化 ==== |
||
− | === GRUB === |
||
+ | カスタムカーネルでロードを行うには、"CPU microcode loading support" をカーネルに組み込む必要があります。モジュールとしてコンパイルしても動作しません。"Early load microcode" プロンプトが有効になるので "Y" に設定してください。 |
||
− | ==== 自動ロード ==== |
||
+ | CONFIG_BLK_DEV_INITRD=Y |
||
− | ''grub-mkconfig'' が自動的にマイクロコードのアップデートを処理します。マイクロコードのパッケージをインストールした後に以下のコマンドを実行して、grub の設定を再生成し、マイクロコードのアップデートのロードを有効にしてください: |
||
+ | CONFIG_MICROCODE=y |
||
+ | CONFIG_MICROCODE_INTEL=Y |
||
+ | CONFIG_MICROCODE_AMD=y |
||
+ | ==== GRUB ==== |
||
− | # grub-mkconfig -o /boot/grub/grub.cfg |
||
+ | ''grub-mkconfig'' はマイクロコードのアップデートを自動的に検出し、[[GRUB]] を適切に設定します。マイクロコードのインストール後に以下を実行して GRUB 設定ファイルを再生成し、マイクロコードアップデートのロードを有効化してください: |
||
− | ==== 手動ロード ==== |
||
+ | |||
+ | # grub-mkconfig -o /boot/grub/grub.cfg |
||
− | + | あるいは、GRUB 設定ファイルを手動で管理しているユーザは、以下のように {{ic|/boot/''cpu_manufacturer''-ucode.img}} を追加できます(別のパーティションに {{ic|/boot}} がある場合は {{ic|/''cpu_manufacturer''-ucode.img}}): |
|
{{hc|/boot/grub/grub.cfg| |
{{hc|/boot/grub/grub.cfg| |
||
49行目: | 58行目: | ||
}} |
}} |
||
− | + | それぞれのメニュエントリに対してこれを行ってください。 |
|
− | === systemd-boot === |
+ | ==== systemd-boot ==== |
以下のように初期 RAM ディスクの前に {{ic|initrd}} オプションを使ってマイクロコードをロード: |
以下のように初期 RAM ディスクの前に {{ic|initrd}} オプションを使ってマイクロコードをロード: |
||
63行目: | 72行目: | ||
}} |
}} |
||
− | 最新のマイクロコード {{ic|''cpu_manufacturer''-ucode.img}} |
+ | 最新のマイクロコード {{ic|''cpu_manufacturer''-ucode.img}} は起動時に [[EFI システムパーティション]] (ESP) に存在していなければなりません。{{Pkg|amd-ucode}} または {{Pkg|intel-ucode}} を更新したときはマイクロコードが更新されるように {{ic|/boot}} に ESP をマウントしてください。もしくは、マイクロコードパッケージのアップデートがあるたびに ESP に {{ic|/boot/''cpu_manufacturer''-ucode.img}} をコピーしてください。 |
− | === |
+ | ==== Unified カーネルイメージ ==== |
+ | [[Unified カーネルイメージ#手動で]] を見てください。 |
||
− | {{ic|1=initrd=}} オプションを2つ追加: |
||
+ | ==== EFISTUB ==== |
||
− | '''initrd=/''cpu_manufacturer''-ucode.img''' initrd=/initramfs-linux.img |
||
+ | 2つの {{ic|1=initrd=}} オプションを末尾に追加してください: |
||
− | 全ての initrd とコマンドライン、カーネルを含む[[systemd-boot#/EFI/Linux のカーネルの準備|ひとつのファイルとしてカーネルを生成した]]場合、まず以下のように新しい initrd を作成して統合してください: |
||
+ | '''initrd=\''cpu_manufacturer''-ucode.img''' initrd=\initramfs-linux.img |
||
− | {{bc|1= |
||
+ | |||
− | cat /boot/''cpu_manufacturer''-ucode.img /boot/initramfs-linux.img > my_new_initrd |
||
+ | ==== rEFInd ==== |
||
− | objcopy ... --add-section .initrd=my_new_initrd |
||
− | }} |
||
+ | {{ic|/boot/refind_linux.conf}} のブートオプションを編集し、{{ic|1=initrd=boot\''cpu_manufacturer''-ucode.img}} を最初の initramfs として追加してください( {{ic|/boot}} が別のパーティションに存在する場合は {{ic|1=initrd=''cpu_manufacturer''-ucode.img}})。例えば: |
||
− | === rEFInd === |
||
+ | "Boot using default options" "root=PARTUUID=''XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'' rw add_efi_memmap '''initrd=boot\''cpu_manufacturer''-ucode.img''' initrd=boot\initramfs-%v.img" |
||
− | 次のように {{ic|/boot/refind_linux.conf}} のブートオプションを編集します: |
||
+ | {{Tip|以前に {{ic|initrd}} カーネルパラメータを指定しなかったユーザは、複数の {{ic|initrd}} パラメータを渡すために [[rEFInd#設定]] で説明されている手順に従う必要があります。}} |
||
− | "Boot using default options" "root=PARTUUID=''XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'' rw add_efi_memmap '''initrd=/boot/''cpu_manufacturer''-ucode.img''' initrd=/boot/initramfs-%v.img" |
||
[[rEFInd#手動でブートエントリを記述|手動]]で {{ic|''esp''/EFI/refind/refind.conf}} にカーネルを定義している場合はメインの部分ではなく options 行に {{ic|/boot/''cpu_manufacturer''-ucode.img}} ({{ic|/boot}} パーティションを分けている場合は {{ic|/''cpu_manufacturer''-ucode.img}}) を追加してください。例: |
[[rEFInd#手動でブートエントリを記述|手動]]で {{ic|''esp''/EFI/refind/refind.conf}} にカーネルを定義している場合はメインの部分ではなく options 行に {{ic|/boot/''cpu_manufacturer''-ucode.img}} ({{ic|/boot}} パーティションを分けている場合は {{ic|/''cpu_manufacturer''-ucode.img}}) を追加してください。例: |
||
− | + | options "root=PARTUUID=''XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'' rw add_efi_memmap '''initrd=boot\''cpu_manufacturer''-ucode.img'''" |
|
− | === Syslinux === |
+ | ==== Syslinux ==== |
− | {{Note|initrd ファイルの {{ic|''cpu_manufacturer''-ucode.img}} と {{ic|initramfs-linux}} の間に空白は挟まないで下さい。以下の記述そのままに編集 |
+ | {{Note|initrd ファイルの {{ic|''cpu_manufacturer''-ucode.img}} と {{ic|initramfs-linux}} の間に空白は挟まないで下さい。{{ic|INITRD}} の行は以下の記述そのままに編集しなければなりません。}} |
{{ic|/boot/syslinux/syslinux.cfg}} で複数の initrd をカンマで区切って指定できます: |
{{ic|/boot/syslinux/syslinux.cfg}} で複数の initrd をカンマで区切って指定できます: |
||
100行目: | 108行目: | ||
... |
... |
||
− | === LILO === |
+ | ==== LILO ==== |
[[LILO]] などの旧式のブートローダーは複数の initrd イメージをサポートしていません。そのような場合 {{ic|''cpu_manufacturer''-ucode.img}} と {{ic|initramfs-linux.img}} をひとつのイメージにまとめる必要があります。 |
[[LILO]] などの旧式のブートローダーは複数の initrd イメージをサポートしていません。そのような場合 {{ic|''cpu_manufacturer''-ucode.img}} と {{ic|initramfs-linux.img}} をひとつのイメージにまとめる必要があります。 |
||
109行目: | 117行目: | ||
ふたつのイメージを {{ic|initramfs-merged.img}} という名前のイメージにマージするには、以下のコマンドを使用: |
ふたつのイメージを {{ic|initramfs-merged.img}} という名前のイメージにマージするには、以下のコマンドを使用: |
||
+ | |||
− | |||
# cat /boot/''cpu_manufacturer''-ucode.img /boot/initramfs-linux.img > /boot/initramfs-merged.img |
# cat /boot/''cpu_manufacturer''-ucode.img /boot/initramfs-linux.img > /boot/initramfs-merged.img |
||
119行目: | 127行目: | ||
root で {{ic|lilo}} を実行してください: |
root で {{ic|lilo}} を実行してください: |
||
+ | |||
− | |||
# lilo |
# lilo |
||
− | == |
+ | == 遅延ロード == |
+ | {{Warning|1=マイクロコードの遅延ロードは危険であるとみなされています(Linux 5.19 で遅延ロードを行うとカーネルが汚染(taint)されます)。[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=9784edd73a08ea08d0ce5606e1f0f729df688c59]}} |
||
− | システムを起動した後にマイクロコードのアップデートをロードすることもできます。{{ic|/usr/lib/firmware/amd-ucode/}} と {{ic|/usr/lib/firmware/intel-ucode/}} のファイルを使用します。 |
||
+ | マイクロコードアップデートの遅延ロードはシステムの起動後に行われます。{{ic|/usr/lib/firmware/amd-ucode/}} と {{ic|/usr/lib/firmware/intel-ucode/}} 内のファイルが使用されます。Linux 5.19+ で遅延ロードを行うには、{{ic|1=CONFIG_MICROCODE_LATE_LOADING=y}} でカーネルをビルドする必要があります。 |
||
− | AMD プロセッサの場合、マイクロコードのアップデートファイルは {{Pkg|linux-firmware}} によって提供されます。 |
||
− | + | AMD プロセッサの場合、マイクロコードのアップデートファイルは {{Pkg|linux-firmware}} により提供されます。 |
|
+ | Intel プロセッサの場合、マイクロコードのアップデートファイルが含まれるパッケージはありません ({{Bug|59841}})。遅延ロードするには [https://github.com/intel/Intel-Linux-Processor-Microcode-Data-Files/releases Intel が提供しているアーカイブ]から手動で {{ic|intel-ucode/}} を抽出する必要があります。 |
||
− | === マイクロコードのアップデートを有効にする === |
||
+ | === マイクロコードの遅延アップデートを有効化 === |
||
− | 起動初期のロードとは異なり、起動後のマイクロコードのアップデートのロードは Arch Linux ではデフォルトで有効になっており {{ic|/usr/lib/tmpfiles.d/linux-firmware.conf}} を使用します。起動後に {{man|8|systemd-tmpfiles-setup.service}} によってファイルが読み込まれて CPU のマイクロコードが更新されます。 |
||
+ | 早期ロードとは異なり、マイクロコードアップデートの遅延ロードは Arch Linux ではデフォルトで有効になっており {{ic|/usr/lib/tmpfiles.d/linux-firmware.conf}} を使用します。起動後に {{man|8|systemd-tmpfiles-setup.service}} によってファイルが読み込まれて CPU のマイクロコードが更新されます。 |
||
− | 実行中のシステムで手動でマイクロコードをアップデートするには: |
||
+ | |||
+ | 実行中のシステムで手動でマイクロコードをアップデートするには(例: {{ic|/usr/lib/firmware/amd-ucode/}} か {{ic|/usr/lib/firmware/intel-ucode/}} 内のマイクロコードファイルをアップデートした後): |
||
# echo 1 > /sys/devices/system/cpu/microcode/reload |
# echo 1 > /sys/devices/system/cpu/microcode/reload |
||
− | こ |
+ | これにより、システムを再起動せずに新しいマイクロコードのアップデートを適用できます。 |
+ | === マイクロコードの遅延アップデートを無効化 === |
||
− | {{hc|/etc/pacman.d/hooks/microcode_reload.hook|2= |
||
− | [Trigger] |
||
− | Operation = Install |
||
− | Operation = Upgrade |
||
− | Operation = Remove |
||
− | Type = File |
||
− | Target = usr/lib/firmware/amd-ucode/* |
||
+ | AMD 環境では {{Pkg|amd-ucode}} がインストールされてなくても、{{ic|/usr/lib/firmware/amd-ucode/}} 内のファイルが {{Pkg|linux-firmware}} パッケージにより提供されるため、CPU のマイクロコードはアップデートされてしまいます ({{Bug|59840}})。 |
||
− | [Action] |
||
− | Description = Applying CPU microcode updates... |
||
− | When = PostTransaction |
||
− | Depends = sh |
||
− | Exec = /bin/sh -c 'echo 1 > /sys/devices/system/cpu/microcode/reload' |
||
− | }} |
||
− | + | [[仮想マシン]]と[[Wikipedia:Container (virtualization)|コンテナ]]では({{Bug|46591}})、CPU のマイクロコードをアップできません。なので、マイクロコードのアップデートを無効化したほうが良いでしょう。 |
|
− | + | マイクロコードの危険な遅延ロードを無効にしたい場合、{{Pkg|linux-firmware}} により提供される {{ic|/usr/lib/tmpfiles.d/linux-firmware.conf}} [[tmpfiles|tmpfile]] を上書きしてください。{{ic|/etc/tmpfiles.d/}} に同名のファイルを作成することで無効化できます: |
|
# ln -s /dev/null /etc/tmpfiles.d/linux-firmware.conf |
# ln -s /dev/null /etc/tmpfiles.d/linux-firmware.conf |
||
+ | |||
+ | == initramfs に埋め込まれたマイクロコード == |
||
+ | |||
+ | 使用中の initramfs ジェネレータがすでに [https://docs.kernel.org/x86/microcode.html#early-load-microcode マイクロコード cpio を initramfs に付加しているのであれば]、[[#早期ロード]]と[[#遅延ロード]]は必要ありません。例えば、[[dracut]] はデフォルトでこれを行います。{{man|5|dracut.conf|DESCRIPTION}} を見てください。 |
||
+ | |||
+ | {{Expansion|What about mkinitcpio and Booster?}} |
||
+ | {{Accuracy|[[#カスタムカーネルでマイクロコードの早期ロードを有効化]] の場合は?}} |
||
+ | {{Expansion|The [[#top|introduction]] does not cover this section.}} |
||
== 起動時にマイクロコードのアップデートがされたか確認する == |
== 起動時にマイクロコードのアップデートがされたか確認する == |
||
− | マイクロコードがアップデートされたかどうか確認するには |
+ | マイクロコードがアップデートされたかどうか確認するには ''journalctl'' でカーネルメッセージを確認してください: |
− | $ dmesg | grep microcode |
||
+ | # journalctl -k --grep=microcode |
||
− | Intel が載っているシステムでは、マイクロコードのアップデートがされていると以下のような表示がされます: |
||
+ | 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 |
||
− | + | microcode: microcode updated early to revision 0xde, date = 2020-05-18 |
|
− | + | microcode: sig=0x806ec, pf=0x80, revision=0xde |
|
− | + | microcode: Microcode Update Driver: v2.2. |
|
− | [ 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. |
||
{{Note|表示される日付は {{pkg|intel-ucode}} パッケージのバージョンとは対応しません。Intel がマイクロコードのアップデートを行った最後の日付が表示されます。}} |
{{Note|表示される日付は {{pkg|intel-ucode}} パッケージのバージョンとは対応しません。Intel がマイクロコードのアップデートを行った最後の日付が表示されます。}} |
||
186行目: | 184行目: | ||
最新のハードウェアの場合、CPU のマイクロコードアップデートが存在しないという可能性も考えられます。そのときは、以下のような出力がなされます: |
最新のハードウェアの場合、CPU のマイクロコードアップデートが存在しないという可能性も考えられます。そのときは、以下のような出力がなされます: |
||
− | + | microcode: sig=0x806ec, pf=0x80, revision=0xde |
|
− | + | microcode: Microcode Update Driver: v2.2. |
|
− | [ 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 環境で |
+ | AMD 環境でマイクロコードを早期ロードしている場合、以下のように出力されます: |
− | + | microcode: microcode updated early to new patch_level=0x0700010f |
|
− | + | microcode: CPU0: patch_level=0x0700010f |
|
− | + | microcode: CPU1: patch_level=0x0700010f |
|
− | + | microcode: CPU2: patch_level=0x0700010f |
|
− | + | microcode: CPU3: patch_level=0x0700010f |
|
− | + | microcode: Microcode Update Driver: v2.2. |
|
AMD 環境で起動後にマイクロコードをアップデートしている場合、古いマイクロコードのバージョンが表示されてからマイクロコードがリロードされ、新しいマイクロコードのバージョンが表示されます。例: |
AMD 環境で起動後にマイクロコードをアップデートしている場合、古いマイクロコードのバージョンが表示されてからマイクロコードがリロードされ、新しいマイクロコードのバージョンが表示されます。例: |
||
− | + | microcode: CPU0: patch_level=0x0700010b |
|
− | + | microcode: CPU1: patch_level=0x0700010b |
|
− | + | microcode: CPU2: patch_level=0x0700010b |
|
− | + | microcode: CPU3: patch_level=0x0700010b |
|
− | + | microcode: Microcode Update Driver: v2.2. |
|
− | + | microcode: CPU2: new patch_level=0x0700010f |
|
− | + | microcode: CPU0: new patch_level=0x0700010f |
|
− | + | microcode: CPU1: new patch_level=0x0700010f |
|
− | + | microcode: CPU3: new patch_level=0x0700010f |
|
− | + | x86/CPU: CPU features have changed after loading microcode, but might not take effect. |
|
== マイクロコードのアップデートができる CPU == |
== マイクロコードのアップデートができる CPU == |
||
− | 特定のモデルがサポートされているのかどうかは以下のリンクから Intel や AMD のサイトで確認することができます: |
+ | 特定のモデルがサポートされているのかどうかは以下のリンクから Intel のサイトや AMD の Gentoo Wiki サイトで確認することができます: |
+ | * [[Gentoo:AMD microcode#Specific firmware only]]。 |
||
− | * [http://www.amd64.org/microcode.html AMD の Operating System Research Center]。 |
||
* [https://downloadcenter.intel.com/SearchResult.aspx?lang=eng&keyword=processor%20microcode%20data%20file Intel のダウンロードセンター]。 |
* [https://downloadcenter.intel.com/SearchResult.aspx?lang=eng&keyword=processor%20microcode%20data%20file Intel のダウンロードセンター]。 |
||
=== マイクロコードのアップデートが必要かどうか確認する === |
=== マイクロコードのアップデートが必要かどうか確認する === |
||
− | {{Pkg|iucode-tool}} を使って、使用している |
+ | {{Pkg|iucode-tool}} を使って、使用している CPU のマイクロコードイメージが {{ic|intel-ucode.img}} に含まれているかどうか確認できます。 |
− | + | # {{Pkg|intel-ucode}} を[[インストール]] (アップデートがあるかどうか確認するのに initrd の変更は必要ありません) |
|
− | + | # {{Pkg|iucode-tool}} を[[インストール]] |
|
− | + | # {{ic|cpuid}} カーネルモジュールをロード: {{bc|# modprobe cpuid}} |
|
− | + | # マイクロコードイメージを展開して cpuid で検索:<br/>{{bc|# bsdtar -Oxf /boot/intel-ucode.img {{!}} iucode_tool -tb -lS -}} |
|
− | + | # アップデートが存在する場合は、''selected microcodes'' の下に表示されます。 |
|
− | + | # メーカーの BIOS にマイクロコードが既に含まれていてロードされたことが ''dmesg'' に表示されていない可能性もあります。{{ic|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 |
||
== 参照 == |
== 参照 == |
||
− | * [https://flossexperiences.wordpress.com/2013/11/17/updating-microcodes/ Updating microcodes] |
+ | * [https://flossexperiences.wordpress.com/2013/11/17/updating-microcodes/ Updating microcodes – Experiences in the community] |
− | * [http://inertiawar.com/microcode/ Intel |
+ | * [http://inertiawar.com/microcode/ Intel マイクロコードアップデートのノート – Ben Hawkes] |
− | * [https:// |
+ | * [https://docs.kernel.org/x86/microcode.html カーネルマイクロコードローダ – カーネルドキュメント] |
− | * [ |
+ | * [https://www.anandtech.com/show/8376/intel-disables-tsx-instructions-erratum-found-in-haswell-haswelleep-broadwelly Haswell/Broadwell で見つかったエラッタ – AnandTech] |
* [https://gitlab.com/iucode-tool/iucode-tool iucode-tool GitLab プロジェクト] |
* [https://gitlab.com/iucode-tool/iucode-tool iucode-tool GitLab プロジェクト] |
2022年7月12日 (火) 06:18時点における版
プロセッサの製造者はプロセッサマイクロコードに安定性とセキュリティのアップデートをリリースしています。そのようなアップデートには、システムの安定性に深く関わるバグフィックスが含まれています。これがないと、追跡困難な疑わしいクラッシュや予期しないシステム停止を引き起こす場合があります。
AMD や Intel CPU を持つすべてのユーザは、システムの安定性を確保するためにマイクロコードのアップデートをインストールすべきです。
通常、マイクロコードのアップデートはマザーボードのファームウェアに同梱されており、ファームウェアの初期化中に適用されます。しかし、OEM はファームウェアのアップデートをタイムリーにリリースしないかもしれない上、古いシステムでは新しいファームウェアアップデートは全くリリースされないので、起動中に CPU マイクロコードアップデートを適用する機能が Linux カーネルに追加されました。Linux マイクロコードローダは3つの方法をサポートします:
- 早期ロード は、起動中の非常に早い段階(initramfs ステージよりも前)でマイクロコードをアップデートします。なので、これは推奨される方法です。Intel の Haswell や Broadwell プロセッサファミリのように CPU に深刻なハードウェアバグが存在する場合、これは必須です。
- 遅延ロード(危険) は、起動後にマイクロコードをアップデートします。CPU がバグのある命令セットの使用をすでに試みたかもしれないので、これでは遅すぎる可能性があります。「早期ロード」をすでに使用している場合でも、「遅延ロード」を使用して再起動せずに新しいマイクロコードのアップデートを適用できます。
- 組み込みマイクロコード はカーネルにコンパイルされます。早期ローダ(early loader)により適用されます。
目次
早期ロード
インストール
プロセッサに応じて以下のパッケージをインストールしてください:
- amd-ucode AMD プロセッサ向け
- intel-ucode Intel プロセッサ向け
マイクロコードはブートローダーによって読み込まれなければなりません。初期ブート設定はユーザによって様々なので、マイクロコードのアップデートは Arch のデフォルト設定では自動的にトリガーされない場合があります。この点について AUR カーネルの多くは Arch の公式カーネルと同じようになっています。
アップデートを有効にするには、/boot/amd-ucode.img
または /boot/intel-ucode.img
をブートローダーの設定ファイルの 一番目の initrd として追加しなければなりません。これは、通常の initrd ファイルよりも前です。一般的なブートローダの場合における手順は以下を見てください。
以下のセクションでは cpu_manufacturer
の部分をあなたの CPU の製造業者名に置き換えてください、例: amd
か 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
GRUB
grub-mkconfig はマイクロコードのアップデートを自動的に検出し、GRUB を適切に設定します。マイクロコードのインストール後に以下を実行して GRUB 設定ファイルを再生成し、マイクロコードアップデートのロードを有効化してください:
# grub-mkconfig -o /boot/grub/grub.cfg
あるいは、GRUB 設定ファイルを手動で管理しているユーザは、以下のように /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 システムパーティション (ESP) に存在していなければなりません。amd-ucode または intel-ucode を更新したときはマイクロコードが更新されるように /boot
に ESP をマウントしてください。もしくは、マイクロコードパッケージのアップデートがあるたびに ESP に /boot/cpu_manufacturer-ucode.img
をコピーしてください。
Unified カーネルイメージ
Unified カーネルイメージ#手動で を見てください。
EFISTUB
2つの initrd=
オプションを末尾に追加してください:
initrd=\cpu_manufacturer-ucode.img initrd=\initramfs-linux.img
rEFInd
/boot/refind_linux.conf
のブートオプションを編集し、initrd=boot\cpu_manufacturer-ucode.img
を最初の initramfs として追加してください( /boot
が別のパーティションに存在する場合は initrd=cpu_manufacturer-ucode.img
)。例えば:
"Boot using default options" "root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rw add_efi_memmap initrd=boot\cpu_manufacturer-ucode.img initrd=boot\initramfs-%v.img"
手動で esp/EFI/refind/refind.conf
にカーネルを定義している場合はメインの部分ではなく options 行に /boot/cpu_manufacturer-ucode.img
(/boot
パーティションを分けている場合は /cpu_manufacturer-ucode.img
) を追加してください。例:
options "root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX 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/
内のファイルが使用されます。Linux 5.19+ で遅延ロードを行うには、CONFIG_MICROCODE_LATE_LOADING=y
でカーネルをビルドする必要があります。
AMD プロセッサの場合、マイクロコードのアップデートファイルは linux-firmware により提供されます。
Intel プロセッサの場合、マイクロコードのアップデートファイルが含まれるパッケージはありません (FS#59841)。遅延ロードするには Intel が提供しているアーカイブから手動で intel-ucode/
を抽出する必要があります。
マイクロコードの遅延アップデートを有効化
早期ロードとは異なり、マイクロコードアップデートの遅延ロードは Arch Linux ではデフォルトで有効になっており /usr/lib/tmpfiles.d/linux-firmware.conf
を使用します。起動後に systemd-tmpfiles-setup.service(8) によってファイルが読み込まれて CPU のマイクロコードが更新されます。
実行中のシステムで手動でマイクロコードをアップデートするには(例: /usr/lib/firmware/amd-ucode/
か /usr/lib/firmware/intel-ucode/
内のマイクロコードファイルをアップデートした後):
# echo 1 > /sys/devices/system/cpu/microcode/reload
これにより、システムを再起動せずに新しいマイクロコードのアップデートを適用できます。
マイクロコードの遅延アップデートを無効化
AMD 環境では amd-ucode がインストールされてなくても、/usr/lib/firmware/amd-ucode/
内のファイルが linux-firmware パッケージにより提供されるため、CPU のマイクロコードはアップデートされてしまいます (FS#59840)。
仮想マシンとコンテナでは(FS#46591)、CPU のマイクロコードをアップできません。なので、マイクロコードのアップデートを無効化したほうが良いでしょう。
マイクロコードの危険な遅延ロードを無効にしたい場合、linux-firmware により提供される /usr/lib/tmpfiles.d/linux-firmware.conf
tmpfile を上書きしてください。/etc/tmpfiles.d/
に同名のファイルを作成することで無効化できます:
# ln -s /dev/null /etc/tmpfiles.d/linux-firmware.conf
initramfs に埋め込まれたマイクロコード
使用中の initramfs ジェネレータがすでに マイクロコード cpio を initramfs に付加しているのであれば、#早期ロードと#遅延ロードは必要ありません。例えば、dracut はデフォルトでこれを行います。dracut.conf(5) § DESCRIPTION を見てください。
起動時にマイクロコードのアップデートがされたか確認する
マイクロコードがアップデートされたかどうか確認するには journalctl でカーネルメッセージを確認してください:
# journalctl -k --grep=microcode
Intel が載っているシステムでは、起動時に以下のような表示がされます(以下ではマイクロコードが非常に早い段階でアップデートされていることを示しています):
microcode: microcode updated early to revision 0xde, date = 2020-05-18 microcode: sig=0x806ec, pf=0x80, revision=0xde microcode: Microcode Update Driver: v2.2.
最新のハードウェアの場合、CPU のマイクロコードアップデートが存在しないという可能性も考えられます。そのときは、以下のような出力がなされます:
microcode: sig=0x806ec, pf=0x80, revision=0xde microcode: Microcode Update Driver: v2.2.
AMD 環境でマイクロコードを早期ロードしている場合、以下のように出力されます:
microcode: microcode updated early to new patch_level=0x0700010f microcode: CPU0: patch_level=0x0700010f microcode: CPU1: patch_level=0x0700010f microcode: CPU2: patch_level=0x0700010f microcode: CPU3: patch_level=0x0700010f microcode: Microcode Update Driver: v2.2.
AMD 環境で起動後にマイクロコードをアップデートしている場合、古いマイクロコードのバージョンが表示されてからマイクロコードがリロードされ、新しいマイクロコードのバージョンが表示されます。例:
microcode: CPU0: patch_level=0x0700010b microcode: CPU1: patch_level=0x0700010b microcode: CPU2: patch_level=0x0700010b microcode: CPU3: patch_level=0x0700010b microcode: Microcode Update Driver: v2.2. microcode: CPU2: new patch_level=0x0700010f microcode: CPU0: new patch_level=0x0700010f microcode: CPU1: new patch_level=0x0700010f microcode: CPU3: new patch_level=0x0700010f x86/CPU: CPU features have changed after loading microcode, but might not take effect.
マイクロコードのアップデートができる CPU
特定のモデルがサポートされているのかどうかは以下のリンクから Intel のサイトや AMD の Gentoo Wiki サイトで確認することができます:
マイクロコードのアップデートが必要かどうか確認する
iucode-tool を使って、使用している CPU のマイクロコードイメージが intel-ucode.img
に含まれているかどうか確認できます。
- intel-ucode をインストール (アップデートがあるかどうか確認するのに initrd の変更は必要ありません)
- iucode-tool をインストール
cpuid
カーネルモジュールをロード:# modprobe cpuid
- マイクロコードイメージを展開して cpuid で検索:
# bsdtar -Oxf /boot/intel-ucode.img | iucode_tool -tb -lS -
- アップデートが存在する場合は、selected microcodes の下に表示されます。
- メーカーの BIOS にマイクロコードが既に含まれていてロードされたことが dmesg に表示されていない可能性もあります。
grep microcode /proc/cpuinfo
を実行して現在のマイクロコードを比較してください。