qemu可以模拟出nvdimm硬件,并在虚拟机中对其访问。

模拟nvm设备

  1. 创建大小为20G,格式为qcow2的虚拟磁盘:

    1
    qemu-img create -f qcow2 diskname.qcow2 20g
  2. 从光盘启动,在虚拟磁盘上安装系统:

    1
    qemu-system-x86_64 -enable-kvm -hda ubuntu.qcow2 -boot d -cdrom path/to/your/distribution/img.iso -m 8192

    其中-boot d指定boot order为光盘优先。

  3. 模拟出nvdimm设备,并从硬盘启动虚拟机:

    1
    2
    3
    qemu-system-x86_64 -machine pc,nvdimm=on -enable-kvm -hda diskname.qcow2 -m 8G,slots=8,maxmem=128G \
    -object memory-backend-file,id=mem1,share=on,mem-path=nvdimm.img,size=16G \
    -device nvdimm,id=nvdimm1,memdev=mem1

    其中-machine指明启动nvdimm特性,-object指定了一个模拟nvdimm的文件及其大小,-device挂载该设备。

  4. 在虚拟机中可看到名为/dev/pmem0的nvdimm设备存在。

挂载文件系统

ndctl是管理libnvdimm子系统的工具,使用ndctl list查看发现此时pmem0设备的mode为raw,不能直接挂载文件系统。使用dmesg可以看到错误提示:

1
2
3
4
5
>sudo mount -t somefs -o init /dev/pmem0 ~/mnt/
...
>dmesg
...
[ xxx.xxxxxx] device does not support DAX

使用ndctl改变nvdimm设备的格式:

1
2
3
4
5
6
>sudo ndctl destroy-namespace --force namespace0.0
destroyed 0 namespaces
>sudo ndctl create-namespace
...
"mode":"fsdax",
...

其中namespace的名字可以用ndctl list查看。现在可以使用mount在设备pmem0上初始化并挂载文件系统了。

与宿主机通信

  1. 在启动qemu时增加参数,将host的某端口与guest的22端口(ssh)关联,并虚拟一个nic设备。

    1
    2
    -net user,hostfwd=tcp::10022-:22 
    -net nic
  2. 确保guest中已运行sshd。

  3. 可以通过ssh -p 10022 localhost连接到虚拟机。


  1. Using QEMU Virtualization
  2. How to SSH from host to guest using QEMU?