Как решить ошибку "Отказано в доступе" для командной строки qemu: в libvirt?
Пожалуйста, найдите ниже образец моего дома 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>
1 ответ
Libvirt попытается запустить гостей, используя как отдельную учетную запись пользователя (обычно qemu:qemu
пара пользователь / группа), а также применяя правила SELinux или AppArmor для его ограничения. Обычно libvirt автоматически устанавливает владельца файла и настраивает политики SELinux/AppArmor на "просто работу". Тем не менее, командная строка qemu является черным ящиком для libvirt, поэтому она не имеет ни малейшего представления, что ей нужно что-то с вашим /home/user/Install_Dir
дорожка. Если ваше владение пользователем / группой верно, то, вероятно, это политики SELinux/AppArmor, которые запрещают доступ. Единственный возможный обходной путь - это отключить их (через /etc/libvirt/qemu.conf
) и принять более низкую защиту
Запуск QEMU с правами root не рекомендуется, поскольку начиная с версии 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,
}