KVM이 백업 파일 체인을 사용하여 게스트를 부팅할 수 있도록 AppArmor를 구성하는 방법

KVM이 백업 파일 체인을 사용하여 게스트를 부팅할 수 있도록 AppArmor를 구성하는 방법

다음 설정을 사용하여 Ubuntu 16.04에서 KVM용 Qemu 외부 스냅샷을 사용하려고 합니다(너무 빠르기 때문입니다!).

  • VM의 모든 파일은 단일 디렉터리(게스트 이름을 따서 명명됨)에 있습니다.
  • head.qcow2항상 최상위 "헤드" qcow2 이미지를 가리키는 심볼릭 링크 가 있습니다 . 이렇게 하면 VM 구성을 지속적으로 업데이트할 필요가 없습니다. (Versh에 의해 편집됨).
  • 원본/하단 이미지가 호출됩니다.base.qcow2

다음 스크립트를 사용하여 스냅샷을 찍습니다(새 qcow2 이미지를 생성하고 이를 헤드로 설정합니다). 이 스크립트는 게스트가 실행되고 있지 않을 때만 실행됩니다.

#!/bin/bash
UNIX_TIMESTAMP=$(date +%s)
CURRENT_BACKING_FILE=`readlink head.qcow2`
NEW_HEAD_FILE="`pwd`/`echo $UNIX_TIMESTAMP`.qcow2"

# Create the new "head" disk image where all future changes are made.
sudo qemu-img create \
  -f qcow2 \
  -b $CURRENT_BACKING_FILE \
  $NEW_HEAD_FILE

# Update the symlink
rm head.qcow2
ln -s $NEW_HEAD_FILE head.qcow2

head.qcow2가 base.qcow2를 가리키거나 스크립트를 실행할 때 제대로 작동합니다.한 번따라서 백업 파일은 하나뿐입니다. 그러나 일련의 백업 파일(예: 백업 파일도 포함하는 백업 파일)이 있는 경우 다음 오류가 발생합니다.

error: Failed to start domain template-ubuntu-docker2
error: internal error: early end of file from monitor, possible problem: 2018-04-05T19:04:55.597373Z qemu-system-x86_64: -drive file=/media/ssd_storage2/kvm/vms/templates/template-ubuntu-docker2/head.qcow2,format=qcow2,if=none,id=drive-virtio-disk0: Could not open backing file: Could not open backing file: Could not open '/media/ssd_storage2/kvm/vms/templates/template-ubuntu-docker2/base.qcow2': Permission denied

출력은 qemu-img --backing-chain head.qcow2다음과 같습니다

image: head.qcow2
file format: qcow2
virtual size: 20G (21474836480 bytes)
disk size: 196K
cluster_size: 65536
backing file: /media/ssd_storage2/kvm/vms/templates/template-ubuntu-docker2/1522954330.qcow2
Format specific information:
    compat: 1.1
    lazy refcounts: false
    refcount bits: 16
    corrupt: false

image: /media/ssd_storage2/kvm/vms/templates/template-ubuntu-docker2/1522954330.qcow2
file format: qcow2
virtual size: 20G (21474836480 bytes)
disk size: 4.1M
cluster_size: 65536
backing file: base.qcow2 (actual path: /media/ssd_storage2/kvm/vms/templates/template-ubuntu-docker2/base.qcow2)
Format specific information:
    compat: 1.1
    lazy refcounts: false
    refcount bits: 16
    corrupt: false

image: /media/ssd_storage2/kvm/vms/templates/template-ubuntu-docker2/base.qcow2
file format: qcow2
virtual size: 20G (21474836480 bytes)
disk size: 8.8G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: true
    refcount bits: 16
    corrupt: false

이미지를 삭제하거나 qemu-img commit을 사용하여 병합을 시도했는데 이미지가 한두 개만 남으면 게스트가 시작됩니다.

"열 수 없음" 권한 오류처럼 보이므로 권한을 777로 설정하려고 시도했지만 여전히 동일한 오류 메시지가 표시되므로 권한 문제가 아니어야 합니다.

내가 무엇을해야 하나?

답변1

또 AppArmor와 관련이 있는 것 같습니다.유제몇 년 전 Ubuntu 14.04에서는 잊어버렸습니다.) 다음을 통해 작동시킬 수 있었습니다.

apparmor-utils 설치

sudo apt-get install apparmor-utils

그런 다음 최신 시스템 로그에서 libvirt ID를 찾으십시오.

sudo cat /var/log/syslog | grep "apparmor" | grep "DENIED" | grep libvirt-

그런 다음 해당 ID와 전체 경로를 사용하여 "불만 모드"로 설정합니다.

sudo aa-complain \
/etc/apparmor.d/libvirt/libvirt-b0cd5bdf-6dfc-4f75-bc0f-e38adff1cdd2

그런 다음 손님을 시작하십시오.

각 게스트에 대해 개별적으로 이 작업을 수행해야 한다면 기껏해야 해결 방법처럼 느껴지고 짜증스러울 것입니다. 누군가가 더 나은 솔루션을 제공하면 더 기쁠 것입니다.

답변2

Debian Buster에서 동일한 문제가 발생하면 libvirt apparmor 구성 파일이 /etc/apparmor.d/libvirt/에 동적으로 생성되고 저장됩니다(@Programster에게 감사드립니다). 이 디렉터리에서 다음과 유사한 TEMPLATE.qemu를 찾아야 합니다.

#
# This profile is for the domain whose UUID matches this file.
#

#include <tunables/global>

profile LIBVIRT_TEMPLATE flags=(attach_disconnected) {
  #include <abstractions/libvirt-qemu>
}

구성 파일에 qcow2가 저장된 디렉터리에 대한 규칙을 추가해야 합니다.

#
# This profile is for the domain whose UUID matches this file.
#

#include <tunables/global>

profile LIBVIRT_TEMPLATE flags=(attach_disconnected) {
  #include <abstractions/libvirt-qemu>
  /media/ssd_storage2/kvm/vms/templates/template-ubuntu-docker2/**.qcow2 rk,
}

"r"은 읽기 권한을 의미하고 "k"는 잠금 권한을 의미합니다.

"dmesg -w"를 사용하여 의류 감사 메시지를 추적하고 누락된 권한을 기반으로 유사한 메시지를 얻을 수 있습니다.

[ 4404.140981] audit: type=1400 audit(1566342100.488:254): apparmor="DENIED" operation="open" profile="libvirt-b24e7663-d71a-4970-9d6c-711d43629135" name="/home/libvirt/0.0.6-dev.19+20~811d1dc983b5.qcow2" pid=22384 comm="qemu-system-x86" requested_mask="r" denied_mask="r" fsuid=64055 ouid=64055
...
[ 4652.827860] audit: type=1400 audit(1566342349.172:263): apparmor="DENIED" operation="file_lock" profile="libvirt-b24e7663-d71a-4970-9d6c-711d43629135" name="/home/libvirt/0.0.6-dev.19+20~811d1dc983b5.qcow2" pid=23085 comm="qemu-system-x86" requested_mask="k" denied_mask="k" fsuid=64055 ouid=64055

관련 정보