MetaOS虚拟设备管理


配置虚拟机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。


管理虚拟磁盘

概述

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

操作步骤

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


管理虚拟网卡

概述

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

操作步骤

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


配置虚拟串口

概述

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

操作步骤

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


管理设备直通

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

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

PCI/PCIE穿透

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>

说明: VFIO直通方式的最小直通单位是iommu_group,host根据硬件上的ACS位,来划分iommu_group。同一个iommu_group中的设备只允许直通给同一台虚拟机(一个PCI设备上的若干个function,如果属于同一个iommu_group,只允许直通给一个虚拟机使用)。


管理虚拟机USB

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

配置USB控制器

概述

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

注意事项
配置方法

这里介绍为虚拟机配置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设备的XML描述:

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

配置USB直通的步骤如下:

  1. 为虚拟机配置USB控制器,配置方法请参见“虚拟机配置 > 配置USB控制器”。

  2. 查询主机上的USB设备信息。

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

    # lsusb
    
  3. 准备USB设备的XML描述文件,注意在设备热拔之前,请确保USB设备当前不在使用当中,否则可能造成数据丢失。

  4. 执行热插、热拔命令。

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


管理快照

概述

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

说明: 当前存储快照只支持raw、qcow2格式镜像,不支持block块设备。

操作步骤

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

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

    $ virsh domblklist metaOSVM
    
  2. 创建虚拟机磁盘快照_metaOS-snapshot1.qcow2_,命令及回显如下:

    $ virsh snapshot-create-as --domain metaOSVM --disk-only --diskspec vda,snapshot=external,file=/mnt/metaOS-snapshot1.qcow2 --atomic
    Domain snapshot 1582605802 created
    
  3. 磁盘快照查询操作。

    $ virsh snapshot-list metaOSVM
    

配置磁盘IO悬挂

总体介绍

概述

存储故障(比如存储断链)场景下,物理磁盘的IO错误,通过虚拟化层传给虚拟机前端,虚拟机内部收到IO错误,可能导致虚拟机内部的用户文件系统变成read-only状态,需要重启虚拟机或者用户手动恢复,这给用户带来额外的工作量。

这种情况下,虚拟化平台提供了一种磁盘IO悬挂的能力,即当存储故障时,虚拟机IO下发到主机侧时将IO悬挂住,在悬挂时间内不对虚拟机内部返回IO错误,这样虚拟机内部的文件系统就不会因为IO错误而变为只读状态,而是呈现为Hang住;同时虚拟机后端按指定的悬挂间隔对IO进行重试。如果存储故障在悬挂时间内恢复正常,悬挂住的IO即可恢复落盘,虚拟机内部文件系统自动恢复运行,不需要重启虚拟机;如果存储故障在悬挂时间内未能恢复正常,则上报错误给虚拟机内部,通知给用户。

应用场景

使用可能会发生存储面链路断链的云盘作为虚拟磁盘后端的场景。

注意事项和约束限制


磁盘IO悬挂配置

Qemu命令行配置

磁盘IO悬挂功能通过在虚拟磁盘设备上指定werror=retry rerror=retry进行使能,使用retry_intervalretry_timeout进行重试策略的配置。retry_interval为IO错误重试的间隔,配置范围为0-MAX_LONG,单位为毫秒,未配置时使用缺省值1000ms;retry_timeout为IO错误重试超时时间,配置范围为0-MAX_LONG,0值表示不会发生超时,单位为毫秒,未配置时使用缺省值0。

virtio-blk磁盘的磁盘IO悬挂配置如下:

-drive file=/path/to/your/storage,format=raw,if=none,id=drive-virtio-disk0,cache=none,aio=native \
-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x6,\
drive=drive-virtio-disk0,id=virtio-disk0,write-cache=on,\
werror=retry,rerror=retry,retry_interval=2000,retry_timeout=10000

virtio-scsi磁盘的磁盘IO悬挂配置如下:

-drive file=/path/to/your/storage,format=raw,if=none,id=drive-scsi0-0-0-0,cache=none,aio=native \
-device scsi-hd,bus=scsi0.0,channel=0,scsi-id=0,lun=0,\
device_id=drive-scsi0-0-0-0,drive=drive-scsi0-0-0-0,id=scsi0-0-0-0,write-cache=on,\
werror=retry,rerror=retry,retry_interval=2000,retry_timeout=10000

xml配置方式

磁盘IO悬挂功能通过在磁盘xml配置中指定error_policy='retry' rerror_policy='retry'进行使能。主要是配置上retry_intervalretry_timeout的值。retry_interval为IO错误重试的间隔,配置范围为0-MAX_LONG,单位为毫秒,未配置时使用缺省值1000ms;retry_timeout为IO错误重试超时时间,配置范围为0-MAX_LONG,0值表示不会发生超时,单位为毫秒,未配置时使用缺省值0。

virtio-blk磁盘的磁盘IO悬挂xml配置如下:

<disk type='block' device='disk'>
  <driver name='qemu' type='raw' cache='none' io='native' error_policy='retry' rerror_policy='retry' retry_interval='2000' retry_timeout='10000'/>
  <source dev='/path/to/your/storage'/>
  <target dev='vdb' bus='virtio'/>
  <backingStore/>
</disk>

virtio-scsi磁盘的磁盘IO悬挂xml配置如下:

<disk type='block' device='disk'>
  <driver name='qemu' type='raw' cache='none' io='native' error_policy='retry' rerror_policy='retry' retry_interval='2000' retry_timeout='10000'/>
  <source dev='/path/to/your/storage'/>
  <target dev='sdb' bus='scsi'/>
  <backingStore/>
  <address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>