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
で提供されるマイクロコードバージョンをリストするにはどうすればよいですか
あなたはこのようなものを試すことができます:
_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
_の値を無視します(つまり、don設定しないでください。ただし、他のものがまだ必要かどうかは不明ですが、代わりに early microcode loading を試してください。CPUマイクロコードファイルをinitramfsファイルの前に追加します。たとえば、次のようになります(Gentooの場合)。
_/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
を実行し(カーネルをコンパイルするため)、その後、すべてを手動でスクリプトで実行します present in _/etc/kernel/postinst.d/
_、そうすることは this :
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
_)
上記の_list=
_およびfor
は、ファイル名を処理するための 適切な方法 ではありません。ただし、上記で想定されているスペースや改行などがない限り、 。
CPUファームウェアの早期ロードを行った古い4.1.7カーネル_.config
_を確認したい場合は、 これ を参照してください。