Jea*_*one 4 libvirt qemu qcow2 kvm-virtualization
我有一台在 kvm 上运行的虚拟 Windows 机器。目前它有一个 90GB 的原始磁盘映像。我想克隆这个 VM,而不必保留 90GB 原始磁盘映像的两个副本。
这样做的一个好方法是基于原始图像制作两个新的 qcow 或 qcow2 图像。首先,我将原始图像转换为 qcow2 图像:
qemu-img convert -O qcow2 basewindowsxp.img basewindowsxp.qcow2
Run Code Online (Sandbox Code Playgroud)
然后我尝试创建一个由这个支持的新图像:
qemu-img create -F qcow2 -f qcow2 -b `pwd`/basewindowsxp.qcow2 windowsxp-1.qcow2
Run Code Online (Sandbox Code Playgroud)
然后我使用 virt-manager 将原始 VM 指向 windowsxp-1.qcow2。但是,当我尝试以这种新配置启动 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
Run Code Online (Sandbox Code Playgroud)
该错误表明文件名指定错误或文件系统权限过于严格,但这两种情况都不是:
$ 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
Run Code Online (Sandbox Code Playgroud)
为什么 virt-manager 不启动这个虚拟机?
这个问题是由 libvirt 使用 apparmor 的方式引起的。
默认行为是通过限制允许主机上的虚拟化进程访问哪些文件来为主机提供一些针对来宾的保护。libvirt 知道虚拟化进程(在本例中为 kvm)需要磁盘映像才能正常运行,因此它创建了一个允许访问windowsxp-1.qcow2. 但是,它不知道windowsxp-1.qcow2由 支持basewindowsxp.qcow2,因此 apparmor 配置文件不允许访问该文件。
不幸的是,来自 kvm 的错误报告如此之少。潜在的失败几乎可以肯定是打开时的 EPERM basewindowsxp.qcow,但显然这个错误变得平坦并且有用的信息丢失了。
但是,阅读系统日志会发现 apparmor 正在做某事。例如,
5 月 28 日 13:12:28 主机名内核:[5338.835932] type=1503 audit(1275066748.269:42): operation="open" pid=10601 parent=1 profile="libvirt-b1a29fd0-698c-119df7d7df775066748.269 ="::w" denied_mask="::w" fsuid=0 ouid=1001 name="/var/lib/libvirt/images/basewindowsxp.img"
这显示了当 apparmor 配置文件拒绝进程对文件的写访问时会发生什么。每次 vm 启动由于此错误配置而失败时,此日志消息都会出现在 /var/log/messages 中。
该问题有几种可能的解决方案。
1) 禁用 apparmor 保护。这可以通过 virt-manager GUI 进行控制。在概述部分,安全小部分,可以禁用 apparmor。
2) 手动允许访问额外文件。这是通过修改 /etc/apparmor.d/libvirt/ 目录中的 apparmor 文件来控制的。添加如下一行:
"/var/lib/libvirt/images/basewindowsxp.img" r,
Run Code Online (Sandbox Code Playgroud)
到与相关 vm 的 uuid 匹配的文件将授予对引号中文件名的读取访问权限。
3) 升级到较新版本的 apparmor/libvirt/基础平台并重新创建 VM。显然,这种错误配置已被注意到,并在相关软件的足够新版本中自动解决。
| 归档时间: |
|
| 查看次数: |
22403 次 |
| 最近记录: |