Linux更新CPU microcode

来源:互联网 发布:稻草人旅行 知乎 编辑:程序博客网 时间:2024/06/13 15:08

Linux 更新 CPU microcode

Kernel 配置

当前Linux kernel 中microcode 模块已提供Intel/AMD CPU更新接口, 配置以下参数启用此模块:

CONFIG_MICROCODE=yCONFIG_MICROCODE_INTEL=yCONFIG_MICROCODE_AMD=yCONFIG_MICROCODE_OLD_INTERFACE=yCONFIG_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
  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=yCONFIG_MICROCODE_AMD_EARLY=yCONFIG_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      : 6model           : 45model name      : Intel(R) Xeon(R) CPU E5-2620 0 @ 2.00GHzstepping        : 7microcode       : 0x70a
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

可知当前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/)

或者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 initrdcd initrdmkdir -p kernel/x86/microcode# Intel CPU文件名为 GenuineIntel.bin; AMD CPU 文件名为 AuthenticAMD.bincp /lib/firmware/intel-ucode/06-2d-07 kernel/x86/microcode/GenuineIntel.binfind . | cpio -o -H newc >../ucode.cpiocd ..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 5cpu family      : 6model           : 45model name      : Intel(R) Xeon(R) CPU E5-2620 0 @ 2.00GHzstepping        : 7microcode       : 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 updateAfter=basic.targetConditionVirtualization=false[Service]Type=oneshotRemainAfterExit=noExecStart=/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.kernelkernel/x86kernel/x86/microcodekernel/x86/microcode/GenuineIntel.binearly_cpio36 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