Erro AppArmor: “definição de VM inválida” após iniciar o lxc na versão atualizada do libvirt (1.2.12)

Erro AppArmor: “definição de VM inválida” após iniciar o lxc na versão atualizada do libvirt (1.2.12)

Estou tentando iniciar um LXC em uma versão mais recente do libvirtd, mas ele não inicia com o seguinte erro:

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

Mensagem de erro em/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 é meutestelxc.xmlarquivo

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

A versão do Libvirt em execução é 1.2.12, eu estava executando o lxc com sucesso na versão 1.2.2 antes.

$ libvirtd --version
libvirtd (libvirt) 1.2.12

Responder1

Rastreei o problema na validação XML do domínio no virt-aa-helperutilitário. Este é o utilitário que deve gerar perfis de dispositivos sob demanda. Não é a estrutura do XML que falha, mas o erro relatado parece indicar que é esse o caso. Uma validação lógica dentro da função virDomainDefParseXMLfunction in domain_conf.cé interrompida para contêineres LXC.

Não estou familiarizado o suficiente com o código libvirt para modificar esta área compartilhada - posso ter quebrado alguma outra coisa, mas o seguinte patch 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;

ler

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;

Infelizmente, não consegui encontrar uma maneira de corrigir isso sem recompilar. Se você usar uma máquina de 64 bits, poderá baixar pacotes que construí localmente emesse link(desculpe minha conta da Microsoft).

Observação: para ver se você foi afetado por esse bug, digite o seguinte em um prompt de comando (copiado deesta postagem no fórum):

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

Onde fooestá o nome do contêiner lxc que falha. Se você ver a saída

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

então provavelmente é o mesmo bug.

informação relacionada