QEMU文档之虚拟NVDIMM

本文档介绍虚拟NVDIMM特性(vNVDIMM)的使用,该特性从QEMU v2.6.0开始有效。

当前QEMU仅实现vNVDIMM设备的持续内存模型,而没有实现block windown模型。

1 基本使用

QEMU中vNVDIMM设备的存储是由内存作后备提供的(memory-backend-file和memory-backend-ram)。可通过如下命令行选项在开始时来创建vNVDIMM设备:

 -machine pc,nvdimm=on
 -m $RAM_SIZE,slots=$N,maxmem=$MAX_SIZE
 -object memory-backend-file,id=mem1,share=on,mem-path=$PATH,size=$NVDIMM_SIZE,readonly=off
 -device nvdimm,id=nvdimm1,memdev=mem1,unarmed=off

其中:

- “nvdimm”机器选项使能vNVDIMM特性;

- “slot=$N”应该等于或大于正常RAM和vNVDIMM设备的总体数目,比如$N应该大于或等于2;

- “maxmem=$MAX_SIZE”应该等于或大于正常RAM和vNVDIMM设备的总体数目,比如$MAX_SIZE>=$RAM_SIZE+$NVDIMM_SIZE;

- “object memory-backed-file,id=mem1,share=on,mem-path=$PATH,size=$NVDIMM_SIZE,readonly=off” 创建一个大小为$NVDIMM_SIZE的后备存储,后备在文件$PATH。对虚拟NVDIMM设备的访问会进入文件$PATH;

- “share=on/off”控制guest写的可见性。如果share=on,guest写将被应用到后备文件。如果另一个guest写使用选项share=on,且使用相同的后备文件,然后上述写也将可以被看到。如果share=off,guest写将不被应用到后备文件,因此不能被其他guest看到;

- "readonly=on/off"控制当前文件$PATH为只读或读写(默认);

- "device nvdimm,id=nvdimm1,memdev=mem1,unarmed=off"创建一个可读写的虚拟NVDIMM设备,它的存储是由上述内存后备设备;

- "unarmed"控制ACPI NFIT NVDIMM区域映射结构“NVDIMM State Flags”bit3表明设备为"unarmed"且不再接受持续写。当该bit为1时Linux guest驱动设置设备为只读。当memdev为只读时,设置unarmed;

当提供多个"-object"和"-device"时可以创建多个vNVDIMM设备。

对于上述命令行选项,如果guest OS有合适的NVDIMM驱动(比如在Linux下CONFIG_ACPI_NFIT=y),它能够检测到NVDIMM设备,该设备为持续内存模式且大小为$NVDIMM_SIZE。

注意:

(1)在QEMU v2.8.0之前,如果使用memory-backend-file且实际后备文件大小并不等于"size"选项给出的大小,QEMU将通过ftruncate(2)截断后备文件,这将让后备文件存在的数据崩溃,特别是shrink情况。

QEMU v2.8.0以及后面版本将检查后备文件大小和"size"选项。如果它们不匹配,QEMU将报告错误并abort避免数据崩溃。

(2)QEMU v2.6.0仅将在“size”的memory-backend-file选择上基本的对齐需求,比如X86上4KB对齐。但是,QEMU v2.7.0增加了对齐需求,它要求比基本对齐更大的值,比如在X86上2MB。该修改将破坏memory-backend-file的使用,仅满足基本对齐需求。

QEMU v2.8.0以及后面版本在非s390x架构移除了额外的对齐需求,因此破坏的memory-backend-file又能够工作。

2 Label

QEMU v2.7.0以及后面版本实现了vNVDIMM设备的label支持。为使能vNVDIMM设备的label,用户可以简单的增加"label-size=$SZ"选项来"-device nvdimm",比如:

-device nvdimm,id=nvdimm1,memdev=mem1,label-size=128K

注意:

(1)最小label大小为128KB;

(2)QEMU v2.7.0以及后面版本保存label在后备存储的结尾。如果为内存后备文件,它之前被用来作为vNVDIMM设备的后备而没有label,现在被用来作为带label的vNVDIMM,在文件结束的label区域的数据将不能被guest访问。如果有用的数据(比如文件系统的元数据)被保存在这里,后面的使用会导致guest数据崩溃(比如破坏guest文件系统)。

3 Hotplug

QEMU v2.8.0及后续版本实现了vNVDIMM设备的hotplug支持。类似于RAM hotplug,vNVDIMM hotplug由两个命令“object_add”和"device_add"实现。

比如,下列命令将在guest上增加4GB vNVDIMM设备:

 (qemu) object_add memory-backend-file,id=mem2,share=on,mem-path=new_nvdimm.img,size=4G
 (qemu) device_add nvdimm,id=nvdimm2,memdev=mem2

注意:

(1)每个可hotplug的vNVDIMM设备会消耗一个内存插槽。用户通常使用内存选项"-m ...,slots=N"来指明足够的slots数目;

(2)对内存选项"-m ...,maxmem=M"也有类似的要求;

4 对齐

QEMU使用mmap(2)映射vNVDIMM后备并默认将映射地址对齐到页大小。但是,有些类型的后备要求不同于页大小的对齐。在这种情况下,QEMU v2.12.0以及后续版本提供'align'选项允许memory-backend-file允许用户指定合适的对齐。对于dax设备(比如/dev/dax0.0),这种对齐需要匹配dax设备的对齐需求。“align=NUM”选项的NUM必须大小或等于dax设备的'align'。

我们可以使用下列命令中的其中之一来显示dax 设备的align:

ndctl list -X
daxctl list -R

为了获取dax设备的align,你需要安装libdaxctl库。

比如,dax设备要求2MB对齐,因此我们可以使用下列QEMU命令行作为vNVDIMM的后备:

 -object memory-backend-file,id=mem1,share=on,mem-path=/dev/dax0.0,size=4G,align=2M
 -device nvdimm,id=nvdimm1,memdev=mem1

5 Guest Data Persistence

虽然QEMU支持多个类型的vNVDIMM后备,但能够保证guest写persistence的后备为:

A. DAX设备(比如/dev/dax0.0)或

B. DAX文件(使用dax选项作mount)

当使用B(A文件支持持续内存的直接映射)作为后备时,如果host内核在mmap系统调用支持MAP_SYNC标志且‘pmem’和'share'标志在后备上被设置为on,写持续可以保证。

如果这些条件不满足时,如'pmem'或'share'没有设置,如果后备文件不支持DAX或如果host内核不支持MAP_SYNC标志,在系统crash后写持续不会被保证。为了兼容,如果不满足,这些条件被忽略。当前没有方法来测试他们。

当使用其他类型的后备时,建议设置unarmed选项,这将对guest NVDIMM区域映射结构设置unarmed标志。unarmed标志表明guest软件包含一个不接受持续内存的区域。最后,guest linux NVDIMM驱动将这种vNVDIMM设备设置 为只读。

6 建立后备文件的例子

这里有两个例子显示如何使用工具ndctl建立起持续后备。

A. DAX设备

使用下列命令来建立起/dev/dax0.0,因此namespace0.0可以被暴露给guest作为模拟NVDIMM:

ndctl create-namespace -f -e namespace0.0 -m devdax

/dev/dax0.0可以直接被“mem-path”选项使用。

B. DAX文件

在DAX host文件系统上的单独文件可以被作为模拟的NVDIMM。首先一个fsdax块设备被创建,分区,然后被dax选择进行mount。

    ndctl create-namespace -f -e namespace0.0 -m fsdax
    (partition /dev/pmem0 with name pmem0p1)
    mount -o dax /dev/pmem0p1 /mnt
    (create or copy a disk image file with qemu-img(1), cp(1), or dd(1)
     in /mnt)

/mnt中的新文件可以 被"mem-path"选项使用。

7 NVDIMM Persistence

ACPI 6.2 Errata A增加了一个新的平台能力结构,它可以与平台沟通它支持与NVDIMM数据持续的哪些特性。用户可以提供通过选项"nvdimm-persistence"机器命令行来提供持续值给guest:

-machine pc,accel=kvm,nvdimm,nvdimm-persistence=cpu

这个选项有两个有效值:

“mem-ctrl”:平台支持在掉电时将脏数据从内存控制器flush到NVDIMM中;

“cpu”:平台支持在掉电时将脏数据将CPU cache flush到NVDIMM。这也表明平台在掉电时也支持将脏数据从内存控制flush。

如果vNVDIMM后备在host持续内存,该内存可在SNIA NVM 编程模式访问,建议将memory-backend-file的'pmem'选项设置为on。当'pmem'为on且QEMU支持libpmem(配置--enable-libpmem),QEMU将采用必要的操作来保证自己写vNVDIMM后备的持续(在vNVDIMM label模拟和热迁移)。如果'pmem'为on但不支持libpmem,qemu将退出并报告缺少libpmem支持。

比如,如果我们想保证一些后端文件的持续,使用QEMU命令行:

-object memory-backend-file,id=nv_mem,mem-path=/XXX/yyy,size=4G,pmem=on

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值