最准的型号和频率信息只能从BIOS/UEFI固件读取,dmidecode -t memory是唯一能直接获取原始SPD数据的命令;常见Speed字段缺失主因是固件未填全SPD、空插槽干扰或跨Handle错配,需用awk按Handle分组提取并过滤空槽。

最准的型号和频率信息只能从 BIOS/UEFI 固件里读,dmidecode -t memory 是唯一能直接拿到原始 SPD 数据的命令;其他工具如 lshw 或 /proc/meminfo 要么缺失字段,要么压根不包含硬件型号。
为什么 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。
用 awk 按 Handle 分组提取,避免跨插槽错配
单靠 grep Speed: 容易把 A 槽的 Part Number: 和 B 槽的 Speed: 拼在一起——这是最常踩的坑。必须按内存设备块(即每个 Handle 起始)切分处理:
推荐这条实操命令(2026 年主流发行版已验证):sudo dmidecode -t memory | awk '/^Handle / {if (size && speed && part) print slot, size, part, speed; slot=""; size=""; speed=""; part=""} /Slot:/ {slot=<p>推荐这条实操命令(2026 年主流发行版已验证):<br><code>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"
推荐这条实操命令(2026 年主流发行版已验证):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"
推荐这条实操命令(2026 年主流发行版已验证):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"
推荐这条实操命令(2026 年主流发行版已验证):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: No Module Installed的空插槽,不污染结果 -
Speed:单位可能是MT/s(等效 MHz)、ns(越小越快)或MHz,需结合Type:判断:DDR4/DDR5 标称值基本都是MT/s
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 -A5 -B5 "Part Number\|Speed"不依赖dmidecode二进制,但输出无结构,容易误匹配(比如 “Samsung” 出现在非厂商字段里);且部分国产 BIOS 禁用该路径,ls /sys/firmware/dmi/tables/可能为空 -
decode-dimms(来自i2c-tools)能读 SPD EEPROM,给出 JEDEC 参数,但它需要 I²C 总线支持,部分服务器或 ARM 设备可能没启用
真正难搞的是那些 BIOS 没填 SPD 的板子——此时所有命令都返回 Unknown 或空,不是你操作问题,是硬件信息本身缺失。这种情况下,拆机看标签或查主板手册才是最终解法。



















