Вопрос или проблема
У меня возникают проблемы с пониманием разрешений для изображений QEMU/KVM в пулах хранения. Мои машины хранят свои QCOW2-файлы в устройстве LVM thinpool. Вот соответствующие части:
vgdisplay machines
--- Группа томов ---
Имя VG machines
System ID
Формат lvm2
Метаданные области 1
Последовательность метаданных 214
Доступ к VG чтение/запись
Статус VG изменяемый
MAX LV 0
Cur LV 11
Открытое LV 10
Max PV 0
Cur PV 1
Act PV 1
Размер VG <430,14 GiB
Размер PE 4,00 MiB
Общее количество PE 110115
Выделенный PE / Размер 75389 / <294,49 GiB
Свободный PE / Размер 34726 / <135,65 GiB
UUID VG Y3iwxU-bsZr-BDBI-Xo27-x6Ih-IuNP-60vlRa
lvdisplay machines
--- Логический том ---
Имя LV thinpool-machines
Имя VG machines
UUID LV XXCI1K-KtVl-guor-AJkM-cdNJ-av3b-KpHc1q
Доступ на запись в LV чтение/запись (активирован только для чтения)
Хост создания LV, время kosmos.home.lan, 2025-02-22 09:25:30 +0100
Метаданные пула LV thinpool-machines_tmeta
Данные пула LV thinpool-machines_tdata
Статус LV доступен
# открытых 0
Размер LV <94,08 GiB
Выделенные данные пула 8,88%
Выделенные метаданные 13,04%
Текущий LE 24084
Сегменты 1
Распределение наследовать
Чтение вперед секторов авто
- текущее значение 8192
Блочное устройство 254:19
--- Логический том ---
Путь LV /dev/machines/thinvolume-machines
Имя LV thinvolume-machines
Имя VG machines
UUID LV mx0lNz-ucKq-v2jX-6WEf-P0VH-cMOp-cuLIrH
Доступ на запись в LV чтение/запись
Хост создания LV, время kosmos.home.lan, 2025-02-22 09:26:50 +0100
Имя пула LV thinpool-machines
Статус LV доступен
# открытых 1
Размер LV 94,17 GiB
Отображенный размер 8,87%
Текущий LE 24108
Сегменты 1
Распределение наследовать
Чтение вперед секторов авто
- текущее значение 8192
Блочное устройство 254:20
mount|grep thin
/dev/mapper/machines-thinvolume--machines на /mnt/vms тип ext4 (rw,relatime,stripe=16,x-cockpit-never-auto,x-parent=mx0lNz-ucKq-v2jX-6WEf-P0VH-cMOp-cuLIrH)
Настройка LVM2 была выполнена с использованием linux cockpit. На пути к LV определен пул хранения:
# vms это соответствующий пул здесь:
virsh pool-list
Имя Статус Автоматический старт
------------------------------------------
isos Активен да
machines Активен нет
vms Активен нет
virsh pool-info vms
Имя: vms
UUID: d236ce14-e2d1-4960-ab5b-5a1d78bc9dc4
Статус: запущен
Постоянный: да
Автоматический старт: нет
Вместимость: 92,13 GiB
Выделено: 6,12 GiB
Доступно: 86,01 GiB
virsh pool-dumpxml vms
<pool type="dir">
<name>vms</name>
<uuid>d236ce14-e2d1-4960-ab5b-5a1d78bc9dc4</uuid>
<capacity unit="bytes">98928267264</capacity>
<allocation unit="bytes">6574415872</allocation>
<available unit="bytes">92353851392</available>
<source>
</source>
<target>
<path>/mnt/vms</path>
<permissions>
<mode>0755</mode>
<owner>64055</owner>
<group>64055</group>
</permissions>
</target>
</pool>
getent passwd|grep virt
libvirt-qemu:x:64055:114:Libvirt Qemu,,,:/var/lib/libvirt:/bin/false
libvirtdbus:x:998:998:Created by dh-sysuser for libvirt-dbus:/nonexistent:/usr/sbin/nologin
И внутри моего пула хранения vms
есть файл QCOW2, который содержит мою ВМ:
drwxr-xr-x 3 libvirt-qemu libvirt-qemu 4096 22. фев 09:40 .
drwxr-xr-x 7 root root 4096 22. фев 09:27 ..
drwx------ 2 root root 16384 22. фев 09:28 lost+found
-rw-r--r-- 1 libvirt-qemu libvirt-qemu 7143817216 22. фев 09:29 vm-bootes.qcow2
Я прикрепил образ QCOW2 к моей виртуальной машине:
Но машина отказывается запускаться с ошибкой:
Внутренняя ошибка: процесс завершился, пока подключался к монитору: 2025-02-22T08:39:17.457927Z qemu-system-x86_64: -blockdev {"driver":"file","filename":"/mnt/vms/vm-bootes.qcow2","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}: Не удалось открыть '/mnt/vms/vm-bootes.qcow2': Ошибка разрешения
Однако, если я передаю файл QCOW2 в ВМ напрямую без использования пула вот так:
машина загружается как положено, и все работает нормально.
Я не понимаю, почему QEMU обрабатывает изображение по-разному, если заднее хранилище настроено с использованием пула. Я также пытался изменить разрешения файла и владельца/группу thinpool с root
на libvirt-qemu
, но ничего не помогло.
Пожалуйста, объясните мне, почему машина не может прочитать файл QCOW2 при использовании пула и как обрабатываются разрешения в обоих случаях (прямой путь QCOW2 против использования пула). Пожалуйста, также помогите мне решить эту проблему при использовании пула.
Если это имеет значение, я использую последнюю стабильную ветку Debian:
cat /etc/debian_version
12.9
apt list --installed |grep 'libvirt\|qemu\|cockpit'
cockpit-bridge/stable,now 287.1-0+deb12u3 amd64 [Установлено,автоматически]
cockpit-machines/stable,now 288-1 all [установлено]
cockpit-networkmanager/stable,now 287.1-0+deb12u3 all [Установлено,автоматически]
cockpit-packagekit/stable,now 287.1-0+deb12u3 all [Установлено,автоматически]
cockpit-pcp/stable,now 287.1-0+deb12u3 amd64 [установлено]
cockpit-storaged/stable,now 287.1-0+deb12u3 all [установлено]
cockpit-system/stable,now 287.1-0+deb12u3 all [Установлено,автоматически]
cockpit-ws/stable,now 287.1-0+deb12u3 amd64 [Установлено,автоматически]
cockpit/stable,now 287.1-0+deb12u3 all [установлено]
gir1.2-libvirt-glib-1.0/stable,now 4.0.0-2 amd64 [Установлено,автоматически]
ipxe-qemu/stable,now 1.0.0+git-20190125.36a4c85-5.1 all [Установлено,автоматически]
libvirt-clients/stable,now 9.0.0-4+deb12u2 amd64 [установлено]
libvirt-daemon-config-network/stable,now 9.0.0-4+deb12u2 all [Установлено,автоматически]
libvirt-daemon-config-nwfilter/stable,now 9.0.0-4+deb12u2 all [Установлено,автоматически]
libvirt-daemon-driver-lxc/stable,now 9.0.0-4+deb12u2 amd64 [Установлено,автоматически]
libvirt-daemon-driver-qemu/stable,now 9.0.0-4+deb12u2 amd64 [Установлено,автоматически]
libvirt-daemon-driver-vbox/stable,now 9.0.0-4+deb12u2 amd64 [Установлено,автоматически]
libvirt-daemon-driver-xen/stable,now 9.0.0-4+deb12u2 amd64 [Установлено,автоматически]
libvirt-daemon-system-systemd/stable,now 9.0.0-4+deb12u2 all [Установлено,автоматически]
libvirt-daemon-system/stable,now 9.0.0-4+deb12u2 amd64 [установлено]
libvirt-daemon/stable,now 9.0.0-4+deb12u2 amd64 [Установлено,автоматически]
libvirt-dbus/stable,now 1.4.1-3 amd64 [Установлено,автоматически]
libvirt-glib-1.0-0/stable,now 4.0.0-2 amd64 [Установлено,автоматически]
libvirt-glib-1.0-data/stable,now 4.0.0-2 all [Установлено,автоматически]
libvirt-l10n/stable,now 9.0.0-4+deb12u2 all [Установлено,автоматически]
libvirt0/stable,now 9.0.0-4+deb12u2 amd64 [Установлено,автоматически]
python3-libvirt/stable,now 9.0.0-1 amd64 [Установлено,автоматически]
qemu-block-extra/stable,now 1:7.2+dfsg-7+deb12u12 amd64 [установлено]
qemu-system-common/stable,now 1:7.2+dfsg-7+deb12u12 amd64 [Установлено,автоматически]
qemu-system-data/stable,now 1:7.2+dfsg-7+deb12u12 all [Установлено,автоматически]
qemu-system-gui/stable,now 1:7.2+dfsg-7+deb12u12 amd64 [Установлено,автоматически]
qemu-system-x86/stable,now 1:7.2+dfsg-7+deb12u12 amd64 [Установлено,автоматически]
qemu-utils/stable,now 1:7.2+dfsg-7+deb12u12 amd64 [установлено]
Заранее спасибо!
Ответ или решение
Вопрос, связанный с QEMU и получением ошибки "разрешение отклонено" при использовании пулов хранения, является распространенной проблемой среди пользователей виртуализации на базе KVM/QEMU. Разрешение этой проблемы требует глубокого понимания управления разрешениями, настройки LVM и настройки пулов хранения в QEMU. Давайте разберем это более подробно, применив теорию, примеры и способы применения для устранения проблемы.
Теория
Основная проблема заключается в управлении разрешениями процессов, которые QEMU использует для доступа к файлам образов виртуальных машин. QEMU работает под определенным пользователем и группой, обычно это libvirt-qemu
, и эти процессы требуют соответствующих разрешений для доступа к файлам или устройствам, к которым они привязаны. В случае использования пулов хранения, задачи управления разрешениями усложняются, так как файл образа виртуальной машины помещается в файловую систему через абстракцию пула.
Пример
Из предоставленного описания вашей конфигурации видно, что у вас используется LVM для управления томами, и ваш пул хранения vms
настроен на использование каталога /mnt/vms
. Здесь присутствует сразу несколько потенциальных причин проблемы с доступом:
-
Разрешения файловой системы: Убедитесь, что директория
/mnt/vms
и все содержащиеся в ней файлы имеют правильные разрешения, позволяющие доступ пользователю и группеlibvirt-qemu
. -
SELinux/AppArmor: Если у вас активированы политики SELinux или AppArmor, они могут ограничивать доступ QEMU к файловой системе. Возможно, потребуется добавить исключения или изменить политику для разрешения доступа.
-
Настройки пула хранения: Возможно, при создании пула были неверно заданы разрешения или конфигурация. Файл конфигурации пула (
virsh pool-dumpxml vms
) включает права доступа, которые важно проверять и корректировать.
Применение
Чтобы решить вашу проблему с "Permission Denied", выполните следующие шаги:
-
Проверка разрешений:
- Убедитесь, что директория
/mnt/vms
принадлежит пользователю и группеlibvirt-qemu
:chown libvirt-qemu:libvirt-qemu /mnt/vms chmod 0755 /mnt/vms
- Проверьте, что файл образа
vm-bootes.qcow2
также имеет правильные разрешения:chown libvirt-qemu:libvirt-qemu /mnt/vms/vm-bootes.qcow2 chmod 0644 /mnt/vms/vm-bootes.qcow2
- Убедитесь, что директория
-
SELinux/AppArmor:
- Проверьте статус SELinux/AppArmor и убедитесь, что они не блокируют доступ. Как временное решение, можно попробовать отключить их и проверить, запускается ли система:
setenforce 0 # Для SELinux # Для AppArmor посмотрите, нет ли профилей, ограничивающих QEMU, и временно отключите
- Если проблема связана с политиками, настройте нужные разрешения или добавьте исключения.
- Проверьте статус SELinux/AppArmor и убедитесь, что они не блокируют доступ. Как временное решение, можно попробовать отключить их и проверить, запускается ли система:
-
Проверка конфигурации пула хранения:
- Проверьте, нет ли ошибок в конфигурации XML пула, особенно в разделе
<permissions>
. Важно, чтобыowner
иgroup
соответствовалиlibvirt-qemu
.
- Проверьте, нет ли ошибок в конфигурации XML пула, особенно в разделе
-
Логирование и Дополнительная диагностика:
- Проверьте системные журналы и журналы libvirt для получения дополнительных подсказок:
journalctl -xe grep libvirt /var/log/syslog
- Используйте инструменты отладки SELinux и AppArmor для анализа разрешений.
- Проверьте системные журналы и журналы libvirt для получения дополнительных подсказок:
В завершение, если после всех этих шагов проблема сохраняется, полезно заново создать пул хранения с корректными настройками доступов и прав, убедившись, что все изменения применены и протестированы. При необходимости можно обратиться за помощью на специализированные форумы и ресурсы, так как оформление проблемы и предпринятых мер значительно ускорит получение верного решения.