Как решить ошибку «Отказано в доступе» для qemu:commandline в libvirt?

Пожалуйста, найдите ниже образец моего dom xml. Я запускаю команду virsh create и получаю эту ошибку:

Unable to open file <json file located inside install_dir>

Разрешения для этого файла все хорошо.

Требуются ли какие-либо специальные разрешения для параметров под тегом qemu:commandline? Независимо от параметра и файла, которые я упоминаю в этом разделе, я получаю сообщение об ошибке.

 <domain type='qemu' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
  <name>my_instance</name>
  <uuid>35615c44-b004-4b3f-9f42-da182b9662ee</uuid>
  <memory unit='KiB'>786432</memory>
  <currentMemory unit='KiB'>786432</currentMemory>
  <vcpu placement='static'>1</vcpu>
  <os>
    <type arch='armv7l' machine='my_machine'>hvm</type>
    <kernel>/home/user/KernelPath/zImage</kernel>
    <dtb>/home/user/DTPPath/emmc.dtb</dtb>
  </os>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <devices>
    <emulator>/usr/bin/qemu-system-arm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw'/>
      <source file='/home/user/Install_Dir/emmc.dat'/>
      <target dev='sd' bus='scsi'/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
    <controller type='usb' index='0'/>
    <controller type='scsi' index='0'/>
    <serial type='pty'>
      <target port='0'/>
    </serial>
    <serial type='pty'>
      <target port='1'/>
    </serial>
    <serial type='pty'>
      <target port='2'/>
    </serial>
    <serial type='pty'>
      <target port='3'/>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <graphics type='vnc' port='60316' autoport='no' websocket='60381' listen=''>
      <listen type='address' address=''/>
    </graphics>
    <graphics type='sdl'/>
    <video>
      <model type='qxl'/>
    </video>
    <memballoon model='none'/>
  </devices>
  <qemu:commandline>
    <qemu:arg value='-spdir'/>
    <qemu:arg value='/home/user/Install_Dir'/>
    <qemu:arg value='-show-cursor'/>
  </qemu:commandline>
</domain>

person Deepti    schedule 07.02.2018    source источник
comment
Напечатанный код ошибки — 13. Это означает, что при открытии указанного файла отказано в доступе.   -  person Deepti    schedule 07.02.2018


Ответы (2)


Libvirt попытается запустить гостей, используя как выделенную учетную запись пользователя (обычно qemu:qemu пара пользователь/группа), так и также применяя правила SELinux или AppArmor для ее ограничения. Обычно libvirt автоматически устанавливает владельца файла и настраивает политики SELinux/AppArmor так, чтобы они «просто работали». Однако сквозная передача командной строки qemu является черным ящиком для libvirt, поэтому он понятия не имеет, что ему нужно что-то с вашим /home/user/Install_Dir путем. Если ваше владение пользователем/группой правильное, то, вероятно, политики SELinux/AppArmor запрещают доступ. Единственный жизнеспособный обходной путь - отключить их (через /etc/libvirt/qemu.conf) и принять более низкую защиту безопасности.

person DanielB    schedule 07.02.2018
comment
Это была политика AppArmor. Я выполнил жалобу, чтобы преодолеть ошибку. - person Deepti; 07.02.2018
comment
Вы упомянули пользователя/группу qemu:qemu. Как проверить, работает ли мой гость с этим разрешением? И какие изменения необходимо внести в /etc/libvirt/qemu.conf? - person Deepti; 07.02.2018

Запускать QEMU с привилегиями суперпользователя не рекомендуется, так как начиная с версии 6.0.0 он не лишает возможности Linux.

В моем случае это был AppArmor. Я хотел добавить файл SSDT для батареи на виртуальную машину. Есть некоторые папки, к которым AppArmor разрешает доступ, а другие (например, /home/something) просто запрещены. /var/lib/libvirt/images/ — одна из разрешенных папок. Хотя я поместил туда свой файл, он все еще не разрешен политикой AppArmor (как видно из sudo cat /var/log/kern.log | grep -C 10 apparmor | grep -C 10 qemu). Что сработало, так это добавить /var/lib/libvirt/images/SSDT1.dat rk в /etc/apparmor.d/libvirt/TEMPLATE.qemu следующим образом:

#
# This profile is for the domain whose UUID matches this file.
#

#include <tunables/global>

profile LIBVIRT_TEMPLATE flags=(attach_disconnected) {
  #include <abstractions/libvirt-qemu>
  /var/lib/libvirt/images/SSDT1.dat rk,
}
person Lyubomir    schedule 17.11.2020