Вопрос или проблема
На сервере Ubuntu LTS 24.04 с виртуальной машиной QEMU, управляемой libvirt, я пытаюсь использовать запущенный извне virtiofsd, как задокументировано в документации libvirt, потому что мне нужно включить функции, такие как --posix-acl
, которые не поддерживаются конфигурацией virtiofsd в libvirt. Однако, какие бы права доступа, владельца и группу я ни назначил для сокета virtiofsd, моя виртуальная машина не может его использовать, всегда выдает ошибку “Permission Denied”:
$ virsh start my-vm
error: Failed to start domain 'my-vm'
error: internal error: process exited while connecting to monitor: 2025-02-07T02:00:44.288580Z qemu-system-x86_64: -chardev socket,id=chr-vu-fs0,path=/run/my-virtiofsd.sock: Failed to connect to '/run/my-virtiofsd.sock': Permission denied
Как я могу это исправить?
Если стандартные права доступа Unix не решают проблему с правами, возможно, виновата система песочницы вашего дистрибутива. Ubuntu использует AppArmor для изоляции процессов (RedHat использует SELinux), чтобы гарантировать доступ только к ожидаемым ресурсам. На Ubuntu LTS 24.04 это касается процессов qemu, запускаемых libvirt, и существует набор правил apparmor для различных компонентов libvirt, таких как qemu.
Убедитесь, что внешний сокет, который вы хотите использовать qemu, запущенный libvirt, разрешен в правилах AppArmor, создав файл в /etc/apparmor.d/abstractions/libvirt-qemu.d/
(возможно, создав эту конечную директорию, если она не существует) с содержимым:
/run/my-virtiofs.sock rw,
(запятая в конце важна)
Обновите соответственно путь к сокету, который вы использовали при запуске внешнего virtiofsd
и указали в XML-конфигурации виртуальной машины libvirt.
В зависимости от версии Ubuntu, которую вы используете, обратитесь к существующим конфигурациям AppArmor для libvirt, чтобы получить более подробную информацию о том, куда именно добавлять свои правила, например, /etc/apparmor.d/libvirt/TEMPLATE.qemu
, который ссылается на /etc/apparmor.d/abstractions/libvirt-qemu
. В моем случае, последнее включает директиву для использования дальнейших кастомизаций в /etc/apparmor.d/abstractions/libvirt-qemu.d/
, поэтому именно там я создал новое правило.
Ответ или решение
На Ubuntu LTS 24.04 сервере вы сталкиваетесь с проблемой «Permission Denied» при попытке использования внешне запущенного virtiofsd
с управляемой libvirt виртуальной машиной. Это препятствие связано с невозможностью виртуальной машины подключиться к сокету virtiofsd
, несмотря на различные попытки изменения разрешений, владельца и группы. Проблема требует отдельного подхода, учитывая использование AppArmor, системы контроля доступа, обеспечивающей безопасность процессов.
Теория
AppArmor является механизмом разграничения прав доступа, поддерживаемым Ubuntu, который контролирует доступ приложения к файлам и ресурсам. AppArmor используется для ограничения возможностей процесса в пределах определенного профиля безопасности, гарантируя, что он может получить доступ только к разрешенным ресурсам. В вашем случае qemu
, запускаемое libvirt, encapsulatesos AppArmor, который может блокировать доступ к созданному вами сокету.
Пример
Рассмотрим, как настроить AppArmor для предоставления qemu
доступа к вашему сокету. Ваша цель заключается в том, чтобы добавить политику, которая явно разрешает доступ qemu
к пути вашего сокета, чтобы избежать ошибки «Permission Denied». Структура AppArmor профилей и их использование могут варьироваться в зависимости от версии дистрибутива Ubuntu, однако они следуют общему принципу.
Для добавления правил AppArmor, выполните следующие действия:
-
Создайте файл с правилами безопасности.
Найдите или создайте каталог
/etc/apparmor.d/abstractions/libvirt-qemu.d/
(возможно, вам потребуется создать последний каталог, если его не существует). -
Напишите правило в файле.
Создайте файл с расширением
.d
, например,my-virtiofs.sock
в каталоге, с содержимым:/run/my-virtiofsd.sock rw,
Не забудьте, что запятая в конце правила важна для синтаксиса.
-
Перезапустите AppArmor и libvirt.
Перезапустите AppArmor для применения изменений и libvirt для перезагрузки конфигурации:
sudo systemctl restart apparmor sudo systemctl restart libvirtd
Применение
С этими изменениями, когда виртуальная машина будет запущена, qemu
должен иметь разрешение на доступ к вашему сокету благодаря обновленным правилам AppArmor. Проблема «Permission Denied» должна быть устранена, позволяя использовать ваш сокет для virtiofsd
с дополнительными параметрами, такими как --posix-acl
.
Кроме того, крайне важно убедиться, что ваш файл XML конфигурации виртуальной машины libvirt правильно настроен с новыми путями и параметрами. Проверьте соответствующие записи в файле XML, чтобы убедиться, что они указывают на правильный путь сокета и используйте все необходимые идентификаторы, такие как id=chr-vu-fs0
.
Дополнительные советы
-
Диагностика: Используйте
aa-status
для получения информации о загруженных AppArmor профилях и их состоянии. -
Логирование AppArmor: Активируйте логирование AppArmor, чтобы следить за тем, какие действия блокируются и под корнем каких ситуаций это происходит.
-
Обратная связь: Убедитесь, что любые изменения в AppArmor, не только позволяют необходимые действия, но и не ослабляют безопасность всей системы. Любые руки должны быть конкретными и минимальными.
Таким образом, внедряя решение с использованием AppArmor для управления доступом к ресурсам на уровне системного профиля, вы сможете надежно и безопасно организовать работу с внешне запускаемым virtiofsd
, максимально используя имеющиеся возможности UNIX-подобной платформы.