# 虚拟机配置

<!-- TOC -->
-   [虚拟机配置](#虚拟机配置)
    -   [总体介绍](#总体介绍)
    -   [虚拟机描述](#虚拟机描述)
    -   [虚拟CPU和虚拟内存](#虚拟CPU和虚拟内存)
    -   [配置虚拟设备](#配置虚拟设备)
        -   [存储设备](#存储设备)
        -   [网络设备](#网络设备)
        -   [总线配置](#总线配置)
        -   [其它常用设备](#其它常用设备)
    -   [体系架构相关配置](#体系架构相关配置)
    -   [其他常见配置项](#其他常见配置项)
    -   [XML配置文件示例](#XML配置文件示例)

<!-- /TOC -->



## 总体介绍

#### 概述

Libvirt工具采用XML格式的文件描述一个虚拟机特征，包括虚拟机名称、CPU、内存、磁盘、网卡、鼠标、键盘等信息。用户可以通过修改配置文件，对虚拟机进行管理。本章介绍XML配置文件各个元素的含义，指导用户完成虚拟机配置。

#### 基本格式

虚拟机XML配置文件以domain为根元素，domain根元素中包含多个其他元素。XML配置文件中的部分元素可以包含对应属性和属性值，用以详细地描述虚拟机信息，同一元素的不同属性使用空格分开。

XML配置文件的基本格式如下，其中label代表具体标签名，attribute代表属性，value代表属性值，需要根据实际情况修改。

```
<domain type='kvm'>
    <name>VMName</name>
    <memory attribute='value'>8</memory>
    <vcpu>4</vcpu>
    <os>
       <label attribute='value' attribute='value'>
         ...
       </label>
    </os>
    <label attribute='value' attribute='value'>
      ...
    </label>  
</domain>
```

#### 配置流程

1.  创建一个根元素为domain的XML配置文件。
2.  使用标签name，根据命名规则指定唯一的虚拟机名称。
3.  配置虚拟CPU和虚拟内存等系统资源。
4.  配置虚拟设备。
    1.  配置存储设备。
    2.  配置网络设备。
    3.  配置外部总线结构。
    4.  配置鼠标等外部设备。

5.  保存XML配置文件。

## 虚拟机描述

#### 概述

本节介绍虚拟机domain根元素和虚拟机名称的配置。

#### 元素介绍

-   domain：虚拟机XML配置文件的根元素，用于配置运行此虚拟机的hypervisor的类型。

    属性type：虚拟化中domain的类型。openEuler虚拟化中属性值为kvm。

-   name：虚拟机名称。

    虚拟机名称为一个字符串，同一个主机上的虚拟机名称不能重复，虚拟机名称必须由数字、字母、“\_”、“－”、“:”组成，但不支持全数字的字符串，且虚拟机名称不超过64个字符。


#### 配置示例

例如，虚拟机名称为openEuler的配置如下：

```
<domain type='kvm'>
    <name>openEuler</name>
    ...
</domain>
```

## 虚拟CPU和虚拟内存

#### 概述

本节介绍虚拟CPU和虚拟内存的常用配置。

#### 元素介绍

-   vcpu：虚拟处理器的个数。
-   memory：虚拟内存的大小。

    属性unit：指定内存单位，属性值支持KiB（2<sup>10</sup>  字节），MiB（2<sup>20</sup>  字节），GiB（2<sup>30</sup>  字节），TiB（2<sup>40</sup>  字节）等。

-   cpu：虚拟处理器模式。

    属性mode：表示虚拟CPU的模式，属性值host-passthrough表示虚拟CPU的架构和特性与主机保持一致。

    子元素topology：元素cpu的子元素，用于描述虚拟CPU模式的拓扑结构。

    -   子元素topology的属性socket、cores、threads分别描述了虚拟机具有多少个cpu socket，每个cpu socket中包含多少个处理核心（core），每个处理器核心具有多少个超线程（thread），属性值为正整数且三者的乘积等于虚拟CPU的个数。


#### 配置示例

例如，虚拟CPU个数为4，处理模式为host-passthrough，虚拟内存为8GiB，4个CPU分布在两个CPU socket中，且不支持超线程的配置如下：

```
<domain type='kvm'>
    ...
    <vcpu>4</vcpu>
    <memory unit='GiB'>8</memory>
    <cpu mode='host-passthrough'>
        <topology sockets='2' cores='2' threads='1'/>
    </cpu>
...
</domain>
```

## 配置虚拟设备

虚拟机XML配置文件使用devices元素配置虚拟设备，包括存储设备、网络设备、总线、鼠标等，本节介绍常用的虚拟设备如何配置。
### 存储设备

#### 概述

XML配置文件可以配置虚拟存储设备信息，包括软盘、磁盘、光盘等存储介质及其存储类型等信息，本节介绍存储设备的配置方法。

#### 元素介绍

XML配置文件使用disk元素配置存储设备，disk常见的属性如[表1](#table14200183410353)所示，常见子元素及子元素属性如[表2](#table4866134925114)所示。

**表 1**  元素disk的常用属性

<a name="table14200183410353"></a>
<table><thead align="left"><tr id="row720143463519"><th class="cellrowborder" valign="top" width="7.5200000000000005%" id="mcps1.2.5.1.1"><p id="p559231514916"><a name="p559231514916"></a><a name="p559231514916"></a>元素</p>
</th>
<th class="cellrowborder" valign="top" width="11.39%" id="mcps1.2.5.1.2"><p id="p92021634133518"><a name="p92021634133518"></a><a name="p92021634133518"></a>属性</p>
</th>
<th class="cellrowborder" valign="top" width="21.69%" id="mcps1.2.5.1.3"><p id="p42026341354"><a name="p42026341354"></a><a name="p42026341354"></a>含义</p>
</th>
<th class="cellrowborder" valign="top" width="59.4%" id="mcps1.2.5.1.4"><p id="p12202193443516"><a name="p12202193443516"></a><a name="p12202193443516"></a>属性值及其含义</p>
</th>
</tr>
</thead>
<tbody><tr id="row1820215342359"><td class="cellrowborder" rowspan="2" valign="top" width="7.5200000000000005%" headers="mcps1.2.5.1.1 "><p id="p742912318910"><a name="p742912318910"></a><a name="p742912318910"></a>disk</p>
</td>
<td class="cellrowborder" valign="top" width="11.39%" headers="mcps1.2.5.1.2 "><p id="p3202103453512"><a name="p3202103453512"></a><a name="p3202103453512"></a>type</p>
</td>
<td class="cellrowborder" valign="top" width="21.69%" headers="mcps1.2.5.1.3 "><p id="p1920223493510"><a name="p1920223493510"></a><a name="p1920223493510"></a>指定后端存储介质类型</p>
</td>
<td class="cellrowborder" valign="top" width="59.4%" headers="mcps1.2.5.1.4 "><p id="p1437102115361"><a name="p1437102115361"></a><a name="p1437102115361"></a>block：块设备</p>
<p id="p8202113415351"><a name="p8202113415351"></a><a name="p8202113415351"></a>file：文件设备</p>
<p id="p13953102263316"><a name="p13953102263316"></a><a name="p13953102263316"></a>dir: 目录路径</p>
</td>
</tr>
<tr id="row142028345356"><td class="cellrowborder" valign="top" headers="mcps1.2.5.1.1 "><p id="p52031734143515"><a name="p52031734143515"></a><a name="p52031734143515"></a>device</p>
</td>
<td class="cellrowborder" valign="top" headers="mcps1.2.5.1.2 "><p id="p120313453518"><a name="p120313453518"></a><a name="p120313453518"></a>指定呈现给虚拟机的存储介质</p>
</td>
<td class="cellrowborder" valign="top" headers="mcps1.2.5.1.3 "><p id="p18259554183415"><a name="p18259554183415"></a><a name="p18259554183415"></a>disk：磁盘（默认）</p>
<p id="p15491211123817"><a name="p15491211123817"></a><a name="p15491211123817"></a>floppy：软盘</p>
<p id="p720343433510"><a name="p720343433510"></a><a name="p720343433510"></a>cdrom：光盘</p>
</td>
</tr>
</tbody>
</table>

**表 2**  元素disk的常用子元素及属性说明

<a name="table4866134925114"></a>
<table><thead align="left"><tr id="row5867349175120"><th class="cellrowborder" valign="top" width="13.3%" id="mcps1.2.4.1.1"><p id="p1532019194524"><a name="p1532019194524"></a><a name="p1532019194524"></a>子元素</p>
</th>
<th class="cellrowborder" valign="top" width="21.42%" id="mcps1.2.4.1.2"><p id="p44946337529"><a name="p44946337529"></a><a name="p44946337529"></a>子元素含义</p>
</th>
<th class="cellrowborder" valign="top" width="65.28%" id="mcps1.2.4.1.3"><p id="p19867184935114"><a name="p19867184935114"></a><a name="p19867184935114"></a>属性说明</p>
</th>
</tr>
</thead>
<tbody><tr id="row186719494512"><td class="cellrowborder" valign="top" width="13.3%" headers="mcps1.2.4.1.1 "><p id="p186719490514"><a name="p186719490514"></a><a name="p186719490514"></a>source</p>
</td>
<td class="cellrowborder" valign="top" width="21.42%" headers="mcps1.2.4.1.2 "><p id="p466752217444"><a name="p466752217444"></a><a name="p466752217444"></a>指定后端存储介质，与disk元素的属性“type”指定类型相对应</p>
</td>
<td class="cellrowborder" valign="top" width="65.28%" headers="mcps1.2.4.1.3 "><p id="p5608740181019"><a name="p5608740181019"></a><a name="p5608740181019"></a>file：对应file类型，值为对应文件的完全限定路径。</p>
<p id="p164275439106"><a name="p164275439106"></a><a name="p164275439106"></a>dev：对应block类型，值为对应主机设备的完全限定路径。</p>
<p id="p15881242194919"><a name="p15881242194919"></a><a name="p15881242194919"></a>dir：对应dir类型，值为用作磁盘目录的完全限定路径。</p>
</td>
</tr>
<tr id="row34652194612"><td class="cellrowborder" valign="top" width="13.3%" headers="mcps1.2.4.1.1 "><p id="p184654191365"><a name="p184654191365"></a><a name="p184654191365"></a>driver</p>
</td>
<td class="cellrowborder" valign="top" width="21.42%" headers="mcps1.2.4.1.2 "><p id="p114659199618"><a name="p114659199618"></a><a name="p114659199618"></a>指定后端驱动的详细信息</p>
</td>
<td class="cellrowborder" valign="top" width="65.28%" headers="mcps1.2.4.1.3 "><p id="p114651719267"><a name="p114651719267"></a><a name="p114651719267"></a>type：磁盘格式的类型，常用的有“raw”和“qcow2”，需要与source的格式一致。</p>
<p id="p17729162795"><a name="p17729162795"></a><a name="p17729162795"></a>io：磁盘IO模式，支持“native”和“threads”选项。</p>
<p id="p14680718191016"><a name="p14680718191016"></a><a name="p14680718191016"></a>cache：磁盘的cache模式，可选项有“none”、“writethrough”、“writeback”、“directsync”等。</p>
<p id="p17896143411122"><a name="p17896143411122"></a><a name="p17896143411122"></a>iothread：指定为磁盘分配的IO线程。</p>
</td>
</tr>
<tr id="row08679492515"><td class="cellrowborder" valign="top" width="13.3%" headers="mcps1.2.4.1.1 "><p id="p188671349195119"><a name="p188671349195119"></a><a name="p188671349195119"></a>target</p>
</td>
<td class="cellrowborder" valign="top" width="21.42%" headers="mcps1.2.4.1.2 "><p id="p144948333527"><a name="p144948333527"></a><a name="p144948333527"></a>指磁盘呈现给虚拟机的总线和设备</p>
</td>
<td class="cellrowborder" valign="top" width="65.28%" headers="mcps1.2.4.1.3 "><p id="p158671649195117"><a name="p158671649195117"></a><a name="p158671649195117"></a>dev：指定磁盘的逻辑设备名称，如SCSI、SATA、USB类型总线常用命令习惯为sd[a-p]，IDE类型设备磁盘常用命名习惯为hd[a-d]。</p>
<p id="p7960169114"><a name="p7960169114"></a><a name="p7960169114"></a>bus：指定磁盘设备的类型，常见的有“scsi”、“usb”、“sata”、“virtio”等类型。</p>
</td>
</tr>
<tr id="row386764955116"><td class="cellrowborder" valign="top" width="13.3%" headers="mcps1.2.4.1.1 "><p id="p19867049125114"><a name="p19867049125114"></a><a name="p19867049125114"></a>boot</p>
</td>
<td class="cellrowborder" valign="top" width="21.42%" headers="mcps1.2.4.1.2 "><p id="p2313201420517"><a name="p2313201420517"></a><a name="p2313201420517"></a>表示此磁盘可以作为启动盘使用</p>
</td>
<td class="cellrowborder" valign="top" width="65.28%" headers="mcps1.2.4.1.3 "><p id="p11867149165120"><a name="p11867149165120"></a><a name="p11867149165120"></a>order：指定磁盘的启动顺序。</p>
</td>
</tr>
<tr id="row18868164965114"><td class="cellrowborder" valign="top" width="13.3%" headers="mcps1.2.4.1.1 "><p id="p486814495519"><a name="p486814495519"></a><a name="p486814495519"></a>readonly</p>
</td>
<td class="cellrowborder" valign="top" width="21.42%" headers="mcps1.2.4.1.2 "><p id="p184942033175213"><a name="p184942033175213"></a><a name="p184942033175213"></a>表示磁盘具有只读属性，磁盘内容不可以被虚拟机修改，通常与光驱结合使用</p>
</td>
<td class="cellrowborder" valign="top" width="65.28%" headers="mcps1.2.4.1.3 "><p id="p98681249135119"><a name="p98681249135119"></a><a name="p98681249135119"></a>-</p>
</td>
</tr>
</tbody>
</table>

#### 配置示例

按照“准备虚拟机镜像”操作完成虚拟机镜像准备后，可以使用如下XML配置文件示例，为虚拟机配置虚拟磁盘。

例如，该示例为虚拟机配置了两个IO线程，一个块磁盘设备和一个光盘设备，第一个IO线程分配给块磁盘设备使用。该块磁盘设备的后端介质为qcow2格式，且被作为优先启动盘。

```
<domain type='kvm'>
    ...
    <iothreads>2</iothreads>
    <devices>
        <disk type='file' device='disk'>
	    <driver name='qemu' type='qcow2' cache='none' io='native' iothread="1"/>
	    <source file='/mnt/openEuler-image.qcow2'/>
	    <target dev='vda' bus='virtio'/>
	    <boot order='1'/>
	</disk>
	<disk type='file' device='cdrom'>
	    <driver name='qemu' type='raw' cache='none' io='native'/>
	    <source file='/mnt/openEuler-20.03-LTS-aarch64-dvd.iso'/>
	    <target dev='sdb' bus='scsi'/>
	    <readonly/>
	    <boot order='2'/>
	</disk>
         ...
    </devices>
</domain>
```

### 网络设备

#### 概述

XML配置文件可以配置虚拟网络设备，包括ethernet模式、bridge模式、vhostuser模式等，本节介绍虚拟网卡设备的配置方法。

#### 元素介绍

XML配置文件中使用元素“interface”，其属性“type”表示虚拟网卡的模式，可选的值有“ethernet”、“bridge”、“vhostuser”等，下面以“bridge”模式虚拟网卡为例介绍其子元素以及对应的属性。

**表 3**  bridge模式虚拟网卡常用子元素

<a name="table4866134925114"></a>
<table><thead align="left"><tr id="row5867349175120"><th class="cellrowborder" valign="top" width="13.3%" id="mcps1.2.4.1.1"><p id="p1532019194524"><a name="p1532019194524"></a><a name="p1532019194524"></a>子元素</p>
</th>
<th class="cellrowborder" valign="top" width="21.42%" id="mcps1.2.4.1.2"><p id="p44946337529"><a name="p44946337529"></a><a name="p44946337529"></a>子元素含义</p>
</th>
<th class="cellrowborder" valign="top" width="65.28%" id="mcps1.2.4.1.3"><p id="p19867184935114"><a name="p19867184935114"></a><a name="p19867184935114"></a>属性及含义</p>
</th>
</tr>
</thead>
<tbody><tr id="row186719494512"><td class="cellrowborder" valign="top" width="13.3%" headers="mcps1.2.4.1.1 "><p id="p1389163520221"><a name="p1389163520221"></a><a name="p1389163520221"></a>mac</p>
</td>
<td class="cellrowborder" valign="top" width="21.42%" headers="mcps1.2.4.1.2 "><p id="p466752217444"><a name="p466752217444"></a><a name="p466752217444"></a>虚拟网卡的mac地址</p>
</td>
<td class="cellrowborder" valign="top" width="65.28%" headers="mcps1.2.4.1.3 "><p id="p5608740181019"><a name="p5608740181019"></a><a name="p5608740181019"></a>address：指定mac地址，若不配置，会自动生成。</p>
</td>
</tr>
<tr id="row08679492515"><td class="cellrowborder" valign="top" width="13.3%" headers="mcps1.2.4.1.1 "><p id="p188671349195119"><a name="p188671349195119"></a><a name="p188671349195119"></a>target</p>
</td>
<td class="cellrowborder" valign="top" width="21.42%" headers="mcps1.2.4.1.2 "><p id="p144948333527"><a name="p144948333527"></a><a name="p144948333527"></a>后端虚拟网卡名</p>
</td>
<td class="cellrowborder" valign="top" width="65.28%" headers="mcps1.2.4.1.3 "><p id="p158671649195117"><a name="p158671649195117"></a><a name="p158671649195117"></a>dev：创建的后端tap设备的名称。</p>
</td>
</tr>
<tr id="row11249184413266"><td class="cellrowborder" valign="top" width="13.3%" headers="mcps1.2.4.1.1 "><p id="p14250184410269"><a name="p14250184410269"></a><a name="p14250184410269"></a>source</p>
</td>
<td class="cellrowborder" valign="top" width="21.42%" headers="mcps1.2.4.1.2 "><p id="p925004411264"><a name="p925004411264"></a><a name="p925004411264"></a>指定虚拟网卡后端</p>
</td>
<td class="cellrowborder" valign="top" width="65.28%" headers="mcps1.2.4.1.3 "><p id="p225044417263"><a name="p225044417263"></a><a name="p225044417263"></a>bridge：与bridge模式联合使用，值为网桥名称。</p>
</td>
</tr>
<tr id="row386764955116"><td class="cellrowborder" valign="top" width="13.3%" headers="mcps1.2.4.1.1 "><p id="p19867049125114"><a name="p19867049125114"></a><a name="p19867049125114"></a>boot</p>
</td>
<td class="cellrowborder" valign="top" width="21.42%" headers="mcps1.2.4.1.2 "><p id="p2313201420517"><a name="p2313201420517"></a><a name="p2313201420517"></a>表示此网卡可以作为远程启动</p>
</td>
<td class="cellrowborder" valign="top" width="65.28%" headers="mcps1.2.4.1.3 "><p id="p11867149165120"><a name="p11867149165120"></a><a name="p11867149165120"></a>order：指定网卡的启动顺序。</p>
</td>
</tr>
<tr id="row18868164965114"><td class="cellrowborder" valign="top" width="13.3%" headers="mcps1.2.4.1.1 "><p id="p486814495519"><a name="p486814495519"></a><a name="p486814495519"></a>model</p>
</td>
<td class="cellrowborder" valign="top" width="21.42%" headers="mcps1.2.4.1.2 "><p id="p184942033175213"><a name="p184942033175213"></a><a name="p184942033175213"></a>表示虚拟网卡的类型</p>
</td>
<td class="cellrowborder" valign="top" width="65.28%" headers="mcps1.2.4.1.3 "><p id="p98681249135119"><a name="p98681249135119"></a><a name="p98681249135119"></a>type：bridge模式网卡通常使用virtio。</p>
</td>
</tr>
<tr id="row5709165573315"><td class="cellrowborder" valign="top" width="13.3%" headers="mcps1.2.4.1.1 "><p id="p2071025553313"><a name="p2071025553313"></a><a name="p2071025553313"></a>virtualport</p>
</td>
<td class="cellrowborder" valign="top" width="21.42%" headers="mcps1.2.4.1.2 "><p id="p2710855113315"><a name="p2710855113315"></a><a name="p2710855113315"></a>端口类型</p>
</td>
<td class="cellrowborder" valign="top" width="65.28%" headers="mcps1.2.4.1.3 "><p id="p271095513338"><a name="p271095513338"></a><a name="p271095513338"></a>type：若使用OVS网桥，需要配置为openvswitch。</p>
</td>
</tr>
<tr id="row990801184116"><td class="cellrowborder" valign="top" width="13.3%" headers="mcps1.2.4.1.1 "><p id="p18909310415"><a name="p18909310415"></a><a name="p18909310415"></a>driver</p>
</td>
<td class="cellrowborder" valign="top" width="21.42%" headers="mcps1.2.4.1.2 "><p id="p090918115413"><a name="p090918115413"></a><a name="p090918115413"></a>后端驱动类型</p>
</td>
<td class="cellrowborder" valign="top" width="65.28%" headers="mcps1.2.4.1.3 "><p id="p1090918194112"><a name="p1090918194112"></a><a name="p1090918194112"></a>name：驱动名称，通常取值为vhost。</p>
<p id="p84340111436"><a name="p84340111436"></a><a name="p84340111436"></a>queues：网卡设备队列数。</p>
</td>
</tr>
</tbody>
</table>

#### 配置示例

-   按照“准备虚拟机网络”创建了Linux网桥br0后，配置一个桥接在br0网桥上的virtio类型的虚拟网卡设备，对应的XML配置如下：

    ```
    <domain type='kvm'>
        ...
        <devices>
            <interface type='bridge'>
                <source bridge='br0'/>
                <model type='virtio'/>
            </interface>
            ...
        </devices>
    </domain>
    ```

-   如果按照“准备虚拟机网络”创建了OVS网桥，配置一个后端使用vhost驱动，且具有四个队列的virtio虚拟网卡设备。

    ```
    <domain type='kvm'>
        ...
        <devices>
            <interface type='bridge'>
                <source bridge='br0'/>
                <virtualport type='openvswitch'/> 
                <model type='virtio'/>
                <driver name='vhost' queues='4'/> 
            </interface>
            ...
        </devices>
    </domain>
    ```


### 总线配置

#### 概述

总线是计算机各个部件之间进行信息通信的通道。外部设备需要挂载到对应的总线上，每个设备都会被分配一个唯一地址（由子元素address指定），通过总线网络完成与其他设备或中央处理器的信息交换。常见的设备总线有ISA总线、PCI总线、USB总线、SCSI总线、PCIe总线。

PCIe总线是一种典型的树结构，具有比较好的扩展性，总线之间通过控制器关联，这里以PCIe总线为例介绍如何为虚拟机配置总线拓扑。

>![](public_sys-resources/icon-note.gif) **说明：**   
>总线的配置相对比较繁琐，若不需要精确控制设备拓扑结构，可以使用libvirt自动生成的缺省总线配置。  

#### 元素介绍

在libvirt的XML配置中，每个控制器元素（使用controller元素表示）可以表示一个总线，根据虚拟机架构的不同，一个控制器上通常可以挂载一个或多个控制器或设备。这里介绍常用属性和子元素。

controller：控制器元素，表示一个总线。

-   属性type：控制器必选属性，表示总线类型。常用取值有“pci”、“usb”、“scsi”、“virtio-serial”、“fdc”、“ccid”。
-   属性index：控制器必选属性，表示控制器的总线“bus”编号（编号从0开始），可以在地址元素“address”元素中使用。
-   属性model：控制器必选属性，表示控制器的具体型号，其可选择的值与控制器类型“type”的值相关，对应关系及含义请参见[表4](#table191911761111)。
-   子元素address：为设备或控制器指定其在总线网络中的挂载位置。
    -   属性type：设备地址类型。常用取值有“pci”、“usb”、“drive”。address的type类型不同， 对应的属性也不同，常用type属性值及其该取值下address的属性请参见[表5](#table1200165711314)。

-   子元素model：控制器具体型号的名称。
    -   属性name：指定控制器具体型号的名称，和父元素controller中的属性model对应。


**表 4**  controller属性type常用取值和model取值对应关系

<a name="table191911761111"></a>
<table><thead align="left"><tr id="row2208179119"><th class="cellrowborder" valign="top" width="15.690000000000001%" id="mcps1.2.4.1.1"><p id="p17201217141114"><a name="p17201217141114"></a><a name="p17201217141114"></a>type属性值</p>
</th>
<th class="cellrowborder" valign="top" width="28.52%" id="mcps1.2.4.1.2"><p id="p1520817171119"><a name="p1520817171119"></a><a name="p1520817171119"></a>model属性值</p>
</th>
<th class="cellrowborder" valign="top" width="55.78999999999999%" id="mcps1.2.4.1.3"><p id="p1120517141112"><a name="p1120517141112"></a><a name="p1120517141112"></a>简介</p>
</th>
</tr>
</thead>
<tbody><tr id="row720101781119"><td class="cellrowborder" rowspan="3" valign="top" width="15.690000000000001%" headers="mcps1.2.4.1.1 "><p id="p172011751118"><a name="p172011751118"></a><a name="p172011751118"></a>pci</p>
</td>
<td class="cellrowborder" valign="top" width="28.52%" headers="mcps1.2.4.1.2 "><p id="p19202176114"><a name="p19202176114"></a><a name="p19202176114"></a>pcie-root</p>
</td>
<td class="cellrowborder" valign="top" width="55.78999999999999%" headers="mcps1.2.4.1.3 "><p id="p520417161112"><a name="p520417161112"></a><a name="p520417161112"></a>PCIe根节点，可挂载PCIe设备或控制器</p>
</td>
</tr>
<tr id="row34183091319"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p5413016139"><a name="p5413016139"></a><a name="p5413016139"></a>pcie-root-port</p>
</td>
<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p104130141319"><a name="p104130141319"></a><a name="p104130141319"></a>只有一个slot，可以挂载PCIe设备或控制器</p>
</td>
</tr>
<tr id="row3266142571311"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p7266122511139"><a name="p7266122511139"></a><a name="p7266122511139"></a>pcie-to-pci-bridge</p>
</td>
<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p13266142517138"><a name="p13266142517138"></a><a name="p13266142517138"></a>PCIe转PCI桥控制器，可挂载PCI设备</p>
</td>
</tr>
<tr id="row3942151816165"><td class="cellrowborder" rowspan="2" valign="top" width="15.690000000000001%" headers="mcps1.2.4.1.1 "><p id="p1296875715235"><a name="p1296875715235"></a><a name="p1296875715235"></a>usb</p>
</td>
<td class="cellrowborder" valign="top" width="28.52%" headers="mcps1.2.4.1.2 "><p id="p199601718161616"><a name="p199601718161616"></a><a name="p199601718161616"></a>ehci</p>
</td>
<td class="cellrowborder" valign="top" width="55.78999999999999%" headers="mcps1.2.4.1.3 "><p id="p4960718181613"><a name="p4960718181613"></a><a name="p4960718181613"></a>USB 2.0控制器，可挂载USB 2.0设备</p>
</td>
</tr>
<tr id="row166823191418"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p0612321419"><a name="p0612321419"></a><a name="p0612321419"></a>nec-xhci</p>
</td>
<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p161123171414"><a name="p161123171414"></a><a name="p161123171414"></a>USB 3.0控制器，可挂载USB 3.0设备</p>
</td>
</tr>
<tr id="row4208152615123"><td class="cellrowborder" valign="top" width="15.690000000000001%" headers="mcps1.2.4.1.1 "><p id="p8209326151213"><a name="p8209326151213"></a><a name="p8209326151213"></a>scsi</p>
</td>
<td class="cellrowborder" valign="top" width="28.52%" headers="mcps1.2.4.1.2 "><p id="p1520972631215"><a name="p1520972631215"></a><a name="p1520972631215"></a>virtio-scsi</p>
</td>
<td class="cellrowborder" valign="top" width="55.78999999999999%" headers="mcps1.2.4.1.3 "><p id="p520922617123"><a name="p520922617123"></a><a name="p520922617123"></a>virtio类型SCSI控制器，可以挂载块设备，如磁盘，光盘等</p>
</td>
</tr>
<tr id="row16488195941212"><td class="cellrowborder" valign="top" width="15.690000000000001%" headers="mcps1.2.4.1.1 "><p id="p1748811598122"><a name="p1748811598122"></a><a name="p1748811598122"></a>virtio-serial</p>
</td>
<td class="cellrowborder" valign="top" width="28.52%" headers="mcps1.2.4.1.2 "><p id="p174881059161214"><a name="p174881059161214"></a><a name="p174881059161214"></a>virtio-serial</p>
</td>
<td class="cellrowborder" valign="top" width="55.78999999999999%" headers="mcps1.2.4.1.3 "><p id="p748825916121"><a name="p748825916121"></a><a name="p748825916121"></a>virtio类型串口控制器，可挂载串口设备，如pty串口</p>
</td>
</tr>
</tbody>
</table>

**表 5**  address元素不同设备类型下的属性说明

<a name="table1200165711314"></a>
<table><thead align="left"><tr id="row202004570319"><th class="cellrowborder" valign="top" width="15.370000000000001%" id="mcps1.2.4.1.1"><p id="p172015573318"><a name="p172015573318"></a><a name="p172015573318"></a>类型type属性值</p>
</th>
<th class="cellrowborder" valign="top" width="23.52%" id="mcps1.2.4.1.2"><p id="p17202111511010"><a name="p17202111511010"></a><a name="p17202111511010"></a>含义</p>
</th>
<th class="cellrowborder" valign="top" width="61.11%" id="mcps1.2.4.1.3"><p id="p32016571036"><a name="p32016571036"></a><a name="p32016571036"></a>对应地址属性</p>
</th>
</tr>
</thead>
<tbody><tr id="row19201145719315"><td class="cellrowborder" valign="top" width="15.370000000000001%" headers="mcps1.2.4.1.1 "><p id="p1620115571339"><a name="p1620115571339"></a><a name="p1620115571339"></a>pci</p>
</td>
<td class="cellrowborder" valign="top" width="23.52%" headers="mcps1.2.4.1.2 "><p id="p202310814107"><a name="p202310814107"></a><a name="p202310814107"></a>地址类型为PCI地址，表示该设备在PCI总线网络中的挂载位置。</p>
</td>
<td class="cellrowborder" valign="top" width="61.11%" headers="mcps1.2.4.1.3 "><p id="p1320110578310"><a name="p1320110578310"></a><a name="p1320110578310"></a>domain：PCI设备的域号</p>
<p id="p22594251151"><a name="p22594251151"></a><a name="p22594251151"></a>bus：PCI设备的bus号</p>
<p id="p162261129459"><a name="p162261129459"></a><a name="p162261129459"></a>slot：PCI设备的device号</p>
<p id="p124103331054"><a name="p124103331054"></a><a name="p124103331054"></a>function：PCI设备的function号</p>
<p id="p1447013400512"><a name="p1447013400512"></a><a name="p1447013400512"></a>multifunction：controller元素可选，是否开启multifunction功能</p>
</td>
</tr>
<tr id="row1020113571236"><td class="cellrowborder" valign="top" width="15.370000000000001%" headers="mcps1.2.4.1.1 "><p id="p52017571238"><a name="p52017571238"></a><a name="p52017571238"></a>usb</p>
</td>
<td class="cellrowborder" valign="top" width="23.52%" headers="mcps1.2.4.1.2 "><p id="p423198161015"><a name="p423198161015"></a><a name="p423198161015"></a>地址类型为USB地址，表示该设备在USB总线中的位置。</p>
</td>
<td class="cellrowborder" valign="top" width="61.11%" headers="mcps1.2.4.1.3 "><p id="p92011257837"><a name="p92011257837"></a><a name="p92011257837"></a>bus：USB设备的bus号</p>
<p id="p19705183371613"><a name="p19705183371613"></a><a name="p19705183371613"></a>port：USB设备的port号</p>
</td>
</tr>
<tr id="row92018571731"><td class="cellrowborder" valign="top" width="15.370000000000001%" headers="mcps1.2.4.1.1 "><p id="p820117571731"><a name="p820117571731"></a><a name="p820117571731"></a>drive</p>
</td>
<td class="cellrowborder" valign="top" width="23.52%" headers="mcps1.2.4.1.2 "><p id="p123208121020"><a name="p123208121020"></a><a name="p123208121020"></a>地址类型存储设备地址，表示所属的磁盘控制器，及其在总线中的位置。</p>
</td>
<td class="cellrowborder" valign="top" width="61.11%" headers="mcps1.2.4.1.3 "><p id="p3201357231"><a name="p3201357231"></a><a name="p3201357231"></a>controller：指定所属控制器号</p>
<p id="p1389922903710"><a name="p1389922903710"></a><a name="p1389922903710"></a>bus：设备输出的channel号</p>
<p id="p621944515379"><a name="p621944515379"></a><a name="p621944515379"></a>target：存储设备target号</p>
<p id="p567815011374"><a name="p567815011374"></a><a name="p567815011374"></a>unit：存储设备lun号</p>
</td>
</tr>
</tbody>
</table>

#### 配置示例

该示例给出一个PCIe总线的拓扑结构。PCIe根节点（BUS 0）下挂载了三个PCIe-Root-Port控制器。第一个PCIe-Root-Port控制器（BUS 1）开启了multifunction功能，并在其下挂载一个PCIe-to-PCI-bridge控制器，形成了一个PCI总线（BUS 3），该PCI总线上挂载了一个virtio-serial设备和一个USB 2.0控制器。第二个PCIe-Root-Port控制器（BUS 2）下挂载了一个SCSI控制器。第三个PCIe-Root-Port控制器（BUS 0）下无挂载设备。配置内容如下：

```
<domain type='kvm'>
    ...
    <devices>
        <controller type='pci' index='0' model='pcie-root'/>
	<controller type='pci' index='1' model='pcie-root-port'>
	    <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0' multifunction='on'/>
	</controller>
	<controller type='pci' index='2' model='pcie-root-port'>
	    <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
	</controller>
	<controller type='pci' index='3' model='pcie-to-pci-bridge'>
	    <model name='pcie-pci-bridge'/>
	    <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
	</controller>
	<controller type='pci' index='4' model='pcie-root-port'>
	    <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
	</controller>
	<controller type='scsi' index='0' model='virtio-scsi'>
	    <address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
	</controller>
	<controller type='virtio-serial' index='0'>
	    <address type='pci' domain='0x0000' bus='0x03' slot='0x02' function='0x0'/>
	</controller>
	<controller type='usb' index='0' model='ehci'>
	    <address type='pci' domain='0x0000' bus='0x03' slot='0x01' function='0x0'/>
	</controller>
	...
	</devices>
</domain>
```

### 其它常用设备

#### 概述

除存储设备、网络设备外，XML配置文件中还需要指定一些其他外部设备，本节介绍这些元素的配置方法。

#### 元素介绍

-   serial：串口设备

    属性type：用于指定串口类型。常用属性值为pty、tcp、pipe、file。


-   video：媒体设备

    属性type：媒体设备类型。AArch架构常用属性值为virtio，x86\_64架构通常使用属性值为vga或cirrus。

    子元素model：video的子元素，用于指定媒体设备类型。

    在model元素中，type属性为vga表示配置VGA类型显卡，vram属性代表显存大小，单位默认为KB。

    例如：给x86\_64架构虚拟机配置16MB的VGA类型的显卡，XML示例如下，其中vram属性代表显存大小，单位默认为KB：

    ```
    <video>
        <model type='vga' vram='16384' heads='1' primary='yes'/>
    </video>
    ```

-   input：输出设备

    属性type：指定输出设备类型。常用属性值为tabe、keyboard，分别表示输出设备为写字板、键盘。

    属性bus：指定挂载的总线。常用属性值为USB。

-   emulator：模拟器应用路径
-   graphics：图形设备

    属性type：指定图形设备类型。常用属性值为vnc。

    属性listen：指定侦听的IP地址。


#### 配置示例

例如，在下面的示例中，配置了虚拟机的模拟器路径，pty串口、virtio媒体设备、USB写字板、USB键盘以及VNC图形设备。

>![](public_sys-resources/icon-note.gif) **说明：**   
>graphics的type配置为VNC时，建议配置属性passwd，即使用VNC登录时的密码。  

```
<domain type='kvm'>
    ...
    <devices>
        <emulator>/usr/libexec/qemu-kvm</emulator>
        <console type='pty'/>
        <video>
            <model type='virtio'/>
        </video>
        <input type='tablet' bus='usb'/>
        <input type='keyboard' bus='usb'/>
        <graphics type='vnc' listen='0.0.0.0' passwd='n8VfjbFK'/>
	...
	</devices>
</domain>
```

## 体系架构相关配置

#### 概述

XML中还有一部分体系架构相关的配置，这部分配置包括主板，CPU，一些与体系架构相关的feature，本章节主要介绍它们的配置和含义。

#### 元素介绍

-   os：定义虚拟机启动参数。

    子元素type：指定虚拟机类型，属性arch表示架构类型，如aarch64，属性machine表示虚拟机的芯片组类型，虚拟机支持的芯片组可以通过 **qemu-kvm -machine ?**命令查询，如AArch64结构使用“virt”类型。

    子元素loader：指定加载固件 ，如配置EDK提供的UEFI文件，属性readonly表示是否是只读文件，值为“yes”或“no”，属性type表示loader的类型，常用的值有“rom”、“pflash”。

    子元素nvram：指定nvram文件路径，用于存储UEFI启动配置。


-   features：hypervisor支持控制一些虚拟机CPU/machine的特性，如高级电源管理接口“acpi”，ARM处理器指定GICv3中断控制器等。

#### AArch64架构配置示例

虚拟机的类型为AArch64结构，使用virt芯片组，利用UEFI启动的虚拟机配置如下：

```
<domain type='kvm'>
    ...
    <os>
        <type arch='aarch64' machine='virt'>hvm</type>
        <loader readonly='yes' type='pflash'>/usr/share/edk2/aarch64/QEMU_EFI-pflash.raw</loader>
        <nvram>/var/lib/libvirt/qemu/nvram/openEulerVM.fd</nvram>
    </os>
    ...
</domain>
```

为虚拟机配置ACPI和GIC V3中断控制器特性。

```
<features>
    <acpi/>
    <gic version='3'/>
</features>
```

#### x86\_64架构配置示例

x86\_64架构支持BIOS和UEFI两种启动方式，如果不配置loader，则使用默认启动方式BIOS。这里给出启动方式为UEFI、芯片组为q35的配置参考。

```
<domain type='kvm'>
    ...
    <os>
        <type arch='x86_64' machine='q35'>hvm</type>
        <loader type='rom'>/usr/share/edk2/ovmf/OVMF.fd</loader>
    </os>
    ...
</domain>
```

## 其他常见配置项

#### 概述

除系统资源和虚拟设备外，XML配置文件还需要配置一些其他元素，本节介绍这些元素的配置方法。

#### 元素介绍

-   iothreads：指定iothread数量，可以用于加速存储设备性能。

-   on\_poweroff：虚拟机关闭时采取的动作。
-   on\_reboot：虚拟机重启时采取的动作。
-   on\_crash：虚拟机崩溃时采取的动作。
-   clock：采用的时钟类型。

    属性offset：设置虚拟机时钟的同步类型，可选的值有“localtime”、“utc”、“timezone”、“variable”等。


#### 配置示例

为虚拟机配置两个iothread，用于加速存储设备性能。

```
<iothreads>2</iothreads>
```

虚拟机关闭时，销毁虚拟机。

```
<on_poweroff>destroy</on_poweroff>
```

虚拟机重启时，重新启动虚拟机。

```
<on_reboot>restart</on_reboot>
```

虚拟机崩溃时，重新启动虚拟机。

```
<on_crash>restart</on_crash>
```

时钟采用“utc”的同步方式。

```
<clock offset='utc'/>
```

## XML配置文件示例

#### 概述

本节给出一个基本的AArch64虚拟机和一个x86\_64虚拟机的XML配置文件示例，供用户参考。

#### 示例一

一个包含基本元素的AArch64架构虚拟机的XML配置文件，其内容示例如下：

```
<domain type='kvm'>
    <name>openEulerVM</name>
    <memory unit='GiB'>8</memory>
    <vcpu>4</vcpu>
    <os>
	<type arch='aarch64' machine='virt'>hvm</type>
	<loader readonly='yes' type='pflash'>/usr/share/edk2/aarch64/QEMU_EFI-pflash.raw</loader>
	<nvram>/var/lib/libvirt/qemu/nvram/openEulerVM.fd</nvram>
    </os>
    <features>
	<acpi/>
	<gic version='3'/>
    </features>
    <cpu mode='host-passthrough'>
        <topology sockets='2' cores='2' threads='1'/>
    </cpu>
    <iothreads>1</iothreads>
    <clock offset='utc'/>
    <on_poweroff>destroy</on_poweroff>
    <on_reboot>restart</on_reboot>
    <on_crash>restart</on_crash>
    <devices>
	<emulator>/usr/libexec/qemu-kvm</emulator>
	<disk type='file' device='disk'>
	    <driver name='qemu' type='qcow2' iothread="1"/>
	    <source file='/mnt/openEuler-image.qcow2'/>
	    <target dev='vda' bus='virtio'/>
	    <boot order='1'/>
	</disk>
	<disk type='file' device='cdrom'>
	    <driver name='qemu' type='raw'/>
	    <source file='/mnt/openEuler-20.03-LTS-aarch64-dvd.iso'/>
	    <readonly/>
	    <target dev='sdb' bus='scsi'/>
	    <boot order='2'/>
	</disk>
	<interface type='bridge'>
	    <source bridge='br0'/>
	    <model type='virtio'/>
	</interface>
	<console type='pty'/>
        <video>
           <model type='virtio'/>
        </video>
        <controller type='scsi' index='0' model='virtio-scsi'/>
	<controller type='usb' model='ehci'/>
	<input type='tablet' bus='usb'/>
	<input type='keyboard' bus='usb'/>
	<graphics type='vnc' listen='0.0.0.0' passwd='n8VfjbFK'/>
    </devices>
    <seclabel type='dynamic' model='dac' relabel='yes'/>
</domain>
```

#### 示例二

一个包含基本元素及总线元素x86\_64架构虚拟机的XML配置文件，其配置示例如下：

```
<domain type='kvm'>
  <name>openEulerVM</name>
  <memory unit='KiB'>8388608</memory>
  <currentMemory unit='KiB'>8388608</currentMemory>
  <vcpu placement='static'>4</vcpu>
  <iothreads>1</iothreads>
  <os>
    <type arch='x86_64' machine='pc-i440fx-4.0'>hvm</type>
  </os>
  <features>
    <acpi/>
  </features>
  <cpu mode='host-passthrough' check='none'>
    <topology sockets='2' cores='2' threads='1'/>
  </cpu>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2' iothread='1'/>
      <source file='/mnt/openEuler-image.qcow2'/>
      <target dev='vda' bus='virtio'/>
      <boot order='1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
    </disk>
    <controller type='scsi' index='0' model='virtio-scsi'>
    </controller>
    <controller type='virtio-serial' index='0'>
    </controller>
    <controller type='usb' index='0' model='ehci'>
    </controller>
    <controller type='sata' index='0'>
    </controller>
    <controller type='pci' index='0' model='pci-root'/>
    <interface type='bridge'>
      <mac address='52:54:00:c1:c4:23'/>
      <source bridge='virbr0'/>
      <model type='virtio'/>
    </interface>
    <serial type='pty'>
      <target type='isa-serial' port='0'>
        <model name='isa-serial'/>
      </target>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <input type='tablet' bus='usb'>
      <address type='usb' bus='0' port='1'/>
    </input>
    <input type='keyboard' bus='usb'>
      <address type='usb' bus='0' port='2'/>
    </input>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'>
      <listen type='address' address='0.0.0.0'/>
    </graphics>
    <video>
      <model type='vga' vram='16384' heads='1' primary='yes'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <memballoon model='virtio'>
    </memballoon>
  </devices>
</domain>
```

