webentwicklung-frage-antwort-db.com.de

AppArmor-Fehler: "invalid VM definition" nach dem Start von lxc in der aktualisierten Version von libvirt (1.2.12)

Ich versuche, einen 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'

Dies ist meine testlxc.xml Datei

<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 Libvirt-Version ist 1.2.12. Ich hatte die LXC-Version 1.2.2 bereits erfolgreich ausgeführt.

$ libvirtd --version
libvirtd (libvirt) 1.2.12
4
Bilal Baqar

Ich habe das Problem bei der Domain-XML-Validierung im Hilfsprogramm virt-aa-helper Aufgespürt. Dies ist das Dienstprogramm, mit dem Apparmor-Profile bei Bedarf erstellt werden sollen. 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 fehlerhaft.

Ich kenne den libvirt-Code nicht gut genug, um diesen freigegebenen Bereich zu ändern. Möglicherweise habe ich etwas anderes beschädigt, 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 keinen Weg finden, dies ohne eine Neukompilierung zu beheben. Wenn Sie einen 64-Bit-Computer verwenden, können Sie Pakete herunterladen, die ich lokal über diesen Link (entschuldigen Sie mein Microsoft-Konto) erstellt habe.

Hinweis : Um festzustellen, ob Sie von diesem Fehler betroffen sind, geben Sie Folgendes in eine Eingabeaufforderung ein (kopiert von dieser Forumsbeitrag ):

$ export VM=foo ; virsh -c lxc:// dumpxml $VM |\
   Sudo /usr/lib/libvirt/virt-aa-helper -c \
   -u libvirt-`virsh -c lxc:// domuuid $VM`

Wobei foo der Name des fehlgeschlagenen lxc-Containers ist. 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.

1
vhallac