【写在前面】飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力,聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域,包含了应用使能套件、软件仓库、软件支持、软件适配认证四大板块,旨在共享尖端技术,为开发者提供一个涵盖多领域的开发平台和工具套件。点击这里开始你的技术升级之旅吧
本文分享至飞腾开发者平台《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》内核配置或者设备树有问题。
安装命令:
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协议,后续我们会源码编译安装。
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
值得注意的是,有可能会报一个权限错误如下图所示:
这个错误原因是因为文件目录没有加入acl 权限,比如安装镜像放在/root目录下,就需要将qemu添加acl权限:
setfacl -m u:qemu:rx /root/
这样就不会报权限错误了。
进入安装界面:
每个都进入设置,每个都设置完成后,如下图所示,输入b就可以进入下一步,等待安装完成。
安装完成后会重启进入系统,至此一个最简单的虚拟机安装已经完成。
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目录之中,如下:
下面简单介绍其中几个重要配置文件和目录。
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连接,通常是远程连接的别名。如下所示,#开头的是注释:
其中,为了演示,配置了remote1这个别名,用于指代qemu+ssh://root@192.168.137.200/system这个远程的libvirt连接。有了这个别名后,就可以在用virsh等工具或者自己写的代码调用libvirt API时使用这个别名,而不需要写完整的、冗长的 URL连接标识符了。用virsh使用这个别名操作如下:
在代码中调用libvirt API时也可以使用这个别名来建立连接,如下的python代码行就实现了这个别名来建立连接:
conn = libvirt.openReadOnly('remote1')
4) /etc/libvirt/qemu目录
在qemu目录下,存放的是虚拟机域的配置文件。查看qemu目录如下:
其中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运行状态 |
在默认情况下,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时,查看宿主机中网桥的使用情况如下:
其中这个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命令补齐。如下所示:
在非交互模式下,直接使用virsh命令带参数即可。如下所示:
另外在某个节点上使用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中 |
如下所示:
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和其他飞腾商标均为飞腾信息技术有限公司的商标。
本文档提及的其他所有商标或注册商标,由各自的所有人拥有。
注意
本文档的内容视为飞腾的保密信息,您应当严格遵守保密任务;未经飞腾事先书面同意,您不得向任何第三方披露本文档内容或提供给任何第三方使用。
由于产品版本升级或其他原因,本文档内容会不定期进行更新。除非另有约定,本文档仅作为使用指导,飞腾在现有技术的基础上尽最大努力提供相应的介绍及操作指引,但飞腾在此明确声明对本文档内容的准确性、完整性、适用性、可靠性的等不作任何明示或暗示的保证。
本文档中所有内容,包括但不限于图片、架构设计、页面布局、文字描述,均由飞腾和/或其关联公司依法拥有其知识产权,包括但不限于商标权、专利权、著作权等。非经飞腾和/或其关联公司书面同意,任何人不得擅自使用、修改,复制上述内容。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。