web-dev-qa-db-ja.com

AppArmorエラー:libvirt(1.2.12)の更新バージョンでlxcを起動した後、「無効なVM定義」

Libvirtdの新しいバージョンでLXCを起動しようとしていますが、次のエラーで起動に失敗します。

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

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

これは私のtestlxc.xmlファイルです

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

実行中のLibvirtバージョンは1.2.12です。以前はバージョン1.2.2でlxcを正常に実行していました。

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

virt-aa-helperユーティリティでドメインXML検証の問題を追跡しました。これは、オンデマンドでapparmorプロファイルを生成することになっているユーティリティです。失敗するのはXMLの構造ではありませんが、報告されたエラーはこれが事実であることを示しているようです。 LXCコンテナでは、domain_conf.cの関数virDomainDefParseXML関数内の論理的な検証が壊れています。

この共有領域を変更するためのlibvirtコードについて十分な知識がありません-他の何かを壊した可能性がありますが、次のパッチは機能しているようです:

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;

読む

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;

残念ながら、再コンパイルせずにこれを修正する方法を見つけることができませんでした。 64ビットマシンを使用している場合は、ローカルでビルドしたパッケージを this link (Microsoftアカウントをお許しください)からダウンロードできます。

:このバグの影響を受けているかどうかを確認するには、コマンドプロンプトに次のように入力します( このフォーラム投稿 からコピー) ):

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

fooは、失敗したlxcコンテナーの名前です。出力が表示される場合

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

それはおそらく同じバグです。

1
vhallac