Libvirt

如何將原始磁碟映像轉換為基於另一個映像的寫時複製映像,以便與 kvm 和 virt-manager 一起使用?

  • May 28, 2010

我有一個在 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 將原始 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

該錯誤表明文件名指定錯誤或文件系統權限過於嚴格,但都不是這種情況:

$ 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)需要磁碟映像才能正常執行,因此它創建了一個 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):操作=“打開”pid=10601 父=1 配置文件=“libvirt-b1a29fd0-698c-11df-9c21-f78cb972735d”請求遮罩=“::w”拒絕遮罩=“::w” fsuid=0 ouid=1001 name="/var/lib/libvirt/images/basewindowsxp.img" 這顯示了當 apparmor 配置文件拒絕程序對文件的寫訪問時會發生什麼。每次由於這種錯誤配置導致 vm 啟動失敗時,此日誌消息都會出現在 /var/log/messages 中。

該問題有幾種可能的解決方案。

1)禁用apparmor保護。這可以通過 virt-manager GUI 進行控制。在概述部分的安全子部分中,可以禁用 apparmor。

  1. 手動允許訪問額外文件。這是通過修改 /etc/apparmor.d/libvirt/ 目錄中的 apparmor 文件來控制的。添加如下一行:
"/var/lib/libvirt/images/basewindowsxp.img" r,

到與相關虛擬機的 uuid 匹配的文件將授予對引號中的文件名的讀取訪問權限。

  1. 升級到更新版本的 apparmor/libvirt/基礎平台並重新創建虛擬機。顯然,這種錯誤配置已被注意到,並在相關軟體的足夠新版本中自動解決。

引用自:https://serverfault.com/questions/145834