AppArmor-Fehler: „ungültige VM-Definition“ nach dem Starten von lxc auf einer aktualisierten Version von libvirt (1.2.12)

AppArmor-Fehler: „ungültige VM-Definition“ nach dem Starten von lxc auf einer aktualisierten Version von libvirt (1.2.12)

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 virDomainDefParseXMLin domain_conf.cist 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 fooist 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.

verwandte Informationen