QEMU не удается с ошибкой отказа в доступе при использовании пулов хранилища.

Вопрос или проблема

У меня возникают проблемы с пониманием разрешений для изображений 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. Здесь присутствует сразу несколько потенциальных причин проблемы с доступом:

  1. Разрешения файловой системы: Убедитесь, что директория /mnt/vms и все содержащиеся в ней файлы имеют правильные разрешения, позволяющие доступ пользователю и группе libvirt-qemu.

  2. SELinux/AppArmor: Если у вас активированы политики SELinux или AppArmor, они могут ограничивать доступ QEMU к файловой системе. Возможно, потребуется добавить исключения или изменить политику для разрешения доступа.

  3. Настройки пула хранения: Возможно, при создании пула были неверно заданы разрешения или конфигурация. Файл конфигурации пула (virsh pool-dumpxml vms) включает права доступа, которые важно проверять и корректировать.

Применение

Чтобы решить вашу проблему с "Permission Denied", выполните следующие шаги:

  1. Проверка разрешений:

    • Убедитесь, что директория /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
  2. SELinux/AppArmor:

    • Проверьте статус SELinux/AppArmor и убедитесь, что они не блокируют доступ. Как временное решение, можно попробовать отключить их и проверить, запускается ли система:
      setenforce 0  # Для SELinux
      # Для AppArmor посмотрите, нет ли профилей, ограничивающих QEMU, и временно отключите
    • Если проблема связана с политиками, настройте нужные разрешения или добавьте исключения.
  3. Проверка конфигурации пула хранения:

    • Проверьте, нет ли ошибок в конфигурации XML пула, особенно в разделе <permissions>. Важно, чтобы owner и group соответствовали libvirt-qemu.
  4. Логирование и Дополнительная диагностика:

    • Проверьте системные журналы и журналы libvirt для получения дополнительных подсказок:
      journalctl -xe
      grep libvirt /var/log/syslog
    • Используйте инструменты отладки SELinux и AppArmor для анализа разрешений.

В завершение, если после всех этих шагов проблема сохраняется, полезно заново создать пул хранения с корректными настройками доступов и прав, убедившись, что все изменения применены и протестированы. При необходимости можно обратиться за помощью на специализированные форумы и ресурсы, так как оформление проблемы и предпринятых мер значительно ускорит получение верного решения.

Оцените материал
Добавить комментарий

Капча загружается...