如何将原始磁盘映像转换为基于另一个映像的写时复制映像,以便与kvm和virt-manager一起使用?

我有一个运行在kvm上的虚拟Windows机器。 目前它有一个90GB的原始磁盘映像。 我想克隆这个虚拟机,而不必保留90GB原始磁盘映像的两个副本。

这样做的好方法是根据原始图像创build两个新的qcow或qcow2图像。 首先,我将原始图像转换为qcow2图像:

qemu-img convert -O qcow2 basewindowsxp.img basewindowsxp.qcow2 

然后我试着创build一个由此支持的新图像:

 qemu-img create -F qcow2 -f qcow2 -b `pwd`/basewindowsxp.qcow2 windowsxp-1.qcow2 

然后我使用virt-manager将原始虚拟机指向windowsxp-1.qcow2。 但是,当我尝试在这个新configuration中启动VM时,virt-manager报告了一个错误:

 Traceback (most recent call last): File "/usr/share/virt-manager/virtManager/engine.py", line 588, in run_domain vm.startup() File "/usr/share/virt-manager/virtManager/domain.py", line 150, in startup self._backend.create() File "/usr/lib/python2.6/dist-packages/libvirt.py", line 300, in create if ret == -1: raise libvirtError ('virDomainCreate() failed', dom=self) libvirtError: internal error unable to start guest: qemu: could not open disk image /var/lib/libvirt/images/windowsxp-1.qcow2 

错误表明文件名被错误指定或文件系统权限过于严格,但这两种情况都不是这样:

 $ ls -l /var/lib/libvirt/images/windowsxp-1.qcow2 -rwxrwxrwx 1 root root 262144 2010-05-27 08:32 /var/lib/libvirt/images/windowsxp-1.qcow2 

为什么virt-manager不能启动这个虚拟机?

这个问题是libvirt使用apparmor的方式造成的。

默认行为是通过限制主机上的虚拟化进程允许访问的文件来为主机提供一些针对客户机的保护。 libvirt知道虚拟化进程(在这种情况下为kvm)需要磁盘映像才能正常运行,所以它创build了一个apparmorconfiguration文件,允许访问windowsxp-1.qcow2 。 但是,它不知道windowsxp-1.qcow2是由basewindowsxp.qcow2支持的,所以apparmorconfiguration文件不允许访问该文件。

不幸的是,kvm的错误报告非常less。 当打开basewindowsxp.qcow ,潜在的故障几乎可以肯定是一个EPERM,但是显然这个错误变得平坦,有用的信息丢失了。

但是,阅读系统日志将显示apparmor正在做的事情。 例如,

5月28日13:12:28 hostname kernel:[5338.835932] type = 1503 audit(1275066748.269:42):operation =“open”pid = 10601 parent = 1 profile =“libvirt -b1a29fd0-698c-11df-9c21-f78cb972735d”requested_mask =“:: w”denied_mask =“:: w”fsuid = 0 ouid = 1001 name =“/ var / lib / libvirt / images / basewindowsxp.img”

这显示当apparmorconfiguration文件拒绝对进程的文件的写入访问时发生的情况。 每次由于错误configuration而导致vm启动失败时,此日志消息都会出现在/ var / log / messages中。

有几个可能的解决scheme来解决这个问题。

1)禁用安全保护。 这可以通过virt-manager GUI进行控制。 在概述部分,安全部分,apparmor可以被禁用。

2)手动允许访问额外的文件。 这是通过修改/etc/apparmor.d/libvirt/目录中的apparmor文件来控制的。 添加一行如:

 "/var/lib/libvirt/images/basewindowsxp.img" r, 

到与正在讨论的vm的uuid相匹配的文件将授予对引号的文件名的读访问权限。

3)升级到更新版本的apparmor / libvirt /基础平台并重新创build虚拟机。 显然,这种错误configuration已经被注意到,并且在有问题的软件的新版本中被自动解决。