Как преобразовать необработанный образ диска в образ копирования при записи на основе другого образа для использования с kvm и virt-manager?

У меня виртуальная машина Windows работает на KVM. В настоящее время он имеет сырой образ диска 90 ГБ. Я хотел бы клонировать эту виртуальную машину без необходимости хранить две копии исходного образа диска объемом 90 ГБ.

Кажется, что хороший подход для этого - создать два новых изображения 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

Почему вирт-менеджер не запустит этот vm?

1 ответ

Эта проблема была вызвана тем, как libvirt использует apparmor.

Поведение по умолчанию состоит в том, чтобы обеспечить некоторую защиту хоста от гостя, ограничивая, к каким файлам процесс виртуализации на хосте разрешен. libvirt знает, что процессу виртуализации (в данном случае kvm) для правильной работы необходим образ диска, поэтому он создает профиль apparmor, который обеспечивает доступ к windowsxp-1.qcow2, Тем не менее, он не знает, что windowsxp-1.qcow2 поддерживается basewindowsxp.qcow2поэтому профиль apparmor не разрешает доступ к этому файлу.

К сожалению, сообщения об ошибках от kvm настолько минимальны. Основная ошибка была почти наверняка EPERM при открытии basewindowsxp.qcow, но, видимо, эта ошибка сглаживается и полезная информация теряется.

Однако чтение системных журналов покажет, что apparmor что-то делает. Например,

28 мая 13:12:28 имя хоста ядро: [ 5338.835932] type=1503 аудит (1275066748.269:42): операция = "открытый" pid=10601 родительский = 1 профиль ="libvirt-b1a29fd0-698c-11df-9c21-f78cb972735d" запрашиваемая_маска = ":: w" denied_mask="::w" fsuid=0 ouid=1001 name="/var/lib/libvirt/images/basewindowsxp.img"

Это показывает, что происходит, когда профиль apparmor запрещает запись в файл для процесса. Каждый раз при сбое запуска vm из-за этой неправильной конфигурации это сообщение журнала появлялось в /var/log/messages.

Есть несколько возможных решений проблемы.

1) Отключить защиту устройства. Это можно контролировать через графический интерфейс virt-manager. В разделе обзора, подраздел безопасности, apparmor можно отключить.

2) Вручную разрешить доступ к дополнительному файлу. Это контролируется путем изменения файлов apparmor в каталоге /etc/apparmor.d/libvirt/. Добавляем строку вроде:

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

к файлу, соответствующему uuid рассматриваемого vm, будет предоставлен доступ на чтение к имени файла в кавычках.

3) Обновите до новой версии apparmor/libvirt/ base platform и заново создайте виртуальные машины. Очевидно, эта неправильная конфигурация была замечена и устраняется автоматически в достаточно новых версиях рассматриваемого программного обеспечения.

Другие вопросы по тегам