Вопрос или проблема
Это мой первый вопрос, поэтому, если я могу сделать что-то лучше, пожалуйста, скажите мне.
Я не очень хорош в 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. Возможно, проблема была вызвана неправильной настройкой или ненадлежащим завершением задач после отключения питания. Рекомендуется регулярно проверять права доступа и контролировать изменения в системных политик безопасности, чтобы избежать подобных инцидентов в будущем.
Если у вас будут дополнительные вопросы или потребуется дальнейшая помощь в сомнительных ситуациях, не стесняйтесь задавать их. Удачи в управлении вашими виртуальными машинами!