AMD 마이크로코드가 업데이트되지 않았습니다.

AMD 마이크로코드가 업데이트되지 않았습니다.

저는 최근 AMD Ryzen 7 1700X에 Gentoo Linux를 설치했습니다. 지금 난 직면해 있어재컴파일 로드 중 분할 오류그리고유휴 상태에서 무작위로 다시 시작.

첫 번째 단계로 현재 마이크로코드 버전을 확인했습니다.

grep -m 1 microcode /proc/cpuinfo
microcode       : 0x8001126

그러나 따르면이 테이블최신 마이크로코드는 0x08001129여야 합니다. 따라서 CPU의 마이크로코드를 업데이트하는 것이 좋은 생각인 것 같습니다.

그래서 나는 나타 =sys-kernel/linux-firmware-20180730났습니다 /lib/firmware/amd-ucode/microcode_amd_fam17h.bin. 또한 커널에서 다음 옵션을 활성화했습니다.

CONFIG_MICROCODE=y
CONFIG_MICROCODE_AMD=y

재부팅한 후 마이크로코드를 수동으로 로드해 보았습니다(최신 마이크로코드 업데이트).

echo 1 > /sys/devices/system/cpu/microcode/reload

그러나 이렇게 하면 새 줄이 나타나지 않습니다 dmesg.

dmesg | grep microcode
[    0.465121] microcode: CPU0: patch_level=0x08001126
[    0.465514] microcode: CPU1: patch_level=0x08001126
[    0.465932] microcode: CPU2: patch_level=0x08001126
[    0.466394] microcode: CPU3: patch_level=0x08001126
[    0.466772] microcode: CPU4: patch_level=0x08001126
[    0.467159] microcode: CPU5: patch_level=0x08001126
[    0.467537] microcode: CPU6: patch_level=0x08001126
[    0.467908] microcode: CPU7: patch_level=0x08001126
[    0.468268] microcode: CPU8: patch_level=0x08001126
[    0.468653] microcode: CPU9: patch_level=0x08001126
[    0.468999] microcode: CPU10: patch_level=0x08001126
[    0.469409] microcode: CPU11: patch_level=0x08001126
[    0.469744] microcode: CPU12: patch_level=0x08001126
[    0.470136] microcode: CPU13: patch_level=0x08001126
[    0.470455] microcode: CPU14: patch_level=0x08001126
[    0.470757] microcode: CPU15: patch_level=0x08001126
[    0.471092] microcode: Microcode Update Driver: v2.2.

나는 비슷한 것을 기대했다 microcode: CPU0: new patch_level=0x08001129. 내가 여기서 무엇을 놓치고 있는 걸까요? 일부 커널 CONFIG_옵션? 일종의 디버깅 정보를 켤 수 있나요? 아니면 더 나은 방법은 제공되는 마이크로코드 버전을 어떻게 나열합니까 microcode_amd_fam17h.bin?

답변1

다음과 같이 시도해 볼 수 있습니다.

CONFIG_PREVENT_FIRMWARE_BUILD=y
CONFIG_FIRMWARE_MEMMAP=y
CONFIG_MICROCODE=y
# CONFIG_MICROCODE_INTEL is not set
CONFIG_MICROCODE_AMD=y
CONFIG_MICROCODE_OLD_INTERFACE=y
CONFIG_FW_LOADER=y
CONFIG_EXTRA_FIRMWARE="amd-ucode/microcode_amd_fam17h.bin"
CONFIG_EXTRA_FIRMWARE_DIR="/lib/firmware"
# CONFIG_FW_LOADER_USER_HELPER is not set

(여러 파일을 나열하려면 CONFIG_EXTRA_FIRMWARE공백으로 구분해야 하며 해당 경로는 상대 경로여야 합니다 CONFIG_EXTRA_FIRMWARE_DIR.)

그러나 이것은 작동하지 않을 수 있습니다(그래픽과 네트워크 펌웨어만 사용하는 경우에는 효과가 있었고 CPU 펌웨어로는 시도하지 않았습니다). 따라서 다른 접근 방식을 시도해 보십시오. CONFIG_EXTRA_FIRMWARE위의 값을 무시하십시오(즉, 설정하지 마십시오. 그러나 다른 값은 그럴 수도 있습니다). 여전히 필요하지만 확실하지 않음) 시도해보세요초기 마이크로코드 로딩CPU 마이크로코드 파일을 initramfs 파일에 추가하면 다음과 같이 보일 수 있습니다(젠투에서):

/etc/kernel/postinst.d/25-glue_cpu_microcode_to_kernel:

#!/bin/bash

bootdir='/bewt'
initramfsfname="initramfs"
initramfs="$( realpath -- "/${bootdir}/${initramfsfname}" )"
vmlinuz="/${bootdir}/kernel"

prepend_microcode () {
  echo "prepending CPU microcode to ${initramfs}"
  local destfirst="/tmp/initrd/"
  local destmc="${destfirst}/kernel/x86/microcode/"
#  mkdir -p "${destmc}"
    install -dm644 "${destmc}"

  #this will replace the symlink /bewt/initramfs (on gentoo) with the file!
  #but this makes genkernel fail as such: 
  #ln: failed to create symbolic link 'initramfs.old' -> '': No such file or directory
  #even though it doesn't touch the .old file!
  # so to fix this, we'll use realpath above!

  ( cp -f "/lib/firmware/amd-ucode/microcode_amd.bin" "${destmc}/AuthenticAMD.bin" && cd "${destfirst}" && find . | cpio -o -H newc > "../ucode.cpio" 2>/dev/null && cd .. && cat "ucode.cpio" "${initramfs}" > "/tmp/${initramfsfname}" && chmod a-rwx "/tmp/${initramfsfname}" && mv -f "/tmp/${initramfsfname}" "${initramfs}" )
    local ec=$?
    if [[ $ec -eq 0 ]]; then
        echo "success."
    else
        #TODO: make errors be red so it's more obvious
        echo "failed!"
    fi
    return $ec
}

prepend_microcode

그러나 genkernel(여전히? 3년이 지난 후에도) 파일이 무시될 가능성이 있습니다 /etc/kernel/postinst.d/(또는 2015년에만 발생하여 수정되었거나 다른 이유로 인해). 즉, 수동으로 파일을 실행해야 합니다 genkernel(커널을 컴파일하려면). ), 그 다음에는 스크립트의 모든 항목을 수동으로 실행합니다.전시하다/etc/kernel/postinst.d/, 그렇게 하면 다음 과 같습니다이것:

echo "!! Running genkernel..." time genkernel all --bootdir="/bewt" --install --symlink --no-splash --no-mountboot --makeopts="-j4 V=0" --no-keymap --lvm --no-mdadm --no-dmraid --no-zfs --no-multipath --no-iscsi --disklabel --luks --no-gpg --no-netboot --no-unionfs --no-firmware --no-integrated-initramfs --compress-initramfs --compress-initrd --compress-initramfs-type=best --loglevel=5 --color --no-mrproper --no-clean --no-postclear --oldconfig ec="$?" if test "$ec" -ne "0"; then echo "!! genkernel failed $ec" exit "$ec" fi echo "!! Done genkernel" list=( `find /etc/kernel/postinst.d -type f -executable | sort --general-numeric-sort` ) echo "!! Found executables: ${list[@]}" for i in ${list[@]}; do ec="-1" while test "0" -ne "$ec"; do echo "!! Executing: '$i'" time $i ec="$?" echo "!! Exit code: $ec" if test "$ec" -ne "0"; then echo "!! something went wrong, fix it then press Enter to retry executing '$i' or press C-c now." #exit $ec time read -p -s "!! Press Enter to re-execute that or C-c to cancel" fi done done

(참고: 위에 사용된 bootdir은 가 아니므 /bewt/boot최소한 이를 변경해야 할 수도 있습니다. 위 문자열 microcode_amd.bin도 사용자의 문자열로 바꿔야 합니다 microcode_amd_fam17h.bin. :)
That list=and forare not올바른 방법공백, 줄 바꿈 등이 없는 경우를 제외하고는 파일 이름을 처리합니다. 이는 분명히 위에서 가정한 것입니다.

.config이전에 로드된 CPU 펌웨어가 포함된 이전 4.1.7 커널을 보려면 다음을 참조하세요.이것.

관련 정보