我有 32 位 Windows 2k3r3 客户机(终端服务器),配备 4GB 客户机内存和交换空间。
我为客户交换和用户临时目录创建了单独的磁盘映像。
我主机系统中有足够的 RAM,并想通过将此映像移动到 tmpfs 来节省磁盘 IO,但客户机无法启动并出现以下错误消息:
qemu-kvm: -drive file=/mnt/tmpfs/vh1-tmp.qcow2,if=none,id=drive-ide0-1-1,format=qcow2,cache=none: 无法打开磁盘映像│4098 qemu 20 0 4949M 4146M 5496 S 28.5 17.2 1h00:31 /usr/bin/qemu-kvm -name vh1 -S -M pc-1.3 -cpu kvm64 -enable- e /mnt/tmpfs/vh1-tmp.qcow2: 参数无效
主机系统:
#uname -a Linux srv-vh1.su.local 3.7.10-1.16-default #1 SMP 2013 年 5 月 31 日星期五 20:21:23 UTC x86_64 x86_64 x86_64 GNU/Linux srv-vh1:/mnt/tmpfs #virsh 版本 针对库进行编译:libvirt 1.0.2 使用库:libvirt 1.0.2 使用 API:QEMU 1.0.2 正在运行的虚拟机管理程序:QEMU 1.3.0 srv-vh1:/mnt/tmpfs # 释放 已使用的、可用的、缓存的共享缓冲区总数 内存:24627548 5084724 19542824 0 60640 138792 -/+ 缓冲区/缓存:4885292 19742256 交换:8384444 0 8384444 srv-vh1:/mnt/tmpfs # cat /etc/mtab | grep tmpfs devtmpfs /dev devtmpfs rw,relatime,大小=12296608k,nr_inodes=3074152,模式=755 0 0 tmpfs /dev/shm tmpfs rw,relatime 0 0 tmpfs /运行 tmpfs rw,nosuid,nodev,relatime,mode=755 0 0 tmpfs /sys/fs/cgroup tmpfs rw,nosuid,nodev,noexec,mode=755 0 0 tmpfs /mnt/tmpfs tmpfs rw,相关时间 0 0 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tmpfs /tmp tmpfs rw,相关时间 0 0 tmpfs /var/lock tmpfs rw,nosuid,nodev,relatime,mode=755 0 0 tmpfs /var/run tmpfs rw,nosuid,nodev,relatime,mode=755 0 0 srv-vh1:/mnt/tmpfs# df 文件系统 1K 块已使用 可用 已用 % 挂载点 devtmpfs 12296608 68 12296540 1% /dev tmpfs 12313772 0 12313772 0%/ dev / shm tmpfs 12313772 6772 12307000 1% /运行 /dev/md1 454131992 218835836 212227596 51% / tmpfs 12313772 0 12313772 0%/sys/fs/cgroup tmpfs 12313772 192 12313580 1% /mnt/tmpfs ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tmpfs 12313772 20 12313752 1% /tmp tmpfs 12313772 6772 12307000 1%/ var /锁 tmpfs 12313772 6772 12307000 1%/ var /运行 srv-vh1:/mnt/tmpfs#virsh 池信息 tmpfs 名称:tmpfs UUID:6287028a-9faf-f762-20de-d36d63657be3 状态: 工作中 坚持:是的 自动启动:是 容量:11.74 GiB 分数: 0,00 可用:11,74 GiB srv-vh1:/mnt/tmpfs# ls -la 总计 196 drwxrwxrwt 2 root root 60 九月 9 11:42。 drwxrwxr-x 4 qemu qemu 4096 九月 8 19:39 .. -rw-rw-rw- 1 root root 197120 九月 9 11:42 tserver-tmp.qcow2
我究竟做错了什么 ?
答案1
显然,如果您在任何不支持直接 IO 的主机文件系统上为磁盘映像文件设置 cache=NONE,Virt-Manager 当前将给出一个不太有用的错误消息,提示“某些东西......无效参数”并拒绝启动 Guest VM。
不支持 Direct IO 的文件系统的一个例子是 tmpfs。另一个可以选择禁用 Direct IO 的文件系统是 GlusterFS(我之前没有听说过,我也遇到了和 Sergei 一样的问题,正在研究错误。)对于 tmpfs,目前不支持 Direct IO 似乎是一个技术限制或设计冲突,我不知道将来是否会/可以纠正它。
就我而言,我为在 CentOS7 上运行的 Win7Pro Guest VM 放置了一个 3.6 GB 的 Ramdisk,并在 Virt-Manager 中为 ramdisk 设置了 cache=NONE。tmpfs img 使用的其他选项是 virtio 和 raw。VM 会拒绝启动,并出现相同/类似的错误“... 参数无效”。
有关编写功能 cache=NONE 补丁并维护 (?) Virt-Manager (Daniel Berrange) 的 Redhat 工程师和开发人员直接提供的技术细节和说明,请参阅以下链接中的讨论:
https://bugs.launchpad.net/nova/+bug/959637
引用上述 URL 中的 Daniel 的话:“> 无法打开磁盘映像 /mnt/vmstore/instances/instance-0000001a/disk:参数无效
可能意味着文件系统不支持直接 IO。据我所知,除了 tmpfs 之外的所有文件系统都应该支持此功能。“
此外,Daniel 继续说道:“- 那么我们接下来要做的是 [...] 检查存储卷是否支持直接 IO。如果支持,则使用 cache=none,否则回退到 cache=writethrough,这样不使用直接 I/O,但仍然是安全的。”
在我的例子中,我能够验证设置 tmpfs img 文件的 cache=NONE 不会启动 VM,并显示讨论过的错误。如果将缓存设置为“默认”或明确设置为“直写”,则可以成功启动 VM。使用“回写”是没有意义的,因为这个文件系统既是消耗性的,又完全在 RAM 中,所以显然我没有使用回写。
希望有帮助!
答案2
为什么不给客人更多的内存,这样它就不需要交换了?
srv-vh1:/mnt/tmpfs # ls -la
total 196
drwxrwxrwt 2 root root 60 сен 9 11:42 .
drwxrwxr-x 4 qemu qemu 4096 сен 8 19:39 ..
-rw-rw-rw- 1 root root 197120 сен 9 11:42 tserver-tmp.qcow2
我注意到您已将文件夹所有者设置为 qemu:qemu,如果您以其他用户身份运行 qemu,那么您可能需要将映像文件的所有者从 root 更改为 qemu
答案3
这是一个错误。tmpfs 不支持cache=none
。