Linux 更新 CPU microcode

Linux 更新 CPU microcode

Kernel 配置

當前Linux kernel 中microcode 模塊已提供Intel/AMD CPU更新接口, 配置以下參數啓用此模塊:

CONFIG_MICROCODE=y
CONFIG_MICROCODE_INTEL=y
CONFIG_MICROCODE_AMD=y
CONFIG_MICROCODE_OLD_INTERFACE=y
CONFIG_MICROCODE_INTEL_LIB=y

此模塊提供三種不同的方式接口:
1. /dev/cpu/microcode,通過第三方工具(如microcode_ctl)將microcode中對應當前系統cpu的ucode寫入即可更新 ; kernel 3.9以後版本需開啓 kernel配置參數保持兼容;

CONFIG_MICROCODE_OLD_INTERFACE=y
  1. sysfs接口,echo 1 > /sys/devices/system/cpu/microcode/reload內核將自動查找/lib/firmware/intel-ucode/目錄下基於當前CPU(格式爲:family-model-stepping)更新文件並執行更新操作;
  2. EARLY方式,kernel在初始化後,加載混合了microcodecpio與initrdramfs的initrd自動完成更新操作; 需kernel3.9之後版本並開啓配置參數:
CONFIG_MICROCODE_INTEL_EARLY=y
CONFIG_MICROCODE_AMD_EARLY=y
CONFIG_MICROCODE_EARLY=y

microcode更新

確認當前待更新microcode CPU 版本及步進等信息:

cat /proc/cpuinfo  |grep "model\|microcode\|stepping\|family" |head -n 5
cpu family      : 6
model           : 45
model name      : Intel(R) Xeon(R) CPU E5-2620 0 @ 2.00GHz
stepping        : 7
microcode       : 0x70a

可知當前CPU ucode 文件爲* 06-2d-07*

下載CPU microcode
AMD’s Operating System Research Center.
Intel’s download center.
解壓爲一個單一文件: microcode.dat

下載[microcode_ctl] (https://fedorahosted.org/microcode_ctl/)

方法一

使用 microcode_ctl 1.7版本中microcode_ctl 直接更新即可:

microcode_ctl -u microcode.dat

方法二

使用 microcode_ctl v2.x intel-microcode2ucode轉換工具.

cp microcode.dat /lib/firmware/
cd /lib/fimware
# 解碼 microcode.dat 並在當前目錄下生成基於`intel-ucode`目錄的CPU更新文件
intel-microcode2ucode microcode.dat 
# 通知內核自動更新
echo 1 > /sys/devices/system/cpu/microcode/reload 

方法三

已知當前CPU更新文件爲06-2d-07, 創建混合initrd:

mkdir initrd
cd initrd
mkdir -p kernel/x86/microcode
# Intel CPU文件名爲 GenuineIntel.bin; AMD CPU 文件名爲 AuthenticAMD.bin
cp /lib/firmware/intel-ucode/06-2d-07 kernel/x86/microcode/GenuineIntel.bin
find . | cpio -o -H newc >../ucode.cpio
cd ..
cat ucode.cpio /boot/initrd.img > initrd-ucode.img

修改grub配置參數,重啓即可完成更新.

initrd initrd-ucode.img

更新完成

cat /proc/cpuinfo  |grep "model\|microcode\|stepping\|family" |head -n 5
cpu family      : 6
model           : 45
model name      : Intel(R) Xeon(R) CPU E5-2620 0 @ 2.00GHz
stepping        : 7
microcode       : 0x710
......

RHEL/CentOS 7 在系統安裝時會自動更新當前CPU microcode, 用的是方式2&方式3共存方式, 所有CPU microcode都包含在microcode_ctl中:

cat /usr/lib/systemd/system/microcode.service
[Unit]
Description=Load CPU microcode update
After=basic.target
ConditionVirtualization=false

[Service]
Type=oneshot
RemainAfterExit=no
ExecStart=/usr/bin/bash -c "echo 1 > /sys/devices/system/cpu/microcode/reload"

[Install]
WantedBy=basic.target
cpio -t < initramfs-3.10.0-327.el7.x86_64.img
.
kernel
kernel/x86
kernel/x86/microcode
kernel/x86/microcode/GenuineIntel.bin
early_cpio
36 blocks

其他Linux發行版未測試,相信應該也是一樣.

參考

https://www.kernel.org/doc/Documentation/x86/early-microcode.txt
https://fedorahosted.org/microcode_ctl/
https://downloadcenter.intel.com/download/26400/Linux-Processor-Microcode-Data-File?v=t
https://fitzcarraldoblog.wordpress.com/2014/11/06/updating-intel-cpu-microcode-from-gentoo-linux/
http://www.timelordz.com/wiki/Microcode
http://manpages.ubuntu.com/manpages/trusty/man8/iucode_tool.8.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章