web-dev-qa-db-ja.com

KVMがバッキングファイルチェーンを持つゲストを起動できるようにAppArmorを設定する方法

私は、Ubuntu 16.04でKVM(非常に高速であるため!)にQemu外部スナップショットを使用して遊んでおり、次のように設定しています。

  • VMのすべてのファイルは、(ゲストにちなんで名付けられた)単一のディレクトリ内にあります。
  • 常に上部の「ヘッド」qcow2イメージを指すhead.qcow2シンボリックリンクがあります。このように、VM config。(virsh edit)を更新し続ける必要はありません。
  • 元/下の画像は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を指している場合、またはスクリプトonceを実行する場合に正常に機能するため、バッキングファイルは1つしかありません。ただし、バッキングファイルのチェーンがある場合(たとえば、バッキングファイルにもバッキングファイルがある場合)、次のエラーが発生します。

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コミットを使用してそれらをマージしたりして、1つまたは2つの画像に移動するとすぐにゲストが起動します。

「開くことができませんでした」という権限エラーのように見えたので、権限を777に設定しても同じエラーメッセージが表示されるので、権限の問題ではありません。

何をする必要がありますか?

4
Programster

再びAppArmorに関連しているようです(私は 同様の問題 を数年前にUbuntu 14.04で忘れていました)。私はそれを機能させることができました:

Apparmor-utilsのインストール

Sudo apt-get install apparmor-utils

次に、最新のsyslogで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

次に、ゲストを起動します。

これは、ゲストごとに個別に実行しなければならない場合、回避策のように思えるかもしれません。誰かがより良い解決策を提供してくれれば幸いです。

4
Programster

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」でapparmor監査メッセージを追跡し、不足している権限に応じて同様のメッセージを取得できます。

[ 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
0
Darth