如何确保程序实际映射到模拟的Persistent Memory分区pmem0
让libpmemobj池映射到/dev/pmem0的解决方法
你的问题出在PMEM池文件被创建在了普通磁盘分区,要落到模拟的pmem0分区,按以下步骤操作:
1. 挂载pmem0并开启DAX
持久内存文件系统需要DAX(Direct Access)特性来让libpmemobj直接访问,先完成挂载:
sudo mkdir -p /mnt/pmem # 用ext4挂载并开启DAX;若用xfs则参数为-o dax=always sudo mount -t ext4 -o dax /dev/pmem0 /mnt/pmem # 可选:设置开机自动挂载 echo "/dev/pmem0 /mnt/pmem ext4 dax 0 0" | sudo tee -a /etc/fstab
2. 修改代码中的池文件路径
把pmemobj_create的path参数指向pmem挂载目录下的路径,比如/mnt/pmem/my_pmem_pool。修改后的关键代码:
const char *path = "/mnt/pmem/my_pmem_pool"; pop = pmemobj_create(path, LAYOUT, PMEMOBJ_MIN_POOL, 0666); if (!pop) { perror("pmemobj_create failed"); exit(EXIT_FAILURE); } PMEMoid root = pmemobj_root(pop, sizeof(struct my_root)); struct my_root *rootp = pmemobj_direct(root); // 写入数据后执行持久化 pmemobj_persist(pop, &rootp->len, sizeof(rootp->len));
验证映射是否成功
程序运行后,执行以下命令检查池文件所在分区:
df -P /mnt/pmem/my_pmem_pool | tail -1 | awk '{print $1}'
输出应为/dev/pmem0,说明已成功映射到模拟的持久内存分区。
注意:如果之前在普通路径创建过同名池文件,需先删除旧文件再重新运行程序,避免复用旧池。
内容的提问来源于stack exchange,提问作者novaura
相关产品推荐
相关产品推荐

