не удалось запустить виртуальную машину с libvirt/qemu, доступ запрещён

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

Это мой первый вопрос, поэтому, если я могу сделать что-то лучше, пожалуйста, скажите мне.

Я не очень хорош в Linux, до сих пор я мог следовать инструкциям, и проблемы, с которыми я сталкивался, были простыми для решения с небольшим поиском, но теперь я застрял. У меня есть маленький домашний сервер на Debian Buster. На нем я запускаю несколько виртуальных машин с libvirt/qemu. Моя проблема связана со службой nextcloud:

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

sudo virsh start mydomain 
error: Не удалось запустить домен mydomain 
error: внутренняя ошибка: процесс завершился при подключении к монитору: 
qemu-system-x86_64: -realtime mlock=off: предупреждение: '-realtime mlock=...' устарело, используйте '-overcommit mem-lock=...' вместо этого 
2022-10-01T13:31:17.160445Z qemu-system-x86_64: -drive file=/path/to/mydomain.snapshot1.snapshot2,format=qcow2,if=none,id=drive-virtio-disk0: 
Не удалось открыть файл: Не удалось открыть '/path/to/mydomain.snapshot1': Отказано в доступе

Я создал внешний снимок, следуя этому руководству https://fabianlee.org/2021/01/10/kvm-creating-and-reverting-libvirt-external-snapshots/

Сначала я думал, что с виртуальной машиной что-то не так, поэтому я попытался вернуться к более старому снимку (у меня есть один всего за несколько часов до сбоя питания).

Согласно руководству, я использовал следующие шаги для возврата:

# исправить путь hda обратно к оригинальному qcow2 диску
virt-xml $thedomain --edit target=$targetdisk --disk path=$backingfile --update

# убедиться, что мы теперь указываем обратно на оригинальный qcow2 диск
virsh domblklist $thedomain

# удалить метаданные снимка
virsh snapshot-delete --metadata $thedomain $snapshotname

# удалить файл снимка qcow2
sudo rm $pooldir/$thedomain.$snapshotname

# запустить гостевой домен
virsh start $thedomain

Но после этого я все равно получаю те же ошибки, просто указывая на файл снимка. Также, когда я пытался запустить виртуальную машину, владелец и группа файла снимка изменились с “libvirt-qemu” на “root”.

Я попытался найти решение проблемы, но не нашел много информации. Ближе всего к теме я нашел Как настроить AppArmor, чтобы KVM мог запустить гостя, у которого есть цепочка файлов подложки

Так что это может быть связано с apparmor. Но я запутался, что изменилось после сбоя питания. Но в любом случае я пробовал предложенные решения из этих постов без эффекта.

Но также возможно, что что-то изменилось из-за обновления и это вступило в силу только после перезагрузки. До этого сервер работал достаточно хорошо и не выключался очень часто.

Извините за длинный текст.

Спасибо заранее за любую помощь.

Я нашел решение/обходной путь.

Я добавил путь, где хранятся образы моих виртуальных машин, в

/etc/apparmor.d/abstractions/libvirt-qemu

вот так

/path/to/my/files/* rwk,
/path/to/my/files/ rwk,

Теперь виртуальная машина снова запускается. Но я все еще не знаю, что вызвало проблему в первую очередь.

То, что возврат к старому снимку не сработал, связано с моим именованием снимков и неправильной интерпретацией через libvirt-aa-helper –> неправильными профилями apparmor и/или неправильной интерпретацией в .xml файлах виртуальных машин.

Когда у меня будет время, я углублюсь в это. Но на данный момент я рад, что все снова работает.

Ответ или решение

Когда ваша виртуальная машина (ВМ) на базе libvirt/qemu не запускается и вы видите сообщение об ошибке "permission denied", это может вызывать ряд вопросов, особенно если вы не так хорошо разбираетесь в системах Linux. В этом ответе мы подробно рассмотрим возможные причины данной проблемы, а также предложим меры по ее устранению.

Причины ошибки "permission denied"

1. Изменение прав доступа после сбоя питания

Как вы отметили, после отключения питания права доступа к файлам снимков (snapshots) изменились с пользователя libvirt-qemu на root. Это могло произойти из-за некорректного завершения работы процесса, что повлияло на права доступа к файловой системе.

2. Politika безопасности AppArmor

AppArmor может блокировать доступ к файлам, необходимым для запуска ВМ. Если правила AppArmor не позволяют вашему процессу доступа к определенным директориям или файлам, это приведет к ошибке "permission denied".

Решение проблемы

1. Восстановление прав доступа

Восстановите права доступа к файловым системам, где хранятся ваши снимки:

sudo chown libvirt-qemu:libvirt-qemu /path/to/mydomain.snapshot1
sudo chown libvirt-qemu:libvirt-qemu /path/to/mydomain.snapshot2

Убедитесь, что все соответствующие файлы и директории имеют правильные права доступа.

2. Конфигурация AppArmor

Как вы правильно заметили, добавление пути к вашим файлам в профиль AppArmor для libvirt-qemu может помочь устранить проблему. Вам нужно открыть файл:

sudo nano /etc/apparmor.d/abstractions/libvirt-qemu

И добавить соответствующие правила для доступа к вашим директориям:

/path/to/my/files/* rwk,

Это даст libvirt-qemu необходимые права для записи и чтения файлов.

3. Проверка конфигурации

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

Заключение

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

Если у вас будут дополнительные вопросы или потребуется дальнейшая помощь в сомнительных ситуациях, не стесняйтесь задавать их. Удачи в управлении вашими виртуальными машинами!

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

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