# 管理设备
- [管理设备](#管理设备)
    - [配置虚拟机PCIe控制器](#配置虚拟机PCIe控制器)
    - [管理虚拟磁盘](#管理虚拟磁盘)
    - [管理虚拟网卡](#管理虚拟网卡)
    - [配置虚拟串口](#配置虚拟串口)
    - [管理设备直通](#管理设备直通)
        - [PCI直通](#PCI直通)
        - [SR-IOV直通](#SR-IOV直通)
    - [管理虚拟机USB](#管理虚拟机USB)
        - [配置USB控制器](#配置USB控制器)
        - [配置USB直通设备](#配置USB直通设备)
    - [管理快照](#管理快照)


## 配置虚拟机PCIe控制器

### 概述

虚拟机内部的网卡、磁盘控制器、PCIe直通设备都需要挂接到PCIe Root Port下面，每个Root Port对应一个PCIe插槽。Root Port的下挂设备支持热插拔，但是Root Port本身不支持热插拔，因此需要用户考虑设备热插的需求，规划虚拟机需要预留的最大PCIe Root Port数量，在虚拟机启动之前完成Root Port的静态配置。

### 配置PCIe Root、PCIe Root Port和PCIe-PCI-Bridge

虚拟机PCIe控制器通过XML文件进行配置，PCIe Root、PCIe Root Port和PCIe-PCI-Bridge对应XML中的model分别为pcie-root、pcie-root-port、pcie-to-pci-bridge。

-   简化配置方法

    在虚拟机的XML文件中写入以下内容，controller的其他属性由libvirt自动填充：

    ```
      <controller type='pci' index='0' model='pcie-root'/>
      <controller type='pci' index='1' model='pcie-root-port'/>
      <controller type='pci' index='2' model='pcie-to-pci-bridge'/>
      <controller type='pci' index='3' model='pcie-root-port'/>
      <controller type='pci' index='4' model='pcie-root-port'/>
      <controller type='pci' index='5' model='pcie-root-port'/>
    ```

    其中：由于pcie-root和pcie-to-pci-bridge分别占用1个index，因此最终的index等于需要的Root Port数量+1。

-   完整配制方法

    在虚拟机的XML文件中写入以下内容：

    ```
      <controller type='pci' index='0' model='pcie-root'/>
      <controller type='pci' index='1' model='pcie-root-port'>
        <model name='pcie-root-port'/>
        <target chassis='1' port='0x8'/>
        <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0' multifunction='on'/>
      </controller>
      <controller type='pci' index='2' 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='3' model='pcie-root-port'>
        <model name='pcie-root-port'/>
        <target chassis='3' port='0x9'/>
        <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
      </controller>
      <controller type='pci' index='3' model='pcie-root-port'>
    ```

    其中：

    -   Root Port的chassis和port属性必须依次递增，由于中间插入一个PCIe-PCI-Bridge，chassis编号跳过2，但是port编号仍然连续。
    -   Root Port的address function的取值范围为0x0\~0x7。
    -   每个slot最多下挂8个function，挂满之后需要递增slot编号。

    由于完整配置方法相对复杂，建议采用简化配置方法。


## 管理虚拟磁盘

### 概述

虚拟磁盘类型主要包含virtio-blk、virtio-scsi、vhost-scsi等。virtio-blk模拟的是一种block设备，virtio-scsi和vhost-scsi模拟的是一种scsi设备。

-   virtio-blk：普通系统盘和数据盘可用，该种配置下虚拟磁盘在虚拟机内部呈现为vd\[a-z\]或vd\[a-z\]\[a-z\]。
-   virtio-scsi：普通系统盘和数据盘建议选用，该种配置下虚拟磁盘在虚拟机内部呈现为sd\[a-z\]或sd\[a-z\]\[a-z\]。
-   vhost-scsi：对性能要求高的虚拟磁盘建议选用，该种配置下虚拟磁盘在虚拟机内部呈现为sd\[a-z\]或sd\[a-z\]\[a-z\]。

### 操作步骤

虚拟磁盘的配置步骤，请参见“虚拟机配置 > 存储设备”。本节以virtio-scsi磁盘为例，介绍挂载和卸载虚拟磁盘的简单方法。

-   挂载virtio-scsi磁盘：

    使用virsh attach-device命令挂载virtio-scsi虚拟磁盘：

    ```
     $ virsh attach-device <VMInstance> <attach-device.xml>
    ```

    上述命令可以为虚拟机在线挂载磁盘，其中磁盘信息由attach-device.xml文件指定。下面是一个attach-device.xml文件的例子：

    ```
    ### attach-device.xml ###
        <disk type='file' device='disk'>
          <driver name='qemu' type='qcow2' cache='none' io='native'/>
          <source file='/path/to/another/qcow2-file'/>
          <backingStore/>
          <target dev='sdb' bus='scsi'/>
          <address type='drive' controller='0' bus='0' target='1' unit='0'/>
        </disk>
    ```

    通过上述命令挂载的磁盘，在虚拟机关机重启后失效。如果需要为虚拟机持久化挂载虚拟磁盘，需要使用带--config参数的virsh attach-device命令。

-   卸载virtio-scsi磁盘：

    通过在线挂载的磁盘，如果不需要再使用，可以通过virsh detach命令动态卸载：

    ```
     $ virsh detach-device <VMInstance> <detach-device.xml>
    ```

    其中，detach-device.xml指定了需要卸载的磁盘的XML信息，与动态挂载时的XML信息保持一致。


## 管理虚拟网卡

### 概述

虚拟网卡类型主要包含virtio-net、vhost-net、vhost-user等。用户在创建虚拟机后，可能会有挂载或者卸载虚拟网卡的需求。openEuler提供了网卡热插拔的功能，通过网卡热插拔，能够改变网络的吞吐量，提高系统的灵活性和扩展性。

### 操作步骤

虚拟网卡的配置步骤，请参见“虚拟机配置 > 网络设备”。本节以vhost-net网卡为例，介绍挂载和卸载虚拟网卡的简单方法。

-   挂载vhost-net网卡：

    使用virsh attach-device命令挂载vhost-net虚拟网卡：

    ```
     $ virsh attach-device <VMInstance> <attach-device.xml>
    ```

    上述命令可以为虚拟机在线挂载vhost-net网卡，其中网卡信息由attach-device.xml文件指定。下面是一个attach-device.xml文件的例子：

    ```
    ### attach-device.xml ###
        <interface type='bridge'>
          <mac address='52:54:00:76:f2:bb'/>
          <source bridge='br0'/>
          <virtualport type='openvswitch'/>
          <model type='virtio'/>
          <driver name='vhost' queues='2'/>
        </interface>
    ```

    通过上述命令挂载的vhost-net网卡，在虚拟机关机重启后失效。如果需要为虚拟机持久化挂载虚拟网卡，需要使用带--config参数的virsh attach-device命令。

-   卸载vhost-net网卡：

    通过在线挂载的网卡，如果不需要再使用，可以通过virsh detach命令动态卸载：

    ```
     $ virsh detach-device <VMInstance> <detach-device.xml>
    ```

    其中，detach-device.xml指定了需要卸载虚拟网卡的XML信息，与动态挂载时的XML信息保持一致。


## 配置虚拟串口

### 概述

在虚拟化环境下，由于管理和业务的需求，虚拟机与宿主机需要互相通信。但在云管理系统复杂的网络架构下，运行在管理平面的服务与运行在业务平面的虚拟机之间，不能简单的进行三层网络互相通信，导致服务部署和信息收集不够快速。因此需要提供虚拟串口，来达到虚拟机与宿主机之间互相通信的目的。 通过在虚拟机的XML配置文件中增加相应串口的配置项，可以实现虚拟机与宿主机之间的互相通信。

### 操作步骤

Linux虚拟机串口控制台，即虚拟机串口连接到宿主机的一个伪终端设备，通过宿主机的设备间接实现对虚拟机的交互式操作。在该场景下串口需配置为pty类型，本节介绍pty型串口的配置方法。

-   在虚拟机的XML配置文件中"devices"节点下添加如下所示的虚拟串口配置项：

    ```
        <serial type='pty'>
        </serial>
        <console type='pty'>
          <target type='serial'/>
        </console>
    ```

-   使用virsh console命令连接到正在运行的虚拟机的pty串口。

    ```
    $ virsh console <VMInstance>
    ```

-   如果要确保没有遗漏任何串口消息，请在启动虚拟机时使用--console选项连接到串口。

    ```
    $ virsh start --console <VMInstance>
    ```


## 管理设备直通

设备直通技术是指将host上的物理设备直接呈现给一台虚拟机，虚拟机可以直接访问该设备资源的一种使用方式。使用设备直通的方式可以让虚拟机获得良好的I/O性能。

当前设备直通使用的是VFIO方式，按照直通的设备类型可以分为PCI直通和SR-IOV直通两种类型。

### PCI直通

PCI直通是指将host上的物理PCI设备直接呈现给一台虚拟机，供虚拟机直接访问的一种使用方式。PCI直通使用了vfio设备直通方式，为虚拟机配置PCI直通的xml配置如下：

```
<hostdev mode='subsystem' type='pci' managed='yes'>   
    <driver name='vfio'/> 
    <source>
        <address domain='0x0000' bus='0x04' slot='0x10' function='0x01'/>
    </source>
    <rom bar='off'/>
    <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</hostdev>
```

**表 1**  PCI直通设备配置项

<a name="table956811517377"></a>
<table><thead align="left"><tr id="row185697150377"><th class="cellrowborder" valign="top" width="33.33333333333333%" id="mcps1.2.4.1.1"><p id="p13570115123719"><a name="p13570115123719"></a><a name="p13570115123719"></a>参数名</p>
</th>
<th class="cellrowborder" valign="top" width="33.33333333333333%" id="mcps1.2.4.1.2"><p id="p1570015153716"><a name="p1570015153716"></a><a name="p1570015153716"></a>说明</p>
</th>
<th class="cellrowborder" valign="top" width="33.33333333333333%" id="mcps1.2.4.1.3"><p id="p3570115123711"><a name="p3570115123711"></a><a name="p3570115123711"></a>取值</p>
</th>
</tr>
</thead>
<tbody><tr id="row857017157375"><td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.1 "><p id="p16570191513372"><a name="p16570191513372"></a><a name="p16570191513372"></a>hostdev.source.address.domain</p>
</td>
<td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.2 "><p id="p05702152379"><a name="p05702152379"></a><a name="p05702152379"></a>host OS上的PCI设备的domain号。</p>
</td>
<td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.3 "><p id="p257051583710"><a name="p257051583710"></a><a name="p257051583710"></a>&gt;=0</p>
</td>
</tr>
<tr id="row4570171513716"><td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.1 "><p id="p124981022478"><a name="p124981022478"></a><a name="p124981022478"></a>hostdev.source.address.bus</p>
</td>
<td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.2 "><p id="p1570101593717"><a name="p1570101593717"></a><a name="p1570101593717"></a>host OS上的PCI设备bus号。</p>
</td>
<td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.3 "><p id="p10570161513717"><a name="p10570161513717"></a><a name="p10570161513717"></a>&gt;=1</p>
</td>
</tr>
<tr id="row9570141518379"><td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.1 "><p id="p155701615203718"><a name="p155701615203718"></a><a name="p155701615203718"></a>hostdev.source.address.slot</p>
</td>
<td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.2 "><p id="p55701515193714"><a name="p55701515193714"></a><a name="p55701515193714"></a>host OS上的PCI设备的device号。</p>
</td>
<td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.3 "><p id="p75701315123715"><a name="p75701315123715"></a><a name="p75701315123715"></a>&gt;=0</p>
</td>
</tr>
<tr id="row10570171593713"><td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.1 "><p id="p21023329490"><a name="p21023329490"></a><a name="p21023329490"></a>hostdev.source.address.function</p>
</td>
<td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.2 "><p id="p1657061593715"><a name="p1657061593715"></a><a name="p1657061593715"></a>host OS上的PCI设备的function号。</p>
</td>
<td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.3 "><p id="p85707159374"><a name="p85707159374"></a><a name="p85707159374"></a>&gt;=0</p>
</td>
</tr>
<tr id="row125708153375"><td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.1 "><p id="p119491912175015"><a name="p119491912175015"></a><a name="p119491912175015"></a>hostdev.driver.name</p>
</td>
<td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.2 "><p id="p157091543710"><a name="p157091543710"></a><a name="p157091543710"></a>可选配置项，指定PCI直通的后端驱动。</p>
</td>
<td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.3 "><p id="p105701015103719"><a name="p105701015103719"></a><a name="p105701015103719"></a>vfio（默认配置项）</p>
</td>
</tr>
<tr id="row145701015173717"><td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.1 "><p id="p195701715123711"><a name="p195701715123711"></a><a name="p195701715123711"></a>hostdev.rom</p>
</td>
<td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.2 "><p id="p1057010157379"><a name="p1057010157379"></a><a name="p1057010157379"></a>直通设备的ROM是否呈现给虚拟机。</p>
</td>
<td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.3 "><p id="p55705153378"><a name="p55705153378"></a><a name="p55705153378"></a>可以配置为“on/off”，默认为“on”。</p>
<a name="ul1937231571"></a><a name="ul1937231571"></a><ul id="ul1937231571"><li>on：表示直通设备的ROM呈现给虚拟机，例如：直通网卡虚拟机需要从该网卡的PXE启动时，可以将该选项配置为“on”，HBA卡直通虚拟机需要从ROM中启动时可以将该选项配置为“on”。</li><li>off：表示直通设备的ROM不呈现给虚拟机。</li></ul>
</td>
</tr>
<tr id="row20570201563712"><td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.1 "><p id="p1057013151371"><a name="p1057013151371"></a><a name="p1057013151371"></a>hostdev.address type</p>
</td>
<td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.2 "><p id="p6570201510374"><a name="p6570201510374"></a><a name="p6570201510374"></a>PCI设备呈现的Guest内bdf号。</p>
</td>
<td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.3 "><p id="p1257011153370"><a name="p1257011153370"></a><a name="p1257011153370"></a>[0x03-0x1e](slot范围)</p>
<p id="p878711532216"><a name="p878711532216"></a><a name="p878711532216"></a>说明：</p>
<a name="ul8885104953013"></a><a name="ul8885104953013"></a><ul id="ul8885104953013"><li>domain为域信息，bus为总线号，slot为插槽号，function为功能</li><li>除了slot插槽号，这里其余均默认为0。</li><li>第一个slot插槽号0x00被系统占用，第二个slot号0x01被IDE控制器和USB控制器占用，第三个slot号0x02被video占用。</li><li>最后一个slot号0x1f被pvchannel占用。</li></ul>
</td>
</tr>
</tbody>
</table>

>![](public_sys-resources/icon-note.gif) **说明：**   
>VFIO直通方式的最小直通单位是iommu\_group，host根据硬件上的ACS位，来划分iommu\_group。同一个iommu\_group中的设备只允许直通给同一台虚拟机（一个PCI设备上的若干个function，如果属于同一个iommu\_group，只允许直通给一个虚拟机使用）。  

### SR-IOV直通

#### 概述

SR-IOV（Single Root I/O Virtualizaiton）是一种基于硬件的虚拟化解决方案，通过SR-IOV技术可以将一个PF（Physical Function）虚拟成多个VF（Virtual Function），每个VF都可以单独被直通给一个虚拟机，极大地提升了硬件资源利用率和虚拟机的I/O性能。一种典型的应用场景就是网卡SR-IOV设备直通，利用SR-IOV技术可以将一个物理网卡（PF）虚拟成多个VF网卡，再把VF直通给虚拟机使用。

>![](public_sys-resources/icon-note.gif) **说明：**   
>-   SR-IOV需要物理硬件支持，使用SR-IOV前请确保要直通的硬件设备支持该能力，并且Host侧的设备驱动程序工作在SR-IOV模式下。  
>-   查询网卡具体型号的办法如下：  
>例如下述回显，第一列为网卡的PCI号，19e5:1822为网卡的厂商号设备号。  
>```  
># lspci | grep Ether  
>05:00.0 Ethernet controller: Device 19e5:1822 (rev 45)  
>07:00.0 Ethernet controller: Device 19e5:1822 (rev 45)  
>09:00.0 Ethernet controller: Device 19e5:1822 (rev 45)  
>0b:00.0 Ethernet controller: Device 19e5:1822 (rev 45)  
>81:00.0 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01)  
>81:00.1 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01)  
>```  

#### 操作方法

请使用root用户按照如下操作步骤配置SR-IOV直通网卡：

1.  开启网卡的SR-IOV模式。
    1.  请确保Guest OS有网卡供应商提供的VF驱动支持，否则Guest OS内VF无法正常工作。
    2.  在host OS的BIOS中开启SMMU/IOMMU的支持。不同厂家服务器的开启方式可能不同，请参考各服务器的帮助文档。
    3.  HOST驱动配置，开启SR-IOV的VF模式。这里以Hi1822网卡为例，开启16个VF。

        ```
        echo 16 > /sys/class/net/ethX/device/sriov_numvfs
        ```

2.  获取PF和VF的PCI BDF信息。
    1.  获取当前单板上的网卡资源列表，参考命令如下：

        ```
        # lspci | grep Eth
        03:00.0 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family (4*25GE) (rev 45)
        04:00.0 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family (4*25GE) (rev 45)
        05:00.0 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family (4*25GE) (rev 45)
        06:00.0 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family (4*25GE) (rev 45)
        7d:00.0 Ethernet controller: Huawei Technologies Co., Ltd. Device a222 (rev 20)
        7d:00.1 Ethernet controller: Huawei Technologies Co., Ltd. Device a222 (rev 20)
        7d:00.2 Ethernet controller: Huawei Technologies Co., Ltd. Device a221 (rev 20)
        7d:00.3 Ethernet controller: Huawei Technologies Co., Ltd. Device a221 (rev 20)
        ```

    2.  查看VF的PCI BDF信息，参考命令如下：

        ```
        # lspci | grep "Virtual Function"
        03:00.1 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family Virtual Function (rev 45)
        03:00.2 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family Virtual Function (rev 45)
        03:00.3 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family Virtual Function (rev 45)
        03:00.4 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family Virtual Function (rev 45)
        03:00.5 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family Virtual Function (rev 45)
        03:00.6 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family Virtual Function (rev 45)
        03:00.7 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family Virtual Function (rev 45)
        03:01.0 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family Virtual Function (rev 45)
        03:01.1 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family Virtual Function (rev 45)
        03:01.2 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family Virtual Function (rev 45)
        ```

    3.  选择一个可用的VF，根据其BDF信息将其配置写入虚拟机的配置文件中。以03:00.1设备为例，对应的bus号是03，slot号是00，function号是1。

3.  识别和管理PF/VF对应关系。
    1.  识别PF对应的VF关系，以PF 03.00.0为例：

        ```
        # ls -l /sys/bus/pci/devices/0000\:03\:00.0/
        ```

        可下显示如下的软链接信息，根据信息可以获得其对应的VF编号（virtfnX）和PCI BDF号。

    2.  识别VF对应的PF关系，以VF 03:00.1为例：

        ```
        # ls -l /sys/bus/pci/devices/0000\:03\:00.1/
        ```

        可显示下述软连接信息，即可获得其对应PF的PCI BDF号。

        ```
        lrwxrwxrwx 1 root root       0 Mar 28 22:44 physfn -> ../0000:03:00.0
        ```

    3.  获知PF/VF对应的网卡设备名称，例如：

        ```
        # ls /sys/bus/pci/devices/0000:03:00.0/net
        eth0
        ```

    4.  设置VF的mac/vlan/qos信息，确保VF在直通之前处于UP状态。以VF 03:00.1为例，假设PF为eth0，VF编号为0。

        ```
        # ip link set eth0 vf 0 mac 90:E2:BA:21:XX:XX    # 设置mac地址
        # ifconfig eth0 up
        # ip link set eth0 vf 0 rate 100                 # 设置VF出口速率，单位Mbps
        # ip link show eth0                              # 查看mac/vlan/qos信息，确认设置成功
        ```

4.  挂载SR-IOV网卡到虚拟机中。

    创建虚拟机时，在虚拟机配置文件中增加SR-IOV直通的配置项。

    ```
    <interface type='hostdev' managed='yes'> 
        <mac address='fa:16:3e:0a:xx:xx'/>
        <source> 
            <address type='pci' domain='0x0000' bus='0x06' slot='0x11' function='0x6'/>
        </source> 
        <vlan>
            <tag id='1'/>
        </vlan>
    </interface>
    ```

    **表 1**  SR-IOV配置选项说明

    <a name="table576925116567"></a>
    <table><thead align="left"><tr id="row877075112560"><th class="cellrowborder" valign="top" width="33.33333333333333%" id="mcps1.2.4.1.1"><p id="p1877045125616"><a name="p1877045125616"></a><a name="p1877045125616"></a>参数名</p>
    </th>
    <th class="cellrowborder" valign="top" width="33.33333333333333%" id="mcps1.2.4.1.2"><p id="p9770185145613"><a name="p9770185145613"></a><a name="p9770185145613"></a>说明</p>
    </th>
    <th class="cellrowborder" valign="top" width="33.33333333333333%" id="mcps1.2.4.1.3"><p id="p177075115613"><a name="p177075115613"></a><a name="p177075115613"></a>取值</p>
    </th>
    </tr>
    </thead>
    <tbody><tr id="row1777010512568"><td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.1 "><p id="p477015111561"><a name="p477015111561"></a><a name="p477015111561"></a>hostdev.managed</p>
    </td>
    <td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.2 "><p id="p137715514569"><a name="p137715514569"></a><a name="p137715514569"></a>libvirt处理PCI设备的两种模式。</p>
    </td>
    <td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.3 "><p id="p4700154714613"><a name="p4700154714613"></a><a name="p4700154714613"></a>no：默认配置，表示直通设备由用户自行管理。</p>
    <p id="p1475810591229"><a name="p1475810591229"></a><a name="p1475810591229"></a>yes：表示直通设备由libvirt管理。SR-IOV直通场景需要配置为yes。</p>
    </td>
    </tr>
    <tr id="row37711751195619"><td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.1 "><p id="p677145110569"><a name="p677145110569"></a><a name="p677145110569"></a>hostdev.source.address.bus</p>
    </td>
    <td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.2 "><p id="p777135145611"><a name="p777135145611"></a><a name="p777135145611"></a>host OS上的PCI设备bus号。</p>
    </td>
    <td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.3 "><p id="p117712512560"><a name="p117712512560"></a><a name="p117712512560"></a>&gt;=1</p>
    </td>
    </tr>
    <tr id="row1577115113567"><td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.1 "><p id="p187711451175612"><a name="p187711451175612"></a><a name="p187711451175612"></a>hostdev.source.address.slot</p>
    </td>
    <td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.2 "><p id="p18771135119563"><a name="p18771135119563"></a><a name="p18771135119563"></a>host OS上的PCI设备device号。</p>
    </td>
    <td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.3 "><p id="p1277125114561"><a name="p1277125114561"></a><a name="p1277125114561"></a>&gt;=0</p>
    </td>
    </tr>
    <tr id="row127711651205613"><td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.1 "><p id="p10771135155616"><a name="p10771135155616"></a><a name="p10771135155616"></a>hostdev.source.address.function</p>
    </td>
    <td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.2 "><p id="p1777185195618"><a name="p1777185195618"></a><a name="p1777185195618"></a>host OS上的PCI设备function号。</p>
    </td>
    <td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.3 "><p id="p10771195118568"><a name="p10771195118568"></a><a name="p10771195118568"></a>&gt;=0</p>
    </td>
    </tr>
    </tbody>
    </table>

    >![](public_sys-resources/icon-note.gif) **说明：**   
    >关闭SR-IOV功能。  
    >在虚拟机使用完毕后（虚拟机关机，所有的VF均没有在使用中的时候），若要关闭SR-IOV功能。执行操作如下：  
    >这里以Hi1822网卡（eth0对应PF的网口名称）为例：  
    >```  
    >echo 0 > /sys/class/net/eth0/device/sriov_numvfs  
    >```  

#### HPRE加速器SR-IOV直通

加速器引擎是TaiShan 200服务器基于Kunpeng 920服务器提供的硬件加速解决方案。HPRE加速器用于加速SSL/TLS应用，可以显著降低处理器消耗，提高处理器效率。  
在鲲鹏服务器上，需要把主机Host上的HPRE加速器的VF直通给虚拟机，供虚拟机内部业务使用。

**表 1**  HPRE加速器说明

|             | 说明                                                                                                |
|-------------|-----------------------------------------------------------------------------------------------------|
| 设备名称    | Hi1620 on-chip RSA/DH security algorithm accelerator (HPRE engine)                                  |
| 功能        | 模幂运算、RSA密钥对运算、DH计算、部分大数辅助运算(模幂、模乘、取模、乘法、模逆、素数测试、互质测试) |
| VendorID    | 0x19E5                                                                                              |
| PF DeviceID | 0xA258                                                                                              |
| VF DeviceID | 0xA259                                                                                              |
| 最大VF数量  | 一个HPRE PF最多支持创建63个VF                                                                       |


>![](public_sys-resources/icon-note.gif) **说明：**  
>当虚拟机正在使用VF设备时，不允许卸载Host上的驱动，加速器不支持热插拔。  
>VF操作(VFNUMS为0表示关闭VF，hpre_num用来标识具体的加速器设备)：  
>```
>echo $VFNUMS > /sys/class/uacce/hisi_hpre-$hpre_num/device/sriov_numvfs
>```

## 管理虚拟机USB

为了方便在虚拟机内部使用USBkey设备、USB海量存储设备等USB设备，openEuler提供了USB设备直通的功能。用户可以通过USB直通和热插拔相关接口给虚拟机配置直通USB设备、或者在虚拟机处于运行的状态下热插/热拔USB设备。
### 配置USB控制器

#### 概述

USB控制器是为虚拟机上的USB设备提供具体USB功能的虚拟控制器设备，在虚拟机内部使用USB设备必须给虚拟机配置USB控制器。当前openEuler支持如下三种USB控制器：

-   UHCI（Universal Host Controller Interface）：通用主机控制器接口，也称为USB 1.1主机控制器规范。
-   EHCI（Enhanced Host Controller）：增强主机控制器接口，也称为USB 2.0主机控制器规范。
-   xHCI（eXtensible Host Controller Interface）：可扩展主机控制器接口，也称为USB 3.0主机控制器规范。

#### 注意事项

-   主机服务器上需存在支持USB 1.1、USB 2.0和USB 3.0标准的USB控制器硬件和模块。
-   为虚拟机配置USB控制器时，请按照USB 1.1、USB 2.0到USB 3.0的顺序来配置。
-   一个xHCI控制器有8个端口，最多可以挂载4个USB 3.0设备和4个USB 2.0设备。一个EHCI控制器有6个端口，最多可以挂载6个USB2.0设备。一个UHCI控制器有2个端口，最多可以挂载2个USB 1.1设备。
-   每台虚拟机最多支持配置一个相同类型的USB控制器。
-   不支持热插拔USB控制器。
-   若虚拟机没有安装USB 3.0的驱动，可能无法识别xHCI控制器，USB 3.0驱动下载和安装方法请参见对应OS发行商官方说明。
-   为了不影响操作系统的兼容性，为虚拟机配置USB接口的tablet设备时，请指定USB控制器bus号为0（默认挂载到USB 1.1控制器上）。

#### 配置方法

这里介绍为虚拟机配置USB控制器的配置内容说明。建议同时配置USB 1.1、USB 2.0和USB 3.0，做到同时兼容三种设备。

USB 1.1控制器（UHCI）的XML配置项为：

```
<controller type='usb' index='0' model='piix3-uhci'>
</controller>
```

USB 2.0控制器（EHCI）的XML配置为：

```
<controller type='usb' index='1' model='ehci'>
</controller>
```

USB 3.0控制器（xHCI）的XML配置为：

```
<controller type='usb' index='2' model='nec-xhci'>
</controller>
```

### 配置USB直通设备

#### 概述

当虚拟机配置好USB控制器后，就可以通过设备直通的方式将主机上的物理USB设备挂载到虚拟机内部供虚拟机使用。在虚拟化场景下，除了支持静态配置以外还同时支持USB设备的热插/拔操作，即在虚拟机处于运行状态的时候挂载/卸载USB设备。

#### 注意事项

-   一个USB设备只能直通给一台虚拟机使用
-   配置了直通USB设备的虚拟机不支持热迁移
-   虚拟机配置文件中直通的USB设备不存在时，虚拟机会创建失败
-   对一个正在读写的USB存储设备进行强制热拔操作有可能会损坏USB设备内的文件

#### 配置说明

这里介绍为虚拟机配置USB设备的配置内容说明。

USB设备的XML描述：

```
<hostdev mode='subsystem' type='usb' managed='yes'>
    <source>        
        <address bus='m' device='n'/>
    </source>
    <address type='usb' bus='x' port='y'/>
</hostdev>
```

-   <address bus='m' device='n'/\>，其中，m表示该USB设备在主机上的bus地址，n表示device ID编号。
-   <address type='usb' bus='x' port='y'\> 表示该USB设备要挂载到虚拟机指定的USB控制器。其中x表示控制器ID，与虚拟机所配置的USB控制器index编号相对应，y表示port地址。用户配置直通USB设备的时候需要配置这个字段，确保设备挂载的控制器与预期相符。

#### 配置方法

配置USB直通的步骤如下：

1.  为虚拟机配置USB控制器，配置方法请参见“虚拟机配置 > 配置USB控制器”。
2.  查询主机上的USB设备信息。

    通过lsusb命令（需要安装usbutils软件包）查询主机上的USB设备信息，包含bus地址、device地址、设备厂商ID、设备ID和产品描述信息等。例如：

    ```
    $ lsusb
    ```

    ```
    Bus 008 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
    Bus 007 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    Bus 006 Device 002: ID 0bda:0411 Realtek Semiconductor Corp. 
    Bus 006 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
    Bus 005 Device 003: ID 136b:0003 STEC 
    Bus 005 Device 002: ID 0bda:5411 Realtek Semiconductor Corp. 
    Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 001 Device 003: ID 12d1:0003 Huawei Technologies Co., Ltd. 
    Bus 001 Device 002: ID 0bda:5411 Realtek Semiconductor Corp. 
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    ```

3.  准备USB设备的XML描述文件，注意在设备热拔之前，请确保USB设备当前不在使用当中，否则可能造成数据丢失。
4.  执行热插、热拔命令。

    假设虚拟机名称为openEulerVM，对应的配置文件为usb.xml。

    -   热插USB设备，只对当前运行的虚拟机有效，虚拟机冷重启后需要重新配置。

        ```
        $ virsh attach-device openEulerVM usb.xml --live
        ```

    -   热插USB设备，持久化该配置，即该虚拟机重启后该设备会自动直通给该虚拟机使用。

        ```
        $ virsh attach-device openEulerVM usb.xml --config
        ```

    -   热拔USB设备，只对当前运行的虚拟机有效，持久化配置的USB设备在虚拟机重启后USB设备会自动直通给该虚拟机。

        ```
        $ virsh detach-device openEulerVM usb.xml --live
        ```

    -   热拔USB设备，持久化该配置。

        ```
        $ virsh detach-device openEulerVM usb.xml --config
        ```



## 管理快照

### 概述

虚拟机在使用过程中可能由于病毒对系统的破坏、系统文件被误删除或误格式化等原因造成虚拟机系统损坏导致系统无法启动。为了使损坏的系统快速恢复，openEuler提供了存储快照功能。openEuler可以在用户不感知的情况下制作虚拟机在某一时刻的快照（制作通常指需要几秒钟），该快照能帮助用户将磁盘快速恢复到某一时刻的状态，例如系统损坏后能快速恢复系统，从而提升系统可靠性。

>![](public_sys-resources/icon-note.gif) **说明：**   
>当前存储快照只支持raw、qcow2格式镜像，不支持block块设备。  

### 操作步骤

制作虚拟机存储快照的操作步骤如下：

1.  登录主机，通过virsh domblklist命令查询虚拟机使用的磁盘。

    ```
    $ virsh domblklist openEulerVM
      Target   Source
     ---------------------------------------------
      vda      /mnt/openEuler-image.qcow2
    ```


1.  创建虚拟机磁盘快照_openEuler-snapshot1.qcow2_，命令及回显如下：

    ```
    $ virsh snapshot-create-as --domain openEulerVM --disk-only --diskspec vda,snapshot=external,file=/mnt/openEuler-snapshot1.qcow2 --atomic
    Domain snapshot 1582605802 created
    ```


1.  磁盘快照查询操作。

    ```
    $ virsh snapshot-list openEulerVM
     Name         Creation Time               State
    ---------------------------------------------------------
     1582605802   2020-02-25 12:43:22 +0800   disk-snapshot
    ```


