1. 环境准备
这里使用的系统是Ubuntu 20.04,在配置之前建议先安装如下工具 ipmctl ,ndctl , daxctl。这三个工具都可以使用apt install的方式安装(强烈建议)。如果实在无法联网,也可以使用源码安装的方式。
ipmctl源码下载链接 https://github.com/intel/ipmctl
ndctl 源码下载链接 https://github.com/intel/ndctl
2. 安装步骤
2.1 查看numa节点
在安装之前,可以使用numactl -H 命令查看系统中的numa节点信息。这里可以看到,目前系统中只有2个numa节点。
2.2 删除存在的namespace
系统中可能已经存在 namespace,可以使用 ndctl list 命令进行查看。为了避免出现问题,不过还是建议删除已有的 namespace 从新开始。
1 | // 这里的all是删除所有的namespace,也可以指定 namespaceX.Y 删除具体的某一个 |
2.2 新建namespace
使用下面的命令新建namespace,这里的mode选择dax
1 | sudo ndctl create-namespace --mode=dax |
使用ndctl list再次查看系统里的namespace

2.3 修改chardev的映射模式从dev到mem
使用如下命令将映射模式从dev改为mem,注意这一步骤可能会出现问题,如果出现错误,下面有给出一些解决方案。
另外这里给出daxctl的使用指南。NDCTL User Guide 这里面有一些常见的用法以及示例。
1 | sudo daxctl reconfigure-device --mode=system-ram dax1.0 |

2.4 完成
再次使用 numactl -H 查看内存节点信息,可以看到系统中已经多出了2个numa节点node2以 及 node3 ,大小分别为128G。

3. 一些可能出现的问题
3.1 在删除存在的namespace删除不成功
可能的原因是系统中这块内存已经被挂载,可以使用df -h进行查看。如果已经被挂载,使用umount先取消挂载,再进行删除。
3.2 修改chardev的映射模式从dev到mem不成功
1 | # daxctl reconfigure-device --mode=system-ram --no-online dax0.0 |
这个问题比较常见,可能的原因可能下面两个
- node节点始终分配到node0,但是系统中node0是已经存在的,所以会出错。
可以在之前的命令中加上--no-online,下面给出一个该问题的issue链接
daxctl always map system-ram into target_node 0 - 某些 Linux 发行版默认情况下可能不会启用所需的“设备迁移模型”功能。使用如下命令,然后再删除已有的namespace,重新开始操作。
1 | $ daxctl migrate-device-model |
4. 参考资料
如何用 ndctl/ipmctl 管理工具 配置不同访问模式的pmem设备
How To Extend Volatile System Memory (RAM) using Persistent Memory on Linux