CENTOS7安装KVM虚拟机

1、概述


虚拟化在现实中越来越普遍,如今设备的配置越来越高,如何高效方便的尽可能利用设备的能力是一个很值得研究的探讨的,虚拟化应运而生,伴随着云计算的普及,虚拟化的应用又上了一个新的高度。

虚拟化这个概念最早在1959年被提出,20世界60年代首次出现了虚拟内存和虚拟机,经过一段时期的发展,1998年Vmware公司成立,并在次年推出了基于X86平台的商业虚拟化软件,从此虚拟机进入了一个新的发展阶段。

2003年 xen面世,同一年微软收购了xen获得了虚拟化技术。

随后oracle,redhat,思科,惠普大厂商都在虚拟化领域有自己的产品,虚拟化领域百家齐放。

虚拟化发展经历过数十年的时间,出现过各种各样虚拟化的实现方式,目前主流的大概分为两种:

  • VMM直接运行在硬件平台上,控制所有硬件并管理客户操作系统。
  • VMM运行在一个传统的操作系统中,而客户机操作系统运行在传统的操作系统中,KVM就是这种实现方式。

根据虚拟化的程度和实现方式,又可以分为完全虚拟化、半虚拟化等等,这里我们不深入探讨这些问题。

KVM诞生于2006年,由以色列的 Qumranet 组织开发,并且将源代码贡献给了开源社区。2007年linux内核第一次包含了KVM,2008年红帽收购了Qumranet并接手了KVM,2009年在红帽5.4版本中添加了KVM,此后从Linux 2.6.20 起就作为一模块被包含在 Linux 内核中。

KVM 全称是基于内核的虚拟机(Kernel-based Virtual Machine)KVM 是基于虚拟化扩展(Intel VT 或者 AMD-V)的 X86 硬件的开源的 Linux 原生的全虚拟化解决方案。KVM 中,虚拟机被实现为常规的 Linux 进程,由标准 Linux 调度程序进行调度;虚机的每个虚拟 CPU 被实现为一个常规的 Linux 进程。这使得 KMV 能够使用 Linux 内核的已有功能。但是,KVM 本身不执行任何硬件模拟,需要客户空间程序通过 /dev/kvm 接口设置一个客户机虚拟服务器的地址空间,向它提供模拟的 I/O,并将它的视频显示映射回宿主的显示屏。目前这个应用程序是 QEMU。

实际上KVM仅仅是内核中的一个叫kvm.ko用于管理虚拟CPU和内存的模块,而其他诸如磁盘IO的虚拟化则交由其他软件实现,QEMU就负责硬件虚拟化,在早期QEMU是独立发展的,后面因为各种原因分离出了一个版本专用于KVM,被称为qemu-kvm一直发展至今。

早期虚拟化管理是一个非常复杂的过程,为了解决管理上的问题,redhat公司开发了一个叫Libvirt的虚拟机管理工具,并且也贡献给了开源社区,Libvirt提供了一个通用、稳定、安全、高效的管理工具,并且支持了远程操作,也提供不同语言的SDK。事实上Libvirt不仅仅能管理KVM,也能管理其他的虚拟机,详细可以查看官网的文档。

KVM在虚拟机领域是一个比较新的成员,如今遇上了云计算的潮流,目前主流的云计算厂商例如AWS、阿里云等都采用了KVM的虚拟机方案,基于云计算的概念也发展出了诸如OpenStack的开源的云计算方案。

虚拟机发展历程和KVM的历程不深入探讨,有兴趣的小伙伴可以自行查找资料。本文将为大家带来如何安装使用KVM虚拟机。

环境信息

系统 CPU 内存 磁盘
centos 7.6 8核 8G 500G

2、环境检测


KVM基于X86虚拟化扩展技术的虚拟机软件,所以需要CPU支持 Intel VT 或者 AMD-V

cat /proc/cpuinfo | egrep 'vmx|svm'

如果有返回信息,这说明当前CPU支持并且开启了虚拟化扩展

3、KVM环境安装


一套完成的KVM虚拟机大致包含如下软件:

  • qemu-kvm 主要的KVM程序包
  • libvirt C语言工具包,提供libvirt服务
  • virt-install 基于libvirt服务的虚拟机创建命令
  • bridge-utils 创建和管理桥接设备的工具
  • python36-libvirt python3客户端
  • virt-manager GUI虚拟机管理工具
  • virt-top 虚拟机统计命令
  • virt-viewer GUI连接程序,连接到已配置好的虚拟机
  • libvirt-client 为虚拟客户机提供的C语言工具包

其中qemu-kvmlibvirtvirt-installbridge-utils这四个软件我们必须安装。其他的按需安装。

因为我们的宿主机是centos7.6最小化安装的,所以就不安装GUI管理工具了

yum install -y qemu-kvm libvirt virt-install bridge-utils # 安装
systemctl start libvirtd # 启动libvirtd
systemctl enable libvirtd # 设置开机自启动libvirtd

执行以上操作之后虚拟机环境就安装完成了。建议安装完成之后重启服务器,并且在重启之后检查是否正确加载了内核模块

[root@localhost ~]# lsmod | grep kvm
kvm_intel             183621  0 
kvm                   586948  1 kvm_intel
irqbypass              13503  1 kvm

如上,说明正确加载了内核模块

建议使用阿里云的repo仓库。虚拟机安装也建议使用yum安装,如果需要编译安装可以参考官方文档

4、虚拟机网络配置


4.1、虚拟机网络模式

安装好kvm之后,默认会创建一个default的网络,设备名称为virbr0,我们先看一下这个网络的信息

[root@localhost ~]# virsh net-list --all
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 default              active     yes           yes

如上virsh net-list --all命令会列出所有的网络,如果不加--all参数只会列出active状态的网络。

[root@localhost ~]# virsh net-dumpxml default
<network>
  <name>default</name>
  <uuid>3eaed894-4b0a-4de1-9177-7b56bff63c80</uuid>
  <forward mode='nat'>
    <nat>
      <port start='1024' end='65535'/>
    </nat>
  </forward>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='52:54:00:f5:32:49'/>
  <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>

virsh net-dumpxml default 命令dump出default的xml的配置信息,在kvm中各种配置信息都是使用xml来定义的。从dump出来的<forward mode='nat'>信息中我们看到这个网络类型为nat,并且定义了网段信息,dhcp可用IP范围等信息。

在kvm中,可以定义不同的网络,主流的是natbridge,kvm常用的网络类型大致有如下几种:

  • nat模式:在nat模式中,KVM虚拟机之间需要配置与nat对应网段的信息,挂载到同一个设备下的kvm虚拟机完全可以通讯,KVM和虚拟机可以通讯,但是如果想要将kvm虚拟机的服务发布出去,则需要宿主机做DNAT端口映射到对应的虚拟机。nat模式也是KVM默认的模式
  • bridge桥接模式:在桥接模式中,kvm可以和宿主机在同一个网段,虚拟机网卡配置和宿主机同网段的IP信息,在同一个网桥下的虚拟机可以互相通讯。网桥是二层设备,通过mac地址通讯,所以不允许配置IP,这个概念在往后的跨物理机的KVM互通配置中非常重要。
  • 路由模式:路由模式中虚拟交换机连接到主机的物理网络,可以在不适用NAT的情况下传输流量。虚拟交换机检查所有的流量,通过网络包做出路由决策,在此模式中所有的虚拟机都位于自己的子网中,通过交换机进行路由。
  • 隔离模式:在隔离模式中,连接到虚拟交换机中的虚拟机可以互相通讯,也可以和宿主机通讯,但是不会传到宿主机以外的物理机上,也无法从物理机外部获取流量,被完全隔离在虚拟网络中。

网络也是一个比较复杂的东西,如果想要了解更多的信息,可以查阅libvirt的官网关于网络定义的说明,点击此处查阅

在我的实际的使用中,最常用的就是路由模式了。

在很多的教程中,都使用了手动编辑网桥的配置文件来创建一个linux网桥。

[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0 
TYPE=Bridge
BOOTPROTO=dhcp
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
NAME=br0
DEVICE=br0
ONBOOT=yes

如上,通过手动创建一个br0网桥,然后在物理接口配置文件里将物理机接口挂到这个虚拟网桥中

[root@KVM-01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-enp4s0f0
TYPE=Ethernet
BOOTPROTO=dhcp
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
NAME=enp4s0f0
UUID=ee1e24a8-a5fd-44f4-bb7a-159c84da9447
DEVICE=enp4s0f0
ONBOOT=yes
BRIDGE=br0

如上的物理网卡配置中BRIDGE=br0配置了将这个物理接口挂载到了br0网桥下,并且通过DHCP获取IP地址。

最终的结果

[root@KVM-01 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: enp4s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP qlen 1000
    link/ether 80:c1:6e:74:f1:78 brd ff:ff:ff:ff:ff:ff
3: enp4s0f1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 80:c1:6e:74:f1:79 brd ff:ff:ff:ff:ff:ff
4: enp4s0f2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 80:c1:6e:74:f1:7a brd ff:ff:ff:ff:ff:ff
5: enp4s0f3: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 80:c1:6e:74:f1:7b brd ff:ff:ff:ff:ff:ff
6: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
    link/ether 80:c1:6e:74:f1:78 brd ff:ff:ff:ff:ff:ff
    inet 172.16.8.111/16 brd 172.16.255.255 scope global dynamic br0
       valid_lft 215588sec preferred_lft 215588sec
7: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN qlen 1000
    link/ether 52:54:00:a3:1c:78 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever

我们可以看到,br0设备获取到了IP地址172.16.8.111,并且enp4s0f0 的master为br0,state为UP

这种方式的配置好像是对的,但是..在实际的使用中会发现一个问题:

在如上这种手动配置的网桥中,如果重启了宿主机的网络之后,虚拟机的网络会中断,无法和其他设备通讯,并且需要通过virsh shutdownvirsh start命令重启虚拟机之后才会恢复。

这肯定不是我们想要的,我们需要重启宿主机网络之后并不影响KVM虚拟机的网络。

在KVM中已经提供了网络管理工具,通过KVM提供的工具就可以解决这个问题。

4.2、创建xml

我们以创建一个route模式的bro为例创建一个虚拟网络。

<network>
  <name>br0</name>
  <bridge name="br0" />
  <forward mode="route" />
  <ip address="192.168.8.1" netmask="255.255.255.0"/>
</network>

如上的xml文件中,我们配置了名称为br0并且设备名称也为br0网络

  • <name>br0</name> 配置kvm的网络名称
  • <bridge name="br0" /> 配置了网络设备的名称
  • <forward mode="route" /> 指定为route模式
  • <ip address="192.168.8.1" netmask="255.255.255.0"/> 给这个br0设备配置一个出口的IP

在路由模式中,必须而且仅有一个出口的IP信息,可以认为是虚拟网络的出口网关,通过这个IP可以和宿主通讯。同时这个IP也属于宿主机,也就是说通过这个IP可以直接访问到宿主机本身,这个概念对我们以后的跨物理机管理也非常重要。

在上面的xml我们并没有定义mac地址等,这些信息kvm会自动补上,无需当心,手动定义可能还会出现mac地址冲突等问题。

4.3、定义网络

[root@localhost ~]# virsh net-define net.xml  # 从xml文件定义网络br0
Network br0 defined from net.xml
[root@localhost ~]# virsh net-list --all  # 查看所有的网络
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 br0                  inactive   no            yes
[root@localhost ~]# virsh net-start  br0 # 启动网络br0
Network br0 started
[root@localhost ~]# virsh net-autostart  br0 # 开机自启动br0
Network br0 marked as autostarted
[root@localhost ~]# virsh net-dumpxml  br0 # 查看br0的详细配置
<network>
  <name>br0</name>
  <uuid>3dcfb28b-d434-4293-992e-c8adba739d1a</uuid>
  <forward mode='route'/>
  <bridge name='br0' stp='on' delay='0'/>
  <mac address='52:54:00:65:75:1e'/>
  <ip address='192.168.8.1' netmask='255.255.255.0'>
  </ip>
</network>

上面的一系列操作中,我们定义并且启动了br0网络,在xml的文件中我们并没有配置mac地址信息,在dump出来的xml有了mac地址的信息,这个是libvirt自动帮我们加上去的。

我们看看系统的网络设备信息

[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:e0:81:d3:57:ad brd ff:ff:ff:ff:ff:ff
    inet 172.16.8.189/16 brd 172.16.255.255 scope global noprefixroute dynamic enp3s0
       valid_lft 172633sec preferred_lft 172633sec
    inet6 fe80::3398:7712:b754:1d3b/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: enp2s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether 00:e0:81:d3:57:ac brd ff:ff:ff:ff:ff:ff
6: br0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether 52:54:00:65:75:1e brd ff:ff:ff:ff:ff:ff
    inet 192.168.8.1/24 brd 192.168.8.255 scope global br0
       valid_lft forever preferred_lft forever
7: br0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master br0 state DOWN group default qlen 1000
    link/ether 52:54:00:65:75:1e brd ff:ff:ff:ff:ff:ff

从上面信息中我们看到了br0已经启动了,并且配置了192.168.8.1的IP地址。

我们再来查看一下系统的路由信息

[root@localhost ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.16.0.8      0.0.0.0         UG    100    0        0 enp3s0
172.16.0.0      0.0.0.0         255.255.0.0     U     100    0        0 enp3s0
192.168.8.0     0.0.0.0         255.255.255.0   U     0      0        0 br0

系统自动为我们加上了一条到192.168.8.0/24网段的路由信息,这个网段的流量发送到接口br0上。

我们再来说说这个br0配置的192.168.8.1这个IP,我们创建了一台虚拟机,并且将虚拟机加入到br0的网络中,虚拟机只要配置192.168.8.0/24网段的IP就能与外界通讯。

外部流量到达宿主机,宿主机通过路由表选择将流量发到br0中,br0是网桥,在网桥内部通过mac地址将数据包发送给指定的KVM虚拟机,而对于虚拟机来说,此时的出口就应该需要指定到192.168.8.1 即可将流量发到br0上,然后再由宿主机路由表选择将包发到对应的接口,完成整个通讯的过程。

因为192.168.8.1这个IP属于宿主机,所以外部能到达192.168.8.1就能直接访问到宿主机本机。

4.4、跨宿主机KVM互通

同一个宿主机内的kvm可以通讯了,那么跨宿主机的KVM如何通讯呢?

br0是一个二层的设备,靠mac地址通讯,所以只能br0能学习到mac就可以通讯。那么怎么学习到跨宿主机的KVM的mac地址呢?

在我实际的经验中,我通常借助内网物理交换机。服务器上有多个网口,将其中一个物理网口加入到br0网络,然后再将这个网口通过网线接入到物理交换机中,每一台宿主机都这样配置,就可以将br0通过物理交换机级联起来,从而打造了一个跨宿主机的二层交换环境,这样所有的kvm虚拟机就可以互通有无了。

kvm的网络是建立在linux的虚拟网桥上,如果想要更多的功能可以使用Open vSwitch构建一个更强大的虚拟网络。

5、安装虚拟机


解决了网络问题之后我们开始安装虚拟机,这里我们演示centos 7.6windows 2012 R2的安装。

安装前要设置环境语言为英文LANG="en_US.UTF-8",如果是中文的话某些版本可能会报错。CentOS 7 请修改/etc/locale.conf

5.1、Linux虚拟机安装

[root@localhost centos7]# virt-install --virt-type=kvm --os-type=linux --os-variant=centos7.0 --name=centos7  --vcpus=2 --ram 4096 \
> --disk path=/vm/disk/centos7/vda.qcow2,bus=virtio,cache=none,size=40  \
> --cdrom /vm/iso/CentOS-7.6-x86_64-Minimal-1810.iso  \
> --network bridge=br0,model=virtio --noautoconsole  \
> --vnc --vncport=5901 --vnclisten=0.0.0.0

Starting install...
Allocating 'vda.qcow2'                                                       40 GB  00:00:00
Domain installation still in progress. You can reconnect to 
the console to complete the installation process.

如上,安装了一个centos系统,在安装的参数中:

  • --virt-type:指定虚拟机的类型,上文中我们说到libvirt不仅能管理kvm,还能管理其他的虚拟机。
  • --os-type:指定安装的系统类型linux或者windows
  • --os-variant:针对不同的操作系统进一步优化虚拟机的配置,这个参数是可选的,而且不一定需要和--os-type一起使用。具体的选值可以通过osinfo-query os查看。
  • --name:指定一个名称方便虚拟机管理,这个名称要全局唯一。
  • --vcpus:配置虚拟机的虚拟CPU数量
  • --ram:配置虚拟机的虚拟内存,单位为:M
  • --disk:指定虚拟磁盘,其中:path:指定磁盘的路径,需要绝对路径。bus:配置总线类型为virtio。cache:配置缓存模式。size:指定虚拟磁盘大小,单位为:G。
  • --cdrom:指定光驱文件,系统从光驱读取安装。
  • --vnc:配置使用VNC
  • --vncport:配置VNC的端口
  • --vnclisten:配置VNC监听的IP
  • --network:配置网络设备,其中:bridge:指定挂载到哪个网桥设备中。model:网卡模式。
  • --noautoconsole:不自动试图连接到客户机控制台

创建好了虚拟机之后,可以通过VNC客户端链接到宿主机IP:vncport进行正常的系统安装。

在安装完成之后点击REBOOT按钮之后并不会重启虚拟机,而是会直接关闭虚拟机,需要到宿主机中启动虚拟机。

当然,如果你不想使用VNC图形化安装系统,你可以删除VNC的相关参数并且修改cdrom为location,添加--graphics none --extra-args='console=ttyS0' --force参数就可以使用文字界面安装系统。

[root@localhost centos7]# virt-install --virt-type=kvm --os-type=linux --os-variant=centos7.0 --name=centos7  --vcpus=2 --ram 4096 \
> --disk path=/vm/disk/centos7/vda.qcow2,bus=virtio,cache=none,size=40  \
> --location /vm/iso/CentOS-7.6-x86_64-Minimal-1810.iso  \
> --network bridge=br0,model=virtio \
> --graphics none --extra-args='console=ttyS0' --force

Starting install...
Retrieving file .treeinfo...                                                       |  354 B  00:00:00
Retrieving file vmlinuz...                                                         | 6.3 MB  00:00:00
Retrieving file initrd.img...                                                      |  50 MB  00:00:00
Allocating 'vda.qcow2'                                                             |  40 GB  00:00:00
Connected to domain centos7

安装完成之后配置好网络信息即可。

5.2、windows虚拟机安装

[root@localhost iso]# virt-install --virt-type=kvm --os-type=windows \
> --os-variant=win2k12r2 --name=windows2012r2 --vcpus=4 --ram 4096  \
> --disk path=/vm/disk/windows2012r2/c.qcow2,format=qcow2,bus=virtio,cache=none,size=40 \
> --cdrom /vm/iso/cn_windows_server_2012_r2_vl_x64_dvd_2979220.iso \
> --disk path=/vm/iso/virtio-win-0.1.173_amd64.vfd,device=floppy  \
> --vnc --vncport=5902 --vnclisten=0.0.0.0 \
> --network bridge=br0,model=virtio --noautoconsole

Starting install...
Allocating 'c.qcow2'                                                          |  40 GB  00:00:02     
Domain installation still in progress. You can reconnect to 
the console to complete the installation process.

windows安装参数和linux的差不多,在windows中,我们多加了一个--disk path=/vm/iso/virtio-win-0.1.173_amd64.vfd,device=floppy,此参数加载了一个软盘,指定了一个vfd软盘镜像。

和linux安装一样,我们使用了virtio,在linux中自带了virtio的驱动,所以我们并不需要额外在安装驱动,而windows镜像是不带virtio驱动的,如果没有加载virtio驱动,那么在windows的安装程序中是无法识别磁盘的。在此处加载了一个virtio驱动软驱,然后在安装程序中磁盘分区页面搜索加载磁盘驱动即可。

特别说明的是,不仅仅要准备virtio的软驱镜像,还需要下载一个完整的virtio的iso光驱镜像,系统安装好之后需要挂载到系统中安装virtio驱动,否则网卡和一些主板的驱动将无法识别。

Virtio是一种半虚拟化的解决方案,能够大幅提高虚拟机的I/O性能。virtio驱动下载页面

6、虚拟机管理命令


libvirt提供了一个命令行的管理客户端virsh,通过此客户端工具可以方便的管理kvm虚拟机。

可以通过virsh --help 获得帮助信息,帮助信息是我们学习客户端的重要方式。本篇中介绍一些常用的虚拟机管理。

6.1 虚拟机生命管理

[root@localhost disk]# virsh list --all # 查看所有虚拟机,如果不加`--all`则查看正在运行中的虚拟机
 Id    Name                           State
----------------------------------------------------
 -     centos7                        shut off

[root@localhost disk]# virsh start centos7 # 启动`centos7`虚拟机
Domain centos7 started

[root@localhost disk]# virsh shutdown centos7 # 关闭`centos7`虚拟机
Domain centos7 is being shutdown

[root@localhost disk]# virsh shutdown centos7 # 关闭`centos7`虚拟机
Domain centos7 is being shutdown

[root@localhost disk]# virsh destroy centos7 # 销毁`centos7`虚拟机,相当于物理机中的强制断电,既然是销毁,就必须要在运行的状态下才能销毁
Domain centos7 destroyed

[root@localhost disk]# virsh autostart centos7 # 开机自启动`centos7`,在宿主机重启的时候自动启动虚拟机,前提条件是`libvirtd`也必须设置为开机自启动
Domain centos7 marked as autostarted

6.2 虚拟机信息管理

上面说到,libvirt通过xml来定义虚拟机,我们也可以通过编辑xml来修改虚拟机的信息。

[root@localhost ~]# virsh define /root/kvm.xml  # 从xml文件定义虚拟机,就相当于创建虚拟机
Domain centos7 defined from /root/kvm.xml

[root@localhost ~]# virsh undefine centos7 # 取消定义`centos7`虚拟机,必须要在关机的状态下才能undefine
Domain centos7 has been undefined
[root@localhost ~]# virsh define /root/kvm.xml  # 从xml文件定义虚拟机,就相当于创建虚拟机
Domain centos7-base defined from /root/kvm.xml
[root@localhost disk]# virsh dumpxml centos7 # 导出 `centos7` 虚拟机的xml信息,可以通过重定向将信息写入到其他文件中
<domain type='kvm'>
  <name>centos7</name>
  <uuid>34a3f666-c4af-405a-8921-ffc5d928ae92</uuid>
  <memory unit='KiB'>4194304</memory>
  <currentMemory unit='KiB'>4194304</currentMemory>
  <vcpu placement='static'>2</vcpu>
    .......
  </devices>
</domain>
[root@localhost disk]# virsh edit centos7 # 编辑 `centos7` 虚拟机信息,编辑操作和vim操作一致,有一些唯一值信息比如`uuid`等不允许编辑。
# 在保存退出时 libvirt会检查编辑后的xml是不是符合规定,如果不符合将不会被保存

版权说明:本文系博主通过各种渠道学习整理发表或者全文转载自其他平台,作为学习笔记,不能保证所有知识点是完全正确以及表达无误,用于生产环境配置时请斟酌。如有错误或建议请联系。转载请注明出处,侵删联系:linuxops@qq.com。感谢各位!