
１，はじめに

当スクリプトは、CPU の microcode を initrd イメージに合体させ、
microcode の early load を実現させるための支援スクリプトです。
CPU の判別、CPUに適切な microcode file の選定、initrd イメージへの
結合を行なってくれます。

事前に、
https://www.kernel.org/doc/Documentation/x86/early-microcode.txt
を読んでいただくのを推奨します。

intel の microcode は、あらかじめ手作業で指定のディレクトリに
入れる必要があります。
AMD の microcode は linux-firmware package に含まれています。

AMD CPU 環境 ＆ x86_64 環境ですと、microcode が自動loadされますので
このスクリプトの操作自体が不要です。


２，実行前の現状の把握

cat /proc/cpuinfo |grep microcode
dmesg |grep microcode
sudo cat /var/log/messages|grep microcode

などを実行し、現状の microcode のバージョンを把握しておいてください。


３，microcode の準備

・intel CPU の場合

https://downloadcenter.intel.com/download/26925/Linux-Processor-Microcode-Data-File

より最新の microcode を download して適切なディレクトリに保存、
展開してください。
展開されて出来た intel-ucode ディレクトリを中身ごと /lib/firmware
ディレクトリにコピーしてください。
（/lib/firmware/intel-ucode/* が出来る）

・AMD CPU の場合

linux-firmware package を install してください。
多分、デフォルトで入っているハズです。


４，microcode file の確認

お使いの CPU に対応した microcode file があるか確認します。

combine_microcode -v -f

を実行してください。（一瞬で終わります）
動作例を以下に示します。（i3-7100T での動作例です）
----------------------------------------------
[iwamoto@chika tmp]$ ./combine_microcode -f -v 
Intel CPU is found.
Microcode file for your CPU is found.
/lib/firmware/intel-ucode/06-9e-09
----------------------------------------------

最後の行がお使いの CPU に対応した microcode file になります。


５，念の為バックアップ

/boot/initrd-(kernel-ver).img をバックアップしておいてください。

sudo cp /boot/initrd-4.4.78-2vl6.img /boot/initrd-4.4.78-2vl6.img_org
のような感じです。


６，microcode の initrd への結合

root 権限で、

combine_microcode -v kernel-ver

を実行してください。（一瞬で終わります）
動作例を以下に示します。（i3-7100T での動作例です）
----------------------------------------------
[iwamoto@chika tmp]$ sudo ./combine_microcode -v 4.4.78-2vl6
[sudo] iwamoto のパスワード:
Intel CPU is found.
Microcode file for your CPU is found.
Target initrd file  : /boot/initrd-4.4.78-2vl6.img
Microcode file      : /lib/firmware/intel-ucode/06-9e-09
Create ucode image and combine initrd-4.4.78-2vl6.img
Combined.
----------------------------------------------

実行後、initrd イメージ（上記例ですと /boot/initrd-4.4.78-2vl6.img）の
タイムスタンプが新しくなって、100kbほどサイズが大きくなっていることを
確認してください。
確認例を以下に示します。
----------------------------------------------
[iwamoto@chika x86_64]$ ls -l /boot/initrd-4.4.78*
-rw------- 1 root root 9206576 10月 28 22:33 /boot/initrd-4.4.78-2vl6.img
-rw------- 1 root root 9108272 10月 28 13:33 /boot/initrd-4.4.78-2vl6.img_org
----------------------------------------------


７．reboot＆確認

reboot します。
２，のステップを再度実行し、microcodeが新しくなっていることを
確認してください。


８，その他、参考

お約束の文面ですが、当スクリプトは無保証です。

当スクリプトの動作には bash, grep, sed, find, cpio などが必要です。
（ふつーに入っているものばかりです）

CPU/microcode 判定部は dracut のスクリプトを参考にしました。
microcode 合体部は、

https://www.kernel.org/doc/Documentation/x86/early-microcode.txt

の内容ほぼそのままです。

マザーボードの BIOSを最新にしてあった場合など、既に microcodeが
最新になっている場合があります。

