2. CXL 内存设备枚举与区域查看
任务说明
使用 Linux 内核自带的 cxl 工具(cxl-cli)枚举系统中的 CXL 内存设备,并查看每个设备的内存区域(region)、容量与 NUMA 节点归属。本案例聚焦“枚举 + 查看”这一只读操作,不涉及创建/销毁 region。
环境与依赖
- 内核:启用 CXL 子系统(
CONFIG_CXL_BUS、CONFIG_CXL_MEM、CONFIG_CXL_REGION),建议 6.x 及以上。 - 工具:
cxl-cli(提供cxl命令),以及jq用于解析 JSON 输出。 - 权限:读取 sysfs 通常需要 root,建议
sudo执行。
# Debian/Ubuntu
sudo apt install -y cxl-cli jq
# RHEL/Fedora
sudo dnf install -y cxl-cli jq
# 确认内核已加载 cxl 相关模块
lsmod | grep -E 'cxl|nd_'
核心命令与数据流
cxl list 从 /sys/bus/cxl/devices 读取设备拓扑,按 memdev → region → decoder 层级输出。默认输出人类可读文本,加 -M 输出机器可读 JSON,便于脚本提取容量与 NUMA 节点。
完整实现:枚举并汇总设备信息
下面脚本调用 cxl list -M 获取 JSON,用 jq 提取每个 memdev 的容量、NUMA 节点及其 region 信息,输出一张汇总表。若系统无 CXL 设备,脚本会明确提示而非报错。
#!/usr/bin/env bash
# cxl_enum.sh —— 枚举 CXL 内存设备并查看区域/容量/NUMA 归属
set -euo pipefail
if ! command -v cxl &>/dev/null; then
echo "错误:未找到 cxl 命令,请安装 cxl-cli" >&2
exit 1
fi
# -M 输出机器可读 JSON;-m 显示 memdev;-R 显示 region
json=$(cxl list -M -m -R 2>/dev/null || true)
if [[ -z "$json" || "$json" == "[]" ]]; then
echo "未检测到 CXL 内存设备(memdev 列表为空)。"
exit 0
fi
echo "== CXL 内存设备枚举 =="
echo "$json" | jq -r '
.[] | select(.memdev != null) |
"memdev: \(.memdev)\n" +
" 容量(字节): \(.size // "N/A")\n" +
" RAM容量(字节): \(.ram_size // "N/A")\n" +
" NUMA节点: \(.numa_node // "N/A")\n" +
(if (.region // null) != null then
" 区域: " + ([.region[] | "\(.region) size=\(.size // "N/A") numa=\(.numa_node // "N/A")"] | join("; "))
else " 区域: 无" end) + "\n"
'
echo "== 原始 JSON(供进一步解析)=="
echo "$json" | jq .
运行与验证
chmod +x cxl_enum.sh
sudo ./cxl_enum.sh
判定通过条件:
- 脚本正常退出(退出码 0),无
command not found或 jq 解析错误。 - 若系统存在 CXL 设备,输出中每个 memdev 均列出容量、NUMA 节点,并显示其 region 的 size 与 numa_node。
- 若系统无 CXL 设备,输出“未检测到 CXL 内存设备”,同样视为脚本行为正确。
可交叉核对:ls /sys/bus/cxl/devices/ 应能看到 memdev* 与 region* 条目,与脚本枚举结果一致。
常见问题
cxl list报 “no cxl devices”:内核未启用 CXL 或平台无 CXL 硬件,属正常情况。- 字段为
null:该 memdev 尚未创建 region,或未绑定 NUMA 节点,脚本以 “N/A”/“无” 呈现。 - 权限不足:读取 sysfs 需 root,务必用
sudo运行。