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的开源的云计算方案。
环境信息
系统 | cpu | 内存 | 硬盘 |
---|---|---|---|
centos7.6 | 8C | 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-kvm、libvirt、virt-install、bridge-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>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
virsh net-dumpxml default 命令dump出default的xml的配置信息,在kvm中各种配置信息都是使用xml来定义的。从dump出来的
在kvm中,可以定义不同的网络,主流的是nat和bridge,kvm常用的网络类型大致有如下几种:
- nat模式:在nat模式中,KVM虚拟机之间需要配置与nat对应网段的信息,挂载到同一个设备下的kvm虚拟机完全可以通讯,KVM和虚拟机可以通讯,但是如果想要将kvm虚拟机的服务发布出去,则需要宿主机做DNAT端口映射到对应的虚拟机。nat模式也是KVM默认的模式
- bridge桥接模式:在桥接模式中,kvm可以和宿主机在同一个网段,虚拟机网卡配置和宿主机同网段的IP信息,在同一个网桥下的虚拟机可以互相通讯。网桥是二层设备,通过mac地址通讯,所以不允许配置IP,这个概念在往后的跨物理机的KVM互通配置中非常重要。
- 路由模式:路由模式中虚拟交换机连接到主机的物理网络,可以在不适用NAT的情况下传输流量。虚拟交换机检查所有的流量,通过网络包做出路由决策,在此模式中所有的虚拟机都位于自己的子网中,通过交换机进行路由。
- 隔离模式:在隔离模式中,连接到虚拟交换机中的虚拟机可以互相通讯,也可以和宿主机通讯,但是不会传到宿主机以外的物理机上,也无法从物理机外部获取流量,被完全隔离在虚拟网络中。
网络也是一个比较复杂的东西,如果想要了解更多的信息,可以查阅libvirt的官网关于网络定义的说明,https://libvirt.org/formatnetwork.html
在我的实际的使用中,最常用的就是路由模式了。
在很多的教程中,都使用了手动编辑网桥的配置文件来创建一个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
2
3
4
5
6
7
8
9
10
如上,通过手动创建一个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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
我们可以看到,br0设备获取到了IP地址172.16.8.111,并且enp4s0f0 的master为br0,state为UP。
这种方式的配置好像是对的,但是..在实际的使用中会发现一个问题:
在如上这种手动配置的网桥中,如果重启了宿主机的网络之后,虚拟机的网络会中断,无法和其他设备通讯,并且需要通过virsh shutdown 和virsh 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>
2
3
4
5
6
如上的xml文件中,我们配置了名称为br0并且设备名称也为br0网络
br0 配置kvm的网络名称配置了网络设备的名称 指定为route模式 给这个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>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
上面的一系列操作中,我们定义并且启动了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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
从上面信息中我们看到了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
2
3
4
5
6
系统自动为我们加上了一条到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.6和windows 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.
2
3
4
5
6
7
8
9
10
11
12
如上,安装了一个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
2
3
4
5
6
7
8
9
10
11
12
13
安装完成之后配置好网络信息即可。
# 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.
2
3
4
5
6
7
8
9
10
11
12
13
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驱动下载页面 (opens new window)
# 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 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是不是符合规定,如果不符合将不会被保存
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21