我有一台在 kvm 上运行的 Windows 虚拟机。目前它有一个 90GB 的原始磁盘映像。我想克隆此虚拟机,而不必保留 90GB 原始磁盘映像的两个副本。
似乎一个好方法是根据原始图像制作两个新的 qcow 或 qcow2 图像。首先,我将原始图像转换为 qcow2 图像:
qemu-img convert -O qcow2 basewindowsxp.img basewindowsxp.qcow2
然后我尝试创建一个以此为基础的新图像:
qemu-img create -F qcow2 -f qcow2 -b `pwd`/basewindowsxp.qcow2 windowsxp-1.qcow2
然后我使用 virt-manager 将原始虚拟机指向 windowsxp-1.qcow2。但是,当我尝试在此新配置中启动虚拟机时,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 无法启动该虚拟机?
答案1
该问题是由 libvirt 使用 apparmor 的方式引起的。
默认行为是通过限制主机上的虚拟化进程可以访问的文件来为主机提供一些针对客户的保护。libvirt 知道虚拟化进程(在本例中为 kvm)需要磁盘映像才能正常运行,因此它会创建一个允许访问的 apparmor 配置文件windowsxp-1.qcow2
。但是,它不知道 是windowsxp-1.qcow2
由 支持的basewindowsxp.qcow2
,因此 apparmor 配置文件不允许访问该文件。
遗憾的是,kvm 的错误报告非常少。底层故障几乎肯定是打开时的 EPERM basewindowsxp.qcow
,但显然这个错误被忽略了,有用的信息丢失了。
但是,阅读系统日志会发现 apparmor 正在执行某些操作。例如,
5 月 28 日 13:12:28 主机名内核:[5338.835932] 类型 = 1503 审核(1275066748.269:42):操作 =“open” pid = 10601 父 = 1 配置文件 =“libvirt-b1a29fd0-698c-11df-9c21-f78cb972735d” request_mask =“::w” denied_mask =“::w” fsuid = 0 ouid = 1001 名称 =“/var/lib/libvirt/images/basewindowsxp.img”
这显示了当 apparmor 配置文件拒绝进程对文件的写访问时发生的情况。每次由于此错误配置导致虚拟机启动失败时,此日志消息都会出现在 /var/log/messages 中。
该问题有几种可能的解决方案。
1) 禁用 apparmor 保护。这可以通过 virt-manager GUI 进行控制。在概述部分的安全子部分中,可以禁用 apparmor。
2) 手动允许访问额外文件。这可以通过修改 /etc/apparmor.d/libvirt/ 目录中的 apparmor 文件来控制。添加如下一行:
"/var/lib/libvirt/images/basewindowsxp.img" r,
与相关虚拟机的 uuid 匹配的文件将授予对引号中的文件名的读取权限。
3) 升级到较新版本的 apparmor/libvirt/基础平台并重新创建虚拟机。显然,这种错误配置已被注意到,并在相关软件的较新版本中自动解决。