dmidecode -t memory是唯一能直接读取bios/uefi中spd数据的命令,最准确;其他工具如lshw、/proc/meminfo等均无法提供真实型号与标称频率。

dmidecode -t memory 是唯一能直接读取 BIOS/UEFI 固件中 SPD 数据的命令,结果最准;其他工具如 lshw、/proc/meminfo 或 free 均不提供真实型号与标称频率。
为什么 dmidecode -t memory 经常看不到 Speed: 字段
不是命令失效,是固件没填全或你没筛对块。常见原因有三个:
• BIOS/UEFI 未将 SPD 数据写入 SMBIOS 表(尤其在笔记本、虚拟机或老旧主板上)
• 插槽空置但 dmidecode 仍列出该条目,Size: 显示 No Module Installed,连带 Speed: 和 Part Number: 全为空
• Speed: 出现在子 Handle 块里(比如 Handle 0x001B),而你只 grep 主块(Handle 0x001A),结果漏掉
先确认有没有真插内存:sudo dmidecode -t memory | grep -A2 -B2 "Size:.*[MG]B"。只要看到类似 Size: 16 GB 的输出,就说明对应插槽有物理内存,再查它的 Speed 才有意义。
如何避免 grep Speed: 拼错字段
grep 会跨块混排——把 A 槽的 Part Number: 和 B 槽的 Speed: 拼在一起,这是最常踩的坑。
必须按每个内存设备的 Handle 边界切分处理:
• sudo dmidecode -t memory | awk '/^Handle / {if (size && speed && part) print slot, size, part, speed; slot=""; size=""; speed=""; part=""} /Slot:/ {slot=$0} /Size: [0-9]+ [MG]B$/ {size=$0} /Part Number:/ {part=$0} /Speed:/ {speed=$0} END {if (size && speed && part) print slot, size, part, speed}' | grep -v "No Module Installed"
它做了三件事:
• 自动识别每个 Handle 起始,确保 Slot:、Size:、Part Number:、Speed: 来自同一内存条
• 只匹配以 Size: N GB 结尾的行,排除空槽干扰
• Speed: 单位可能是 MT/s(DDR4/DDR5 标称值)、ns(越小越快)或 MHz,需结合 Type: 判断
lshw 和 /sys/firmware/dmi/tables/ 怎么补位
当 dmidecode 报 Permission denied 或输出全是 Not Specified,可切换备用方案:
• lshw -class memory 输出结构清晰,适合快速看插槽和 clock: 值,但注意它显示的是总线时钟(如 clock: 1600MHz),实际等效频率是 DDR4-3200 —— 别直接当成标称值抄
• sudo strings /sys/firmware/dmi/tables/DMI | grep -A 1 -B 1 "Part Number\|Manufacturer" 不依赖 dmidecode,但输出是原始字符串流,无结构,容易漏匹配或误匹配(比如 “Samsung” 出现在其他字段里)
• 部分国产 BIOS 或老旧主板禁用了 DMI sysfs 导出,此时目录为空或报错 No such file or directory
别信 /proc/meminfo 查型号和频率
/proc/meminfo 只提供内核视角的内存统计(如 MemTotal、MemAvailable),完全不包含物理内存条的硬件信息。
有人试过 grep "model" 或 "type",结果当然什么都没有。free -h、vmstat、lscpu | grep -i memory 同样无效:前者只反映使用状态,后者混淆 CPU 内存控制器支持上限(如 “Memory controller: 3200 MHz”),不代表插着的内存条实际运行频率。
dmidecode 的 Speed: 字段是 BIOS 报告的配置值,最接近实际,但要注意它反映的是标称能力,不是实时运行频率——后者得看 Configured Memory Speed:(若存在)。











