Ich versuche, ein LXC auf einer neueren Version von libvirtd zu starten, aber der Start schlägt mit dem folgenden Fehler fehl:
$ virsh -c lxc: start textlxc
error: Failed to start domain testlxc
error: internal error: cannot load AppArmor profile 'libvirt-dfb2c573-05cb-4ca3-9e46-bea6cebf0f9f'
Fehlermeldung in/var/log/libvirt/libvirtd.log
2015-06-23 12:13:12.306+0000: 14141: error : virCommandWait:2532 : internal error: Child process (/usr/lib/libvirt/virt-aa-helper -p 0 -c -u libvirt-dfb2c573-05cb-4ca3-9e46-bea6cebf0f9f) unexpected exit status 1: virt-aa-helper: error: /proc/meminfo
virt-aa-helper: error: skipped restricted file
virt-aa-helper: error: invalid VM definition
2015-06-23 12:13:12.306+0000: 14141: error : AppArmorGenSecurityLabel:468 : internal error: cannot load AppArmor profile 'libvirt-dfb2c573-05cb-4ca3-9e46-bea6cebf0f9f'
Das ist meintestlxc.xmlDatei
<domain type='lxc'>
<name>testlxc</name>
<uuid>dfb2c573-05cb-4ca3-9e46-bea6cebf0f9f</uuid>
<memory unit='KiB'>4048292</memory>
<currentMemory unit='KiB'>4048292</currentMemory>
<vcpu placement='static'>2</vcpu>
<resource>
<partition>/machine</partition>
</resource>
<os>
<type arch='x86_64'>exe</type>
<init>/sbin/init</init>
</os>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/lib/libvirt/libvirt_lxc</emulator>
<filesystem type='mount' accessmode='passthrough'>
<source dir='/var/lib/libvirt/filesystems/testlxc'/>
<target dir='/'/>
</filesystem>
<filesystem type='mount' accessmode='passthrough'>
<source dir='/var/lib/libvirt/filesystems/testlxc-data'/>
<target dir='/mnt/data'/>
</filesystem>
<filesystem type='mount' accessmode='passthrough'>
<source dir='/var/run/testlxc/lxc'/>
<target dir='/mnt/run'/>
</filesystem>
<filesystem type='mount' accessmode='passthrough'>
<source dir='/proc/meminfo'/>
<target dir='/proc/meminfo'/>
</filesystem>
<console type='pty' tty='/dev/pts/1'>
<source path='/dev/pts/1'/>
<target type='lxc' port='0'/>
<alias name='console0'/>
</console>
</devices>
</domain>
Die laufende Libvirt-Version ist 1.2.12, ich habe lxc zuvor erfolgreich auf Version 1.2.2 ausgeführt.
$ libvirtd --version
libvirtd (libvirt) 1.2.12
Antwort1
Ich habe das Problem auf die Domänen-XML-Validierung im Dienstprogramm zurückgeführt virt-aa-helper
. Dies ist das Dienstprogramm, das bei Bedarf Apparmor-Profile generieren soll. Es ist nicht die Struktur des XML, die fehlschlägt, aber der gemeldete Fehler scheint darauf hinzudeuten, dass dies der Fall ist. Eine logische Validierung innerhalb der Funktion virDomainDefParseXML
in domain_conf.c
ist für LXC-Container defekt.
Ich bin mit dem Libvirt-Code nicht vertraut genug, um diesen gemeinsam genutzten Bereich zu ändern. Möglicherweise habe ich etwas anderes kaputt gemacht, aber der folgende Patch scheint zu funktionieren:
if (!(flags & VIR_DOMAIN_DEF_PARSE_SKIP_OSTYPE_CHECKS)) {
/* If the logic here seems fairly arbitrary, that's because it is :)
* This is duplicating how the code worked before
* CapabilitiesDomainDataLookup was added. We can simplify this,
* but it would take a bit of work because the test suite fails
* in numerous minor ways. */
bool use_virttype = ((def->os.arch == VIR_ARCH_NONE) ||
!def->os.machine);
virCapsDomainDataPtr capsdata = NULL;
lesen
if (!(flags & VIR_DOMAIN_DEF_PARSE_SKIP_OSTYPE_CHECKS)) {
/* If the logic here seems fairly arbitrary, that's because it is :)
* This is duplicating how the code worked before
* CapabilitiesDomainDataLookup was added. We can simplify this,
* but it would take a bit of work because the test suite fails
* in numerous minor ways. */
bool use_virttype = (def->os.type != VIR_DOMAIN_OS_TYPE_EXE) &&
((def->os.arch == VIR_ARCH_NONE) ||
!def->os.machine);
virCapsDomainDataPtr capsdata = NULL;
Leider konnte ich keine Möglichkeit finden, dies zu beheben, ohne es neu zu kompilieren. Wenn Sie eine 64-Bit-Maschine verwenden, können Sie Pakete, die ich lokal erstellt habe, von herunterladendieser Link(entschuldigen Sie mein Microsoft-Konto).
Notiz: Um festzustellen, ob Sie von diesem Fehler betroffen sind, geben Sie Folgendes in eine Eingabeaufforderung ein (kopiert vondieser Forumsbeitrag):
$ export VM=foo ; virsh -c lxc:// dumpxml $VM |\
sudo /usr/lib/libvirt/virt-aa-helper -c \
-u libvirt-`virsh -c lxc:// domuuid $VM`
Wo foo
ist der Name des lxc-Containers, der fehlschlägt. Wenn Sie die Ausgabe sehen
virt-aa-helper: error: could not parse XML
virt-aa-helper: error: could not get VM definition
dann ist es wahrscheinlich der gleiche Fehler.