Error de AppArmor: "definición de VM no válida" después de iniciar lxc en la versión actualizada de libvirt (1.2.12)

Error de AppArmor: "definición de VM no válida" después de iniciar lxc en la versión actualizada de libvirt (1.2.12)

Estoy intentando iniciar un LXC en una versión más nueva de libvirtd pero no puedo iniciar con el siguiente error:

$ virsh -c lxc: start textlxc
error: Failed to start domain testlxc
error: internal error: cannot load AppArmor profile 'libvirt-dfb2c573-05cb-4ca3-9e46-bea6cebf0f9f'

Mensaje de error en/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'

Este es mipruebalxc.xmlarchivo

<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>

La versión de Libvirt en ejecución es 1.2.12, había estado ejecutando lxc con éxito en la versión 1.2.2 antes.

$ libvirtd --version
libvirtd (libvirt) 1.2.12

Respuesta1

He localizado el problema en la validación XML del dominio en virt-aa-helperla utilidad. Esta es la utilidad que se supone genera perfiles de aplicaciones a pedido. No es la estructura del XML lo que falla, pero el error reportado parece indicar que ese es el caso. Una validación lógica dentro de la función virDomainDefParseXMLfunction domain_conf.cestá rota para los contenedores LXC.

No estoy lo suficientemente familiarizado con el código libvirt para modificar esta área compartida; es posible que haya roto algo más, pero el siguiente parche parece funcionar:

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;

leer

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;

Desafortunadamente, no pude encontrar una manera de solucionar este problema sin volver a compilar. Si usa una máquina de 64 bits, puede descargar los paquetes que he creado localmente desdeeste enlace(disculpe mi cuenta de Microsoft).

Nota: Para ver si este error lo afecta, ingrese lo siguiente en el símbolo del sistema (copiado deesta publicación en el foro):

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

¿Dónde fooestá el nombre del contenedor lxc que falla? Si ves la salida

virt-aa-helper: error: could not parse XML
virt-aa-helper: error: could not get VM definition

entonces probablemente sea el mismo error.

información relacionada