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
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
此模块提供三种不同的方式接口:
1. /dev/cpu/microcode
,通过第三方工具(如microcode_ctl)将microcode
中对应当前系统cpu的ucode
写入即可更新 ; kernel 3.9
以后版本需开启 kernel配置参数保持兼容;
CONFIG_MICROCODE_OLD_INTERFACE=y
- 1
- 1
- sysfs接口,echo 1 > /sys/devices/system/cpu/microcode/reload
内核将自动查找/lib/firmware/intel-ucode/
目录下基于当前CPU(格式为:family-model-stepping)更新文件并执行更新操作; - EARLY
方式,kernel在初始化后,加载混合了microcode
cpio与initrdramfs
的initrd自动完成更新操作; 需kernel3.9
之后版本并开启配置参数:
CONFIG_MICROCODE_INTEL_EARLY=y
CONFIG_MICROCODE_AMD_EARLY=y
CONFIG_MICROCODE_EARLY=y
- 1
- 2
- 3
- 1
- 2
- 3
microcode更新
确认当前待更新microcode
CPU 版本及步进等信息:
cat /proc/cpuinfo |grep "model\|microcode\|stepping\|family" |head -n 5
- 1
- 1
cpu family : 6
model : 45
model name : Intel(R) Xeon(R) CPU E5-2620 0 @ 2.00GHz
stepping : 7
microcode : 0x70a
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
可知当前CPU ucode 文件为* 06-2d-07
*
下载CPU microcode
AMD’s Operating System Research Center.
解压为一个单一文件: microcode.dat
下载[microcode_ctl] (https://fedorahosted.org/microcode_ctl/)
或者Intel官网
方法一
使用 microcode_ctl 1.7版本中microcode_ctl
直接更新即可:
microcode_ctl -u microcode.dat
- 1
- 1
方法二
使用 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
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
方法三
已知当前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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
修改grub配置参数,重启即可完成更新.
initrd initrd-ucode.img
- 1
- 1
更新完成
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
......
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
注
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
其他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