【写在前面】飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力,聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域,包含了应用使能套件、软件仓库、软件支持、软件适配认证四大板块,旨在共享尖端技术,为开发者提供一个涵盖多领域的开发平台和工具套件。点击这里开始你的技术升级之旅吧

image.png

本文分享至飞腾开发者平台《FT-2000+/64 KVM虚拟化系统解决方案--使用libvirt创建和管理虚拟机》

1 介绍

  本文主要介绍怎样使用virt-install命令创建虚拟机以及虚拟机管理工具--libvirt的使用方法。

2 利用virt-install命令创建虚拟机

  在之前的文章《KVM虚拟化系统解决方案(二)--KVM虚拟化v1.03》我们提到过,除了内核的kvm和virtio以及其他虚拟化支持外,我们还需要qemu这个用户空间的软件。在此,我们由易到难,先使用命令安装qemu、libvrit等,后续我们将会使用源码编译安装。

2.1 环境设置

  首先我们dmesg查看内核中跟kvm相关的是否正常启动;dmesg如果看到以下信息,说明正常,可以进行下一步操作,否则可能是文章《FT-2000+/64 KVM虚拟化系统解决方案--KVM虚拟化v.103》内核配置或者设备树有问题。

image.png

  安装命令:

yum install qemu-kvm libvirt virt-install bridge-utils AAVMF –y

  其中qemu-kvm、libvirt、virt-install在之前文章《FT-2000+/64 KVM虚拟化系统解决方案--KVM虚拟化v1.03》同样有过介绍,bridge-utils是网桥管理工具,AAVMF是qemu虚拟机支持uefi启动的固件,必须要,否则无法启动uefi的发行版系统。
  查看qemu版本是2.10.0,命令安装的qemu不支持spice协议,后续我们会源码编译安装。

image.png

2.2 创建虚拟机

  首先,使用virt-install命令安装系统,具体操作如下所示:

virt-install
--connect qemu:///system
--virt-type kvm
--name kvm0
--vcpus=2
--ram 1024
--disk path=/var/lib/libvirt/images/kvm0.img,size=8
--nographics
--cdrom /root/ CentOS-7-aarch64-Everything-1804.iso

  值得注意的是,有可能会报一个权限错误如下图所示:

image.png

  这个错误原因是因为文件目录没有加入acl 权限,比如安装镜像放在/root目录下,就需要将qemu添加acl权限:

setfacl -m u:qemu:rx  /root/

  这样就不会报权限错误了。

  进入安装界面:

image.png

  每个都进入设置,每个都设置完成后,如下图所示,输入b就可以进入下一步,等待安装完成。

image.png

  安装完成后会重启进入系统,至此一个最简单的虚拟机安装已经完成。

3 libvirt介绍

  在《FT-2000+/64 KVM虚拟化系统解决方案--KVM虚拟化v1.03》中,我们对libvirt有过简单的介绍,下面我们将详细讲解一下libvirt这个当前在虚拟化使用最好用的管理工具。

  libvirt是为了更方便管理平台虚拟化技术而设计的开源应用程序接口、守护进程和管理工具。libvirt支持多种虚拟化方案,既支持包括KVM、QEMU、XEN、VMware、VirtualBOX、Hyper-V在内的平台虚拟化方案,也支持OpenVZ、LXC、Docker等容器虚拟化方案,还支持用户态Linux(UML)的虚拟化。Libvirt具体涉及节点、Hypervisor、域(Domain),其管理功能包括域的管理、远程节点的管理、存储的管理、网络的管理和提供一个稳定、可靠、高效的应用程序接口,以便完成上述4个管理功能。

4 libvirt的配置

  libvirt相关的配置文件都是在/etc/libvirt目录之中,如下:

image.png

  下面简单介绍其中几个重要配置文件和目录。

  1) /etc/libvirt/libvirtd.conf
  libvirtd.conf是libvirt守护进程libvirtd的配置文件,被修改后需要重启libvirtd服务才会生效。配置包括是否建立TCP、UNIX domain socket等连接方式及最大连接数,以及这些连接认证机制,设置libvirtd日志级别等。

  2) /etc/libvirt/qemu.conf
  qemu.conf是libvirt对QEMU的驱动配置文件,包括VNC、SPICE等,以及连接他们采用的权限认证方式的配置,也包括内存大页、SELinux、Cgroups等相关配置。

  3) /etc/libvirt/libvirt.conf
  libvirt.conf文件是用于配置一些常用的libvirt连接,通常是远程连接的别名。如下所示,#开头的是注释:

image.png

  其中,为了演示,配置了remote1这个别名,用于指代qemu+ssh://root@192.168.137.200/system这个远程的libvirt连接。有了这个别名后,就可以在用virsh等工具或者自己写的代码调用libvirt API时使用这个别名,而不需要写完整的、冗长的 URL连接标识符了。用virsh使用这个别名操作如下:

image.png

  在代码中调用libvirt API时也可以使用这个别名来建立连接,如下的python代码行就实现了这个别名来建立连接:

conn = libvirt.openReadOnly('remote1')

  4) /etc/libvirt/qemu目录
  在qemu目录下,存放的是虚拟机域的配置文件。查看qemu目录如下:

image.png

  其中kvm0.xml就是我们之前创建的kvm0虚拟机,用命令virt-install或者virt-manager创建的都会默认在这个目录下生成配置XML文件,其中networks目录保存了创建域时生成默认使用的网络配置文件。

5 libvirtd的使用

  libvirtd负责执行其他管理工具发给它的虚拟化管理操作指令。而libvirt的客户端工具(包括virsh、virt-manager等)可以连接到本地或者远程的libvirtd进程,以便管理节点上的客户机(启动、关闭、重启、迁移等)、 收集节点上的宿主机和客户机的配置和资源使用状态。

  在centos7中libvirtd是作为一个服务(service)配置在系统中的,所以可以通过systemctl命令来对其进行操作。

systemctl start libvirtd启动libvirtd服务
systemctl stop libvirtd停止libvirtd服务
systemctl restart libvirtd重启libvirtd服务
systemctl reload libvirtd不重启但是重新加载配置文件
systemctl status libvirtd查看libvirtd运行状态

image.png

  在默认情况下,libvirtd在监听一个本地Unix domain socket,而没有监听基于TCP/IP socket,需要使用-l或者--listen的命令行参数来 开启对libvirtd.conf的配置文件中对TCP/IP socket的配置。另外,libvirtd在启动或者重启完成时,只要客户机xml配置文件是存在的,libvirtd就会自动加载这些配置,获取他们的信息。当然如果用户不使用libvirt,例如直接使用qemu命令创建,libvirtd则不能自动加载这些配置。

  libvirtd也是一个可执行程序,可以单独地使用它,下表为libvirtd常见的一些参数含义:

参数含义
-d让libvirtd作为后台守护进程在后台运行。
-f指定libvirtd的配置文件为FILE,而不是使用默认值(通常是/etc/libvirt/libvirtd.conf)。
-l开启配置文件中配置的TCP/IP连接。
-p将libvirtd进程的PID写入FILE文件中,而不是默认值(通常是/var/run/libvirtd.pid)。
-t设置对libvirtd连接的超时时间,单位秒。
-v执行命令输出详细的输出信息。特别是在运行出错时,详细的输出信息便于用户查找原因。
--version查看版本信息。

6 libvirt域的XML配置文件

  在使用libvirt对虚拟化系统进行管理时,很多地方都是以xml文件进行配置的,而其中最重要、用户经常要修改的莫过于客户机的xml文件,本节将针对客户机的xml文件进行较的介绍。

  更具体的域xml学习可以查询:https://libvirt.org/formatdomain.html

  下面是前面创建的kvm0虚拟机域配置文件kvm0.xml:

<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
  virsh edit kvm0
or other application using the libvirt API.
-->

<domain type='kvm'>
  <name>kvm0</name>
  <uuid>df22f20a-475c-44a0-a62c-ecc04eeb61c1</uuid>
  <memory unit='KiB'>1048576</memory>
  <currentMemory unit='KiB'>1048576</currentMemory>
  <vcpu placement='static'>2</vcpu>
  <os>
    <type arch='aarch64' machine='virt-rhel7.5.0'>hvm</type>
    <loader readonly='yes' type='pflash'>/usr/share/AAVMF/AAVMF_CODE.fd</loader>
    <nvram>/var/lib/libvirt/qemu/nvram/kvm0_VARS.fd</nvram>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <gic version='3'/>
  </features>
  <cpu mode='host-passthrough' check='none'/>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/var/lib/libvirt/images/kvm0.img'/>
      <target dev='sda' bus='scsi'/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <target dev='sdb' bus='scsi'/>
      <readonly/>
      <address type='drive' controller='0' bus='0' target='0' unit='1'/>
    </disk>
    <controller type='usb' index='0' model='qemu-xhci' ports='8'>
      <address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
    </controller>
    <controller type='scsi' index='0' model='virtio-scsi'>
      <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
    </controller>
    <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-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='2' port='0x9'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <controller type='pci' index='3' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='3' port='0xa'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
    </controller>
    <controller type='pci' index='4' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='4' port='0xb'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x3'/>
    </controller>
    <interface type='bridge'>
      <mac address='52:54:00:4b:f0:1c'/>
      <source bridge='br0'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target type='system-serial' port='0'>
        <model name='pl011'/>
      </target>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
  </devices>
</domain>

  从上面的配置文件示例中可以看到,在该域的xml文件中,所有有效配置都在<domain>和</domain>标签之间,这表明该配置文件是一个域的配置。

6.1 cpu、内存、启动顺序等配置

  1) cpu的配置

<vcpu placement='static'>2</vcpu>

  vcpu标签,中间2表示分配了2个vcpu。

  2) cpu的模型配置:

<cpu mode='host-passthrough' check='none'/>

  对于cpu模型配置,有以下3种模型,默认都是host-passthrough。

模式(mode)含义
custom基于某个qemu中内置的cpu模型,再做个性化的设置。
host-model根据物理cpu的特性,选择一个与之相近的标准cpu模型。
host-passthrough直接将cpu特性暴露给虚拟机使用,在虚拟机上看到的完全就是物理机cpu的型号。

  对于vCPU的配置有更详细的配置,这里稍作介绍。

<domain>
  ...
  <vcpu placement='static' cpuset="1-4,^3,6" current="1">2</vcpu>
  <vcpus>
    <vcpu id='0' enabled='yes' hotpluggable='no' order='1'/>
    <vcpu id='1' enabled='no' hotpluggable='yes'/>
  </vcpus>
  ...
</domain>

  cpuset表示允许到那些物理cpu上执行,也就是表示客户机的两个vCPU被允许调度到1、2、4、6号物理上执行(^3表示排除3号);

  另外有一个比较重要的功能,绑定物理cpu执行:

<domain>
  ...
  <cputune>
    <vcpupin vcpu="0" cpuset="1-4,^2"/>
    <vcpupin vcpu="1" cpuset="0,1"/>
    <vcpupin vcpu="2" cpuset="2,3"/>
    <vcpupin vcpu="3" cpuset="0,4"/>
    <emulatorpin cpuset="1-3"/>
    <iothreadpin iothread="1" cpuset="5,6"/>
    <iothreadpin iothread="2" cpuset="7,8"/>
    <shares>2048</shares>
    <period>1000000</period>
    <quota>-1</quota>
    <global_period>1000000</global_period>
    <global_quota>-1</global_quota>
    <emulator_period>1000000</emulator_period>
    <emulator_quota>-1</emulator_quota>
    <iothread_period>1000000</iothread_period>
    <iothread_quota>-1</iothread_quota>
    <vcpusched vcpus='0-4,^3' scheduler='fifo' priority='1'/>
    <iothreadsched iothreads='2' scheduler='batch'/>
    <cachetune vcpus='0-3'>
      <cache id='0' level='3' type='both' size='3' unit='MiB'/>
      <cache id='1' level='3' type='both' size='3' unit='MiB'/>
      <monitor level='3' vcpus='1'/>
      <monitor level='3' vcpus='0-3'/>
    </cachetune>
    <cachetune vcpus='4-5'>
      <monitor level='3' vcpus='4'/>
      <monitor level='3' vcpus='5'/>
    </cachetune>
    <memorytune vcpus='0-3'>
      <node id='0' bandwidth='60'/>
    </memorytune>

  </cputune>
  ...
</domain>

  vcpupin标签表示将虚拟机CPU绑定到某一个或者多个物理CPU上,例如:

<vcpupin vcpu="0" cpuset="1-4,^2"/>
//就表示将虚拟机0号cpu绑定到物理机cpu 1和4上。

<shares>2048</shares>
//表示客户机占用CPU时间的加权配置,一个配置为2048的域获得CPU执行时间是配为1024的域的两倍。如果不配置shares值,就会使用宿主机系统提供的默认值。

  3) 内存的配置
  在该域的配置文件下,内存配置大小如下:

<memory unit='KiB'>1048576</memory>
<currentMemory unit='KiB'>1048576</currentMemory>

  可知,内存大小为1048576KB,即1G,memory标签中的内存表示客户机最大可使用内存,currentMemory标签表示启动时分配给客户机使用的内存。一般将二者设为相同。
  另外内存标签中可以设置内存气球

<memballoon model='virtio'>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
  <stats period='10'/>
  <driver iommu='on' ats='on'/>
</memballoon>

  改配置是将客户分配一个使用virtio-ballon驱动的设备,以便实现客户机的内存ballooing调节。

  4) 客户机系统和启动顺序配置

<os>
    <type arch='aarch64' machine='virt-rhel7.5.0'>hvm</type>
    <loader readonly='yes' type='pflash'>/usr/share/AAVMF/AAVMF_CODE.fd</loader>
    <nvram>/var/lib/libvirt/qemu/nvram/kvm0_VARS.fd</nvram>
    <boot dev='hd'/>
</os>

  这样的配置表明了架构类型是aarch64,机器是virt-rhel7.5.0、这个是qemu对arm模拟的一款机器。

<loader readonly='yes' type='pflash'>/usr/share/AAVMF/AAVMF_CODE.fd</loader>
//表示了引导程序用的是AAVMF,就是之前提到过的虚拟机uefi引导固件。

<nvram>/var/lib/libvirt/qemu/nvram/kvm0_VARS.fd</nvram>
//表示非易失性存储,类型是pflash,用来存储域的参数。

<boot dev='hd'/>
//表示启动顺序,从硬盘启动。也可以是cdrom其他方式。

6.2 网络的配置

  1) 桥接方式的网络配置,这时当前默认的网络配置,配置如下:

<interface type='bridge'>
  <mac address='52:54:00:4b:f0:1c'/>
  <source bridge='br0'/>
  <model type='virtio'/>
  <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
</interface>

  其中各参数含义如下:

type='bridge'    //表示客户机使用桥接方式获得网络
mac address    //用于配置客户机中网卡的mac地址
<source bridge='br0'/>    //表示使用宿主机中的br0网络接口来建立网桥
<model type='virtio'/>    //表示在客户机中使用virtio-net驱动的网卡设备,同时配置了pci 的              设备编号为:0000:01:00:00。

  2) NAT的网络配置,配置如下:

<interface type='network'>
  <mac address='52:54:00:4b:f0:1c'/>
  <source network='default'/>
  <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
</interface>

  这里type='network'和<source network='default'/>表示使用NAT的方式,并使用默认的网络配置,客户机将会分配到192.168.122.0/24的ip网段的一个IP地址。当然,使用NAT必须保证宿主机中运行着DHCP和DNS服务。可以使用命令安装:

yum -y install dhcp

  由于配置使用了默认的NAT网络 配置,可以在libvirt相关网络网络配置中看到一个/etc/libvirt/qemu/networks/default.xml文件,它具体配置了默认的连接方式,如下:

<network>
  <name>default</name>
  <uuid>e311f9d0-6957-4030-be79-306fcc3f0148</uuid>
  <forward mode='nat'/>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='52:54:00:8f:77:0a'/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254'/>
    </dhcp>
  </ip>
</network>

  使用NAT时,查看宿主机中网桥的使用情况如下:

image.png

  其中这个vnet0这个网络接口就是客户机和宿主机网络连接的纽带,ifconfig也可以看到多了一个vnet0接口。

  3) 用户模式的网络配置

<interface type='user'>
  <mac address='52:54:00:4b:f0:1c'/>
  <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
</interface>

  其中type='user'表示该客户机中的网络接口是用户模式网络,是完全由QEMU软件模拟出来的一个网络协议栈。

  网卡设备直接分配功能暂时不行,后续将会更新。

6.3 存储的配置

  在示例中,关于客户机磁盘的配置如下:

<disk type='file' device='disk'>
  <driver name='qemu' type='qcow2'/>
  <source file='/var/lib/libvirt/images/kvm0.img'/>
  <target dev='sda' bus='scsi'/>
  <address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
<disk type='file' device='cdrom'>
  <driver name='qemu' type='raw'/>
  <target dev='sdb' bus='scsi'/>
  <readonly/>
  <address type='drive' controller='0' bus='0' target='0' unit='1'/>
</disk>

  上面的配置表示,使用qcow2格式的kvm0.img镜像文件作为客户机的磁盘,设备名称为/dev/sda。

  <disk>标签是客户机磁盘配置的主标签,其中包含的属性和一些子标签。它的type属性表示磁盘使用哪种类型作为磁盘的来源,其取值为file、block、dir、network中的一个,分别表示使用文件、块设备、目录、网络作为客户机的磁盘来源。它的device属性表示让客户机如何来使用该磁盘设备,其取值为floppy、disk、cdrom或者lun其中一个,分别表0示软盘、硬盘、光盘和LUN(逻辑单元号),默认值为disk(硬盘)。

  <source>子标签表示磁盘的来源,当<disk>标签type属性为file是,配置为上面所示,而当type属性为block块设备时,应该配置为<source dev='/dev/sda'>这样的模式。

  <target>子标签表示将磁盘暴露给客户机时的总线类型和设备名称。其中dev表示客户机中该磁盘设备的逻辑设备名称,而bus属性表示该磁盘设备被模拟挂载的总线类型。bus的属性值可以为ide、scsi、virtio、xen、usb、sata等。如果省略了bus属性,libvirt会根据dev属性中的名称来推测bus属性的值。

  <address>表示该磁盘设备在客户机中的pci总线地址。

6.4 其他的配置

  1) 域的配置
  在域的整个配置文件中,<domain>标签是范围最大、最基本的标签,是其他所有标签的根标签。在示例的域xml文件中,<domain>标签配置如下:

<domain type='kvm'>
...
</domain>

  在<domain>标签中可以配置两个属性:
  一个是type,用于表示Hypervisor的类型,可选的值为xen、kvm、qemu、lxc、kqemu、VMware中的一个;
  另一个是id,其值是一个数字,用于在该宿主机的libvirt中唯一标识一个运行着的客户机,如果不设置,libvirt会按顺序自动分配一个最小可用id。

  2) 域的元数据配置
  在域的xml文件中,有一部分是用于配置域的元数据(meta data)。元数据用于表示域的属性,用来区别其他域。在示例的域的xml文件中,元数据的配置如下:

<name>kvm0</name>
<uuid>df22f20a-475c-44a0-a62c-ecc04eeb61c1</uuid>

  其中,name用于表示该客户机的名称,uuid是唯一标识该客户机的uuid。在同一个宿主机上,每个客户机的uuid都必须是唯一的。

  3) QEMU模拟器的配置
  在域的配置文件中,需要制定使用的设备模型的模拟器,在emulator标签中 配置模拟器的绝对路径。在示例中,模拟器的配置如下:

<devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    ...
</device>

  4) 图形显示方式
在示例的域的xml中,选择的是nograhics所以没有图形显示,但是我们可以配置。

<graphics type='vnc' autoport='yes' listen='0.0.0.0'>
  <listen type='address' address='0.0.0.0'/>
</graphics>

  这表示通过vnc的 方式连接到客户机,其中vnc端口为libvirt自动分配。
  也可以支持多种类型的其他图形显示方式,可以选sdl、vnc、rdp、spice等协议。其中spice协议是目前图形显示协议最好的,我们在《FT-2000+/64 KVM虚拟化系统解决方案--虚拟桌面v1.03》这篇文档中也会会提到。

  5) 客户机的声卡和显卡配置

<sound model='ich6'>                                                                     
  <address type='pci' domain='0x0000' bus='0x07' slot='0x01' function='0x0'/>
</sound>
<video>
  <model type='virtio' heads='1' primary='yes'/>
  <address type='pci' domain='0x0000' bus='0x05' slot='0x00' function='0x0'/>
</video>

  <sound>标签是声卡配置,其中model属性表示为客户机模拟出来的声卡类型,其取值为es1370、sb16、ac97和ich6其中一个。
  <video>标签表示的是显卡配置,其中<model>子标签表示客户机模拟的显卡类型,它的类型(type)属性可以是vga、cirrus、vmvga、xen、vbox、virtio其中的一个,其中现在模拟中效果最好的要数半虚拟化的virtio,后面我们会提到。

  6) 串口和控制台
  串口和控制台式非常有用的设备,特别是在调试客户机的内核或者遇到客户机宕机的情况下,一般都可以用串口或者控制台中查看到一些相关线索的日志信息。在示例的域中:

<serial type='pty'>
  <target type='system-serial' port='0'>
    <model name='pl011'/>
  </target>
</serial>
<console type='pty'>
  <target type='serial' port='0'/>
</console>

  设置了客户机的编号为0的串口(即/dev/ttyS0),使用宿主机中的伪终端(pty),由于这里没有指定使用宿主机中的哪个虚拟终端,因此livirt会自己选择一个空闲的虚拟终端。当然也可以加上<source path='/dev/pts/1'>配置来明确指定使用宿主机中的哪一个虚拟终端。

  7) 输入设备
  输入设备主要是指鼠标和键盘输入的模拟:

<input type='mouse' bus='usb'>
  <address type='usb' bus='0' port='1'/>
</input>
<input type='keyboard' bus='usb'>
  <address type='usb' bus='0' port='2'/>
</input>

  这里的配置会让QEMU模拟usb接口的鼠标和键盘。

  8) PCI控制器
  根据客户机的架构不同,libvirt默认会为客户机模拟一些必要的PCI控制器(而不需要xml配置文件中指定),而一些PCI控制器需要显式地在xml文件中指定:

<controller type='usb' index='0' model='qemu-xhci' ports='8'>
  <address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
</controller>
<controller type='scsi' index='0' model='virtio-scsi'>
  <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
</controller>
<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-root-port'>
  <model name='pcie-root-port'/>
  <target chassis='2' port='0x9'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
</controller>
<controller type='pci' index='3' model='pcie-root-port'>
  <model name='pcie-root-port'/>
  <target chassis='3' port='0xa'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
</controller>
<controller type='pci' index='4' model='pcie-root-port'>
  <model name='pcie-root-port'/>
  <target chassis='4' port='0xb'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x3'/>
</controller>

  这里显式地指定了一个usb控制器、一个virtio-scsi控制器、4个pci-root。

7 virsh命令的使用

  virsh是用c语言编写的一个使用libvirt API的虚拟化管理工具。virsh程序源码在libvirt项目源代码的tools目录下,实现virsh工具最核心的一个源代码文件是virsh.c。

  在使用virsh命令进行虚拟化管理操作时,可以使用两种工作模式:交互模式和非交互模式。

  使用交互模式就是进入virsh中的命令行,需要quit退出,在交互模式下可以使用tab命令补齐。如下所示:

image.png

  在非交互模式下,直接使用virsh命令带参数即可。如下所示:

image.png

  另外在某个节点上使用virsh命令,就默认连接到本地的节点Hypervisor,就如上面所示,不需要输入远程节点的URL。

7.1 域的管理命令

  virsh的最重要的功能之一就是实现对域的管理,下面的表格列出了域管理中一些常用的virsh命令:

命令功能描述
list获取当前节点上所有域的列表
dominfo < ID or Name or UUID >获取一个域的基本信息
domid <Name or UUID>根据域的名称或者UUID获取ID值
domname <ID or UUID>根据域的ID或者UUID获取名称
dommemstat < ID or Name or UUID >获取一个域的内存使用情况的统计信息
setmem <ID> <mem-size>设置一个域的内存大小(默认单位kB)
vcpuinfo <ID>获取一个域的vCPU的基本信息
vcpupin <ID> <vCPU> <pCPU>将一个域的vCPU绑定到物理CPU上运行
setvcpus <ID> <vCPU-num>设置一个域的vCPU个数
vncdisplay <ID>获取一个域的VNC连接IP地址和端口
create <dom.xml>根据域的xml配置文件创建一个域
define <dom.xml>定义一个域,但不启动
start <ID>启动一个域(客户机)
suspend <ID>暂停一个域
resume <ID>唤醒一个域
shutdown <ID>让一个域执行关机操作
reboot <ID>让一个域重启
reset <ID>强制重启一个域
destroy <ID>强制关闭一个域
save <ID> <file.img>保存一个运行的域到一个文件中
migrate <ID> <dest_url>将一个域迁移到另外一个目的地址
dump <ID> <core.file>coredump一个域保存到一个文件
dumpxml <ID>以xml格式转存一个域的信息到标准输出中
attach-device <ID> <device.xml>向一个域添加xml文件中的设备(热插拔)
detach-device <ID> <device.xml>将xml文件中的设备从一个域中移除
console <ID>连接到一个域的控制台,也就是串口输出

7.2 宿主机和Hypervisor的管理命令

  一旦拥有特权的连接,virsh也可以对宿主机进行管理,主要是对宿主机和Hypervisor信息查询。下面列出一些常用的virsh命令:

命令功能描述
version显示libvirt和Hypervisor版本
sysinfo以xml格式打印宿主机系统的信息
nodeinfo显示该节点的基本信息
uri显示当前连接的URI
hostname显示当前节点(宿主机)的主机名
capabilities显示该节点宿主机和客户机的架构和特性
freecell显示当前NUMA单元的可用空闲内存
nodememstats <cell>显示该节点额某个内存单元使用情况的统计
connect <URL>连接到URL指示的Hypervisor
nodecpustats <cpu-num>显示该节点某个CPU使用情况的统计
qemu-attach <pid>根据PID添加一个QEMU进程到libvirt中

  如下所示:

image.png

7.3 网络的管理命令

  virsh可以对节点上的网络接口和分配给域的虚拟网络进行管理。

  下面列出了网络管理中的一小部分常用的virsh命令。

命令功能描述
iface-list显示出物理主机的网络接口列表
iface-mac <if-name >根据网络接口名查询其MAC地址
iface-name <MAC>根据MAC地址查询其对应的网络接口名
iface-edit <if-name>编辑一个物理主机的网络 接口的XML配置文件
iface-dumpxml <if-name>以xml格式转存出一个网络接口的状态信息
iface-destroy <if-name>关闭宿主机上一个物理网络接口
net-list列出libvirt管理虚拟网络接口
net-info <net-name>根据名称查询一个虚拟网络的基本信息
net-uuid <net-name>根据名称查询一个虚拟网络的uuid
net-name <net-uuid>根据uudi查询一个虚拟网络的名称
net-create <net.xml>根据一个网络xml文件创建一个虚拟网络
net-edit <net-name>编辑一个虚拟网络的xml文件
net-dumpxml <net-name>转存一个虚拟网络的xml格式到标准输出
net-destroy <net-name>销毁一个虚拟网络

7.4 存储池和存储卷的管理命令

  virsh也可以对节点上的存储池和存储卷进行管理。

  下面列出了对存储池和存储卷管理部分常用的命令 :

命令功能描述
pool-list显示libvirt管理的存储池
pool-info <pool-name>根据一个存储池名称查询其基本信息
pool-uuid <pool-name>根据存储池名称查询其UUID
pool-create <pool.xml>根据xml配置文件的信息创建一个存储池
pool-edit <pool-name>编译一个存储池的xml配置文件
pool-destroy <pool-name>关闭一个存储池
pool-delete <pool-name>删除一个存储池
vol-list <pool-name>查询一个存储池中的存储卷列表
vol-name <vol-key>查询一个存储卷名称
vol-path --pool <pool> <vol-name-or-key>查询一个存储卷的路径
vol-create <vol.xml>根据xml配置文件创建一个存储池
vol-clone <vol-name-path> <name>克隆一个存储卷
vol-delete <vol-name>删除一个存储卷

  另外有一个非常有用的命令virt-clone可以用作虚拟机的克隆使用,备份非常方便。

virt-clone -o old_name -n new_name -f  new_name.img


推荐阅读

欢迎广大开发者来飞腾开发者平台获取更多前沿技术文档及资料

如开发者在使用飞腾产品有任何问题可通过在线工单联系我们



版权所有。飞腾信息技术有限公司 2023。保留所有权利。

未经本公司同意,任何单位、公司或个人不得擅自复制,翻译,摘抄本文档内容的部分或全部,不得以任何方式或途径进行传播和宣传。

商标声明

Phytium和其他飞腾商标均为飞腾信息技术有限公司的商标。

本文档提及的其他所有商标或注册商标,由各自的所有人拥有。

注意

本文档的内容视为飞腾的保密信息,您应当严格遵守保密任务;未经飞腾事先书面同意,您不得向任何第三方披露本文档内容或提供给任何第三方使用。

由于产品版本升级或其他原因,本文档内容会不定期进行更新。除非另有约定,本文档仅作为使用指导,飞腾在现有技术的基础上尽最大努力提供相应的介绍及操作指引,但飞腾在此明确声明对本文档内容的准确性、完整性、适用性、可靠性的等不作任何明示或暗示的保证。

本文档中所有内容,包括但不限于图片、架构设计、页面布局、文字描述,均由飞腾和/或其关联公司依法拥有其知识产权,包括但不限于商标权、专利权、著作权等。非经飞腾和/或其关联公司书面同意,任何人不得擅自使用、修改,复制上述内容。


飞腾开发者
6 声望3 粉丝

飞腾开发者技术小助手,定期分享飞腾技术文档,助力开发者打怪升级。更多材料获取:[链接]