本文档介绍虚拟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

QEMU文档之虚拟NVDIMM相关推荐

  1. QEMU文档之virtio pmem

    本文档解释了virtio pmem设备的建立和使用.virtio pmem设备为正规存储中的半虚拟化持续内存设备. 1 使用场景 virtio pmem允许绕过guest page cache并直接使 ...

  2. C# 打印PDF文档的10种方法

    操作PDF文档时,打印是常见的需求之一.针对不同的打印需求,可分多种情况来进行,如设置静默打印.指定打印页码范围和打印纸张大小.双面打印.黑白打印等等.经过测试,下面将对常见的几种PDF打印需求做一些 ...

  3. 还在为打印PDF文件发愁?文档开发工具Spire.PDF 6种方式帮你搞定!

    Spire.PDF(点击下载)是一个专业的PDF组件,能够独立地创建.编写.编辑.操作和阅读PDF文件,支持 .NET.Java.WPF和Silverlight.Spire.PDF的PDF API拥有 ...

  4. C# 六种方案打印PDF文档

    打印PDF文档是开发人员经久不变的话题,常见的打印需求大致有以下六种: 用默认打印机打印PDF文档 用虚拟打印机打印PDF文档 指定打印机及PDF文档的打印页码范围 静默打印PDF文档 双面打印PDF ...

  5. php_printer.dll 打印 jpg 图片,文档打印成图片(ImagePrinter)

    让低版本的office支持将文档打印成图片的工具,ImagePrinter可以将文档"打印(虚拟打印)"成BMP.PNG.JPG.PDF等格式的文件,安装后会成为系统的默认打印机. ...

  6. 调用webapi 错误:使用 HTTP 谓词 POST 向虚拟目录发送了一个请求,而默认文档是不支持 GET 或 HEAD 以外的 HTTP 谓词的静态文件。的解决方案

    调用webapi 错误:使用 HTTP 谓词 POST 向虚拟目录发送了一个请求,而默认文档是不支持 GET 或 HEAD 以外的 HTTP 谓词的静态文件.的解决方案 参考文章: (1)调用weba ...

  7. 福昕pdf虚拟打印机_一学就会的PDF文档压缩小技巧

    PDF文档拥有着兼容性.稳定性和安全性的优点,在文档界拥有这不可撼动的江湖地位,但是对于PDF文档的压缩处理,我们却无从下手.哈哈,不用纠结,现在小编就教你如何压缩PDF文档.如何快速转换PDF文档. ...

  8. linux虚拟实验服务,Linux虚拟服务器(LVS)实验文档PDF

    这个Linux虚拟服务器(LVS)实验文档时我看过最好的实验文档,里面介绍了LVS/nat LVS/DR LVS/TUN以及综合实验,讲解了常用的算法和调度. 由于 ARP 的对应关系,是通过广播学到 ...

  9. ssm+Vue计算机毕业设计虚拟问诊系统(程序+LW文档)

    ssm+Vue计算机毕业设计虚拟问诊系统(程序+LW文档) 项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe ...

最新文章

  1. 直播回顾|大规模点云显示技术
  2. android5.0 广播失效,解决Android 8.0及以上系统接收不到广播的问题
  3. [CodeForces 1603C] Extreme Extension(贪心 + 数论分块优化dp)
  4. SBT, activator, play之間的糾葛
  5. 如何安装html网站模板,网站模板安装说明
  6. Atitit 编程范式之道 attilax著 艾龙 著 1. 编程范式与编程语言的关系是什么? 1 2. LOP 面向语言编程(LOP, Language Oriented Programming
  7. CompoundButton
  8. 使用esxcli命令升级VMware ESXi补丁
  9. ucfirst.php
  10. 中文ISBN公开信息查询接口
  11. 使用Voxelmorph配准IXI:数据预处理之颅骨去除及仿射对齐
  12. 我的世界服务器怎么弄无限矿物,我的世界暮色森林矿石树资源无限刷攻略
  13. C6678信号处理板学习资料:基于6U VPX TMS320C6678+XC7K325T 的信号处理板
  14. 3. 自定义Java编译时注解处理器
  15. 微信扫码提示在浏览器中打开的遮罩代码
  16. 一个完整的NES模拟器
  17. [内核内存] [arm64] 内存回收2---快速内存回收和直接内存回收
  18. 用easynetty进行服务端回签同步确认
  19. 软考系统设计架构师经验与教训分享
  20. Server Disconnect

热门文章

  1. java lint_Android静态代码检查-Lint
  2. Linux 使用命令行执行百度网盘数据传输
  3. 《C++程序设计》第十章总结
  4. 旧电脑利用:windows网页版魔镜【不需树莓派】
  5. 前端开发中的跨域问题及解决方案
  6. Python_argparse.Argumentparser()
  7. 云计算特点与发展方向
  8. 谷歌浏览器(Chrome)输入框总是有历史输入记录,解决办法
  9. 阿里云物联网平台最完全的使用教程
  10. Mac 安装目前最新版本的 macOS Big Sur