• Post author:
  • Post category:虚拟化
  • Post comments:0评论
71

一、虚拟化基本概念

  这里简单了解一下,虚拟化细说还是挺繁杂的,本文重点是KVM虚拟机的使用
  这里引用维基百科对虚拟化技术的定义:在计算机技术中,虚拟化是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破了实体结构间的不可切割的障碍,使用户可以用比原来的组态更好的方式来应用这些资源。
  总体来说,虚拟化的核心是对资源的抽象和分割,目标往往是为了在一台主机(Host OS)上同时运行多个计算机操作系统(Guest OS),每个虚拟机可以运行不同的操作系统,并且都是相互独立互不影响的,从而显著提高了系统资源的利用率。
  从计算机系统层次结构入手,总体来说,虚拟化可分为硬件抽象层的虚拟化(QEMU、VMware、KVM、Xen)、操作系统层的虚拟化(docker)、函数层的虚拟化(WINE)、编程语言层的虚拟化(JVM)。
  以硬件抽象层面的虚拟化为例,其可分为全虚拟化、硬件辅助虚拟化和半虚拟化
  全虚拟化:利用软件模拟出完整的底层硬件环境和特权指令执行过程(捕获、翻译)使客户机操作系统独立运行。典型代表VMware、QEMU。
  硬件辅助虚拟化:利用硬件辅助支持处理敏感指令来实现完全虚拟化,这个硬件辅助主要还是支持虚拟化的CPU,目前X86体系结构上可用的硬件辅助虚拟化技术有Intel-VT和AMD-V。典型代表KVM、Xen、VMware。
  半虚拟化:和全虚拟化一样也是通过VMM来分享底层硬件,但是需要修改Guest OS内核(全虚拟化是不需要的这是它们最大的区别),可以说会让Guest OS意识到自己处于虚拟化环境,从而使Guest OS将和敏感指令相关的操作都主动转换发给VMM,就不会有类似上面全虚拟化VMM捕获和翻译的过程了,降低了性能开销。典型代表Xen(也支持全虚拟化)。

二、KVM介绍

  KVM是一个开源的系统内核虚拟化模块,自Linux内核版本2.6.20之后它集成到各个主要发行版本中,它使用Linux自身的调度器进行管理,相当于将Linux变成了一个hypervisor(也称VMM,虚拟机监视器),Guest OS是运行在Ring 0下的。
  这样一来,Guest OS可以直接访问底层硬件,而不需要经过VMM。当Guest OS执行到敏感指令的时候,系统会让VMM来处理,减少了大量的系统性能开销。
  KVM的虚拟化需要硬件辅助支持,如Intel-VT技术或者AMD-V技术,是基于硬件辅助的完全虚拟化。不过光靠KVM自己是无法完成整个完全虚拟化的,像I/O层面的虚拟化就需要借助QEMU来实现。

三、创建KVM虚拟机

1、安装相关管理工具

[root@kvm01 ~]# lsmod | grep kvm   # 查看是否加载了kvm虚拟化模块。VMware虚拟机默认没有开启,勾选Intel VT虚拟化即可。
kvm_intel             183621  3 
kvm                   586948  1 kvm_intel
irqbypass              13503  3 kvm

[root@kvm01 ~]# yum install -y libvirt virt-install qemu-kvm

 相关软件介绍:
  libvirt:虚拟机的管理软件
  virt-install:虚拟机的安装工具和克隆工具
  qemu-kvm:用来管理虚拟机的虚拟I/O设备


2、创建KVM虚拟机

[root@kvm01 ~]# systemctl start libvirtd
[root@kvm01 ~]# virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name test --memory 1024 --vcpus 1 --disk /opt/test.raw,format=raw,size=10 --cdrom /tmp/CentOS-7-x86_64-Minimal-1511.iso --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole

 选项说明:
  --virt-type kvm      虚拟化的类型
  --os-type=linux      系统类型
  --os-variant rhel7   系统版本
  --name centos7       虚拟机的名字,名字必须唯一
  --memory 1024        虚拟机的内存(MB)
  --vcpus 1            虚拟cpu的核数
  --disk /opt/centos2.raw,format=raw,size=10      磁盘文件位置、格式、大小(G)
  --cdrom /tmp/CentOS-7-x86_64-Minimal-1511.iso   系统光盘,此为centos7.2最小安装版镜像,可通过清华源、阿里源获取。
  --network network=default        网络设置,使用默认(NAT模式)
  --graphics vnc,listen=0.0.0.0    用户访问显示设置,设置为vnc,接下面我们会使用vnc连接
  --noautoconsole      不要自动尝试连接到控制台


3、连接KVM虚拟机
  对于虚拟机的连接,这里我们使用vnc去连接虚拟机。vnc需要安装在本地windows上,官方下载地址:https://www.realvnc.com/en/connect/download/viewer/

[root@kvm01 ~]# virsh list
 Id    Name                           State
----------------------------------------------------
 10    test                           running

[root@kvm01 ~]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:5900            0.0.0.0:*               LISTEN      24628/qemu-kvm   

对于端口也可以通过查看虚拟机的配置获得
[root@kvm01 ~]# virsh dumpxml test |grep vnc
    <graphics type='vnc' port='5900' autoport='yes' listen='0.0.0.0'>

注意端口不是不变的,一般第一个启动的虚拟机自动占用5900,其余依次往后加一。
 假如,你现在有两台虚拟机test1、test2,依次启动,test1对应5900,test2对应5901。
 关闭test1,再重新启动test1,因为5900空出来了,所以占用5900。
 如果在启动test1前先启动一台test3,那么test3就会占用5900,因为5900空出来了。
 当你启动test1时,因为5900、5901都被占用,所以test1往后推会占用5902。

通过virsh命令查询vnc端口号
[root@kvm01 ~]# virsh vncdisplay test
:0

可以通过查询出来的信息进行连接,即10.0.0.10:0等价于10.0.0.10:5900,实质上还是通过5900的。

  通过上面我们可以看到虚拟机是运行状态,监听端口是5900。随后我们通过vnc去连接就可以看到熟悉的安装界面了。

  通过vnc连接虚拟机安装好系统后,我们可以通过console的方式连接,不过要到虚拟机中修改下内核参数。

[root@localhost ~]# grubby --update-kernel=ALL --args="console=ttyS0,115200n8"
[root@localhost ~]# reboot

[root@kvm01 ~]# virsh console test
Connected to domain test
Escape character is ^]

CentOS Linux 7 (Core)
Kernel 3.10.0-327.el7.x86_64 on an x86_64

localhost login: root
Password: 
Last login: Wed Nov 18 20:02:36 on ttyS0
[root@localhost ~]# 

注:
  回到宿主机:ctrl+]
  注意,进入虚拟机中,如果发现网卡没有 ip 无法上网,请执行 dhclient 命令。

四、KVM虚拟机基本管理

1、查看虚拟机
[root@kvm01 ~]# virsh list --all     # 不加--all,只能列出运行或者挂起的虚拟机
 Id    Name                           State
----------------------------------------------------
 12    test                           running

2、关闭虚拟机
(1)正常关闭(对未装系统的虚拟机不生效)
[root@kvm01 ~]# virsh shutdown  test

(2)强制关闭(断电)
[root@kvm01 ~]# virsh destroy test

3、重启虚拟机
[root@kvm01 ~]# virsh reboot test

4、导出虚拟机配置(虚拟机配置文件位置/etc/libvirt/qemu)
[root@kvm01 ~]# virsh dumpxml test > /backup/test.xml

5、修改虚拟机配置(自带语法检查)
[root@kvm01 ~]# virsh edit test

6、删除虚拟机配置文件
[root@kvm01 ~]# virsh undefine test

7、导入虚拟机配置
[root@kvm01 ~]# virsh define /backup/test.xml 

8、重命名虚拟机(虚拟机要处于关机状态)
[root@kvm01 ~]# virsh domrename test test1

9、挂起虚拟机
[root@kvm01 ~]# virsh suspend test

10、恢复挂起虚拟机
[root@kvm01 ~]# virsh resume test

11、虚拟机开机自启(libvirtd服务也必须要开机自启)
[root@kvm01 ~]# virsh autostart test

12、取消虚拟机开机自启
[root@kvm01 ~]# virsh autostart --disable test

五、桥接网络

  KVM虚拟机的常用的网络模式:nat模式和bridge桥接模式。需要注意的是要关闭NetworkManager服务,不关可能会出现问题。
  两种模式区别如下:
   • nat:数据包借助NAT方式通过宿主机的接口进行转发,可以访问公网,但是无法从外部访问虚拟机网络,所以一般不会用到。
   • bridge:这种模式允许虚拟机像局域网中一台独立的主机样拥有网络(宿主机和虚拟机处于对等地位),外部的机器可以直接访问到虚拟机内部。
  创建虚拟机时指定网络模式选项:

nat:--network network=default(默认为nat模式) 

bridge:--network bridge=br0

  将前面创建的虚拟机的网络模式修改为桥接模式。

1、创建桥接网卡
[root@kvm01 ~]# virsh iface-bridge ens33 br0

以上命令意思为:创建一个名为br0的网桥设备,ens33接口的所有IP地址配置将移至新的网桥设备,并将现有的网络设备接口连接到新的网桥
取消命令:virsh iface-unbridge br0

[root@kvm01 ~]# ip a show ens33 && ip a show br0
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
    link/ether 00:0c:29:e6:a5:cc brd ff:ff:ff:ff:ff:ff
    inet6 fe80::20c:29ff:fee6:a5cc/64 scope link 
       valid_lft forever preferred_lft forever
4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:0c:29:e6:a5:cc brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.10/24 brd 10.0.0.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fee6:a5cc/64 scope link 
       valid_lft forever preferred_lft forever

2、关闭虚拟机修改配置更改网络模式
[root@kvm01 ~]# virsh shutdown test
[root@kvm01 ~]# virsh edit test     # 修改以下配置
    <interface type='bridge'>
      <source bridge='br0'/>

3、启动查看
[root@kvm01 ~]# virsh start test
[root@kvm01 ~]# virsh console test
[root@localhost ~]# dhclient
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:09:37:7b brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.132/24 brd 10.0.0.255 scope global dynamic eth0
       valid_lft 1798sec preferred_lft 1798sec
    inet6 fe80::5054:ff:fe09:377b/64 scope link 
       valid_lft forever preferred_lft forever

此时我们可以看到虚拟机的ip已经为10.0.0.0网段了,这个时候我们可以直接在物理机上通过Xshell连接。

六、虚拟磁盘和快照管理

1、 虚拟磁盘管理

  KVM虚拟机中的磁盘镜像的格式,常用的通常有两种,分别是raw和qcow2。
   • raw:也称裸格式,占用空间比较大,不支持快照功能,读写性能较好,方便传输。
   • qcow2: 占用空间小,支持快照功能,读写性能比raw差一点,方便传输,支持写时拷贝(COW, copy on write),支持zlib的磁盘压缩,支持AES的加密,这种格式多适用于云。
  创建虚拟机时指定磁盘格式选项:

raw:--disk /opt/test.raw,format=raw,size=10 

qcow2:--disk /opt/test.qcow2,format=qcow2,size=10 

  磁盘工具的常用命令

(1)查看虚拟磁盘信息
[root@kvm01 ~]# qemu-img info /opt/test.raw

(2)创建虚拟磁盘:
[root@kvm01 ~]# qemu-img create -f raw test1.raw 1G

(3)调整磁盘磁盘容量
[root@kvm01 ~]# qemu-img resize test1.raw +1G   # 加1G
[root@kvm01 ~]# qemu-img resize test1.raw 5G    # 调整到5G

(4)磁盘格式转换
[root@kvm01 ~]# qemu-img convert -f raw -O qcow2 test1.raw test1.qcow2  # -f:源镜像的格式;-O:目标镜像的格式
[root@kvm01 ~]# ll -h
-rw-r--r-- 1 root root 193K Nov 19 07:48 test1.qcow2
-rw-r--r-- 1 root root 1.0G Nov 19 07:48 test1.raw
[root@kvm01 ~]# du -h test1.qcow2   # 稀疏文件,现在基本上是元数据占用的空间
196K    test1.qcow2
[root@kvm01 ~]# du test1.raw        # 空洞文件,所以实际上占用的物理空间为0
0   test1.raw

  将前面创建的虚拟机的虚拟磁盘格式转换为qcow2格式。

(1)转换磁盘格式
[root@kvm01 opt]# qemu-img convert -f raw -O qcow2 test.raw test.qcow2

(2)关闭虚拟机修改配置文件
[root@kvm01 ~]# virsh shutdown test
[root@kvm01 ~]# virsh edit test     # 修改以下配置
      <driver name='qemu' type='qcow2'/>
      <source file='/opt/test.qcow2'/>

(3)启动测试
[root@kvm01 opt]# virsh start test
[root@kvm01 opt]# virsh console test

2、快照管理

注意前面说过raw格式不支持快照,qcow2格式才支持。

(1)创建快照
[root@kvm01 ~]# virsh snapshot-create test

(2)查看快照
[root@kvm01 ~]# virsh snapshot-list test
 Name                 Creation Time             State
------------------------------------------------------------
 1605791751           2020-11-19 08:15:51 -0500 running

(3)为快照指定别名
前面我们可以看到,创建的快照的默认名字为unix时间戳,看起来非常不直观,我们可以创建快照时指定别名。
[root@kvm01 ~]# virsh snapshot-create-as test --name test1
Domain snapshot test1 created
[root@kvm01 ~]# virsh snapshot-list test
 Name                 Creation Time             State
------------------------------------------------------------
 1605791751           2020-11-19 08:15:51 -0500 running
 test1                2020-11-19 08:18:19 -0500 running

(4)删除快照
[root@kvm01 ~]# virsh snapshot-delete test 1605791751

(5)还原快照
[root@kvm01 ~]# virsh snapshot-revert test --snapshotname test1

七、克隆

  KVM虚拟机克隆方式有两种,分别是完整克隆和链接克隆
   • 完整克隆:源虚拟机和新克隆虚拟机,完全独立,克隆时间长,占用磁盘空间多。
   • 链接克隆:新克隆引用源虚拟机磁盘,依赖源虚拟机,克隆时间短,占用空间少。

1、完整克隆

自动克隆

[root@kvm01 opt]# virsh shutdown test
[root@kvm01 opt]# virt-clone --auto-clone -o test -n test1  # 不克隆快照
[root@kvm01 opt]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     test                           shut off
 -     test1                          shut off

[root@kvm01 opt]# qemu-img info test.qcow2 
image: test.qcow2
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 1.2G
cluster_size: 65536
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
2         test1                  214M 2020-11-19 08:18:19   00:18:25.658

[root@kvm01 opt]# qemu-img info test1.qcow2 
image: test1.qcow2
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 991M
cluster_size: 65536

用disk size减去快照大小就是克隆后的磁盘大小。那么为什么ll查看的大小不符呢?
因为ll获取到的是文件的逻辑大小,而du获取到的是文件的实际占用的物理空间的大小。

[root@kvm01 opt]# ll -h
-rw------- 1 root root 992M Nov 20 02:02 test1.qcow2
-rw-r--r-- 1 root root 1.4G Nov 20 02:01 test.qcow2
[root@kvm01 opt]# du -h *
992M    test1.qcow2
1.2G    test.qcow2

手动克隆

[root@kvm01 opt]# qemu-img convert -f qcow2 -O qcow2 test1.qcow2 test2.qcow2  # 不克隆快照
[root@kvm01 opt]# ll -h
-rw------- 1 root root 992M Nov 20 02:02 test1.qcow2
-rw-r--r-- 1 root root 992M Nov 20 02:17 test2.qcow2

[root@kvm01 opt]# qemu-img convert -f qcow2 -O qcow2 -c test1.qcow2 test3.qcow2  # -c压缩,需要消耗cpu资源 
[root@kvm01 opt]# ll -h
-rw------- 1 root root 992M Nov 20 02:41 test1.qcow2
-rw-r--r-- 1 root root 423M Nov 20 02:43 test3.qcow2

[root@kvm01 opt]# virsh dumpxml test1 > /backup/test2.xml
[root@kvm01 opt]# vim /backup/test2.xml     # 修改以下配置
修改虚拟机的名字
  <name>test2</name>
删除虚拟机uuid
  <uuid>c869850c-469a-41cf-9c70-cb99f8104189</uuid>
删除mac地址
      <mac address='52:54:00:9c:86:f5'/>
修改磁盘路径
      <source file='/opt/test2.qcow2'/>

[root@kvm01 opt]# virsh define /backup/test2.xml
[root@kvm01 opt]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     test                           shut off
 -     test1                          shut off
 -     test2                          shut off

2、链接克隆

[root@kvm01 opt]# qemu-img create -f qcow2 -b test1.qcow2 test4.qcow2
Formatting 'test4.qcow2', fmt=qcow2 size=10737418240 backing_file='test1.qcow2' encryption=off cluster_size=65536 lazy_refcounts=off 
[root@kvm01 opt]# ll -h
-rw------- 1 root root 992M Nov 20 02:41 test1.qcow2
-rw-r--r-- 1 root root 193K Nov 20 02:51 test4.qcow2
[root@kvm01 opt]# qemu-img info test4.qcow2 
...
backing file: test1.qcow2
...

[root@kvm01 opt]# virsh dumpxml test1 > /backup/test4.xml
[root@kvm01 opt]# vim /backup/test4.xml     # 修改以下配置
修改虚拟机的名字
  <name>test4</name>
删除虚拟机uuid
  <uuid>c869850c-469a-41cf-9c70-cb99f8104189</uuid>
删除mac地址
      <mac address='52:54:00:9c:86:f5'/>
修改磁盘路径
      <source file='/opt/test4.qcow2'/>

[root@kvm01 opt]# virsh define web03.xml 
[root@kvm01 opt]# virsh list --all 
 Id    Name                           State
----------------------------------------------------
......
 -     test4                          shut off

八、热添加技术

热添加,即在虚拟机运行时给它添加诸如硬盘、网卡、内存、cpu之类的设备。

1、硬盘

创建硬盘
[root@kvm01 opt]# qemu-img create -f qcow2 test1_add.qcow2 1G

给虚拟机test1附加硬盘
[root@kvm01 opt]# virsh attach-disk test1 /opt/test1_add.qcow2 vdb --subdriver qcow2

[root@localhost ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0     11:0    1 1024M  0 rom  
vda    253:0    0   10G  0 disk 
└─vda1 253:1    0   10G  0 part /
vdb    253:16   0    1G  0 disk 

剥离硬盘
[root@kvm01 opt]# virsh detach-disk test1 vdb

附加raw格式硬盘不需要指定"--subdriver",默认即为raw。
注意附加硬盘指定的目标盘符不能重复,可以通过筛选虚拟机配置文件查看。
以上附加都是临时,永久生效需要添加"--config",但是需要重启,即它只修改配置文件。剥离也是如此。

附加硬盘扩容

(1)模拟磁盘挂载使用
[root@localhost ~]# mkfs.xfs /dev/vdb
[root@localhost ~]# mount /dev/vdb /mnt/
[root@localhost ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
......
/dev/vdb       1014M   33M  982M   4% /mnt

(2)取消挂载、剥离硬盘
[root@localhost ~]# umount /mnt/

[root@kvm01 opt]# virsh detach-disk test1 vdb

(3)扩容、附加
[root@kvm01 opt]# qemu-img resize test1_add.qcow2 2G
[root@kvm01 opt]# virsh attach-disk test1 /opt/test1_add.qcow2 vdb --subdriver qcow2

(4)挂载、现有的XFS文件系统
[root@localhost ~]# mount /dev/vdb /mnt/
[root@localhost ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
......
/dev/vdb       1014M   33M  982M   4% /mnt
[root@localhost ~]# xfs_growfs /dev/vdb
[root@localhost ~]# df -h
......
/dev/vdb        2.0G   33M  2.0G   2% /mnt

2、网卡

(1)附加网卡
[root@kvm01 ~]# virsh attach-interface test1 --type bridge --source br0 --model virtio

 选项说明:
  --type:   网络类型,一般有network、bridge
  --source: 源网卡名称
  --model:  虚拟网卡型号,一般有virtio、rtl8139(默认)、e1000

[root@localhost ~]# ip a
......
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:90:5a:18 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.134/24 brd 10.0.0.255 scope global dynamic eth1
       valid_lft 1805sec preferred_lft 1805sec
    inet6 fe80::5054:ff:fe90:5a18/64 scope link 
       valid_lft forever preferred_lft forever

(2)剥离网卡
[root@kvm01 ~]# virsh detach-interface web04 --type bridge --mac 52:54:00:90:5a:18

同样以上临时生效,永久生效需要添加"--config"。

3、内存

  对于内存的调整需要注意的是,虚拟机内存是有最大内存和当前内存之分的,默认最大内存和当前内存相等,可以在创建虚拟机时指定最大内存。
  对内存的增大或者缩小都是相对于当前内存来的,但当前内存是不能超过最大内存,所以我们在对内存进行增大时必须先修改最大内存。

[root@kvm01 ~]# virsh dumpxml test1
<domain type='kvm' id='4'>
  <name>test1</name>
  <uuid>c869850c-469a-41cf-9c70-cb99f8104189</uuid>
  <memory unit='KiB'>1048576</memory>                   # 最大内存
  <currentMemory unit='KiB'>1048576</currentMemory>     # 当前内存

[root@kvm01 ~]# virsh setmem test1 512M
[root@kvm01 ~]# virsh setmem test1 1024M

[root@kvm01 ~]# virsh setmem test1 2G
error: invalid argument: cannot set memory higher than max memory

[root@kvm01 ~]# virsh setmaxmem test1 2G
error: Unable to change MaxMemorySize
error: Requested operation is not valid: cannot resize the maximum memory on an active domain

我们看报错可以获知,最大内存调整需要在关机状态下进行
[root@kvm01 ~]# virsh shutdown test1
[root@kvm01 ~]# virsh setmaxmem test1 2G
[root@kvm01 ~]# virsh start test1
[root@kvm01 ~]# virsh setmem test1 2G

[root@localhost ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           2.0G         60M        1.8G        8.3M        103M        1.8G
Swap:            0B          0B          0B

4、cpu

  cpu的调整和内存类似,都有最大cpu和当前cpu,我们要去增加虚拟机cpu,得先修改最大cpu。
  因此在创建虚拟机的时候,考虑到这种需求,我们可以去指定最大内存和cpu。

[root@kvm01 ~]# virsh shutdown test1
[root@kvm01 ~]# virsh setvcpus test1 --maximum 2 --config
[root@kvm01 ~]# virsh setvcpus test1 2 --config 
[root@kvm01 ~]# virsh start test1
[root@localhost ~]# lscpu | grep -i "cpu(s)"
CPU(s):                2

注意:热调整CPU,只能添加,不能减少,如果要减少需要关闭虚拟机,再去调整。如下:

[root@kvm01 ~]# virsh setvcpus test1 1
error: unsupported configuration: failed to find appropriate hotpluggable vcpus to reach the desired target vcpu count
[root@kvm01 ~]# virsh shutdown test1
[root@kvm01 ~]# virsh setvcpus test1 1 --config 
[root@kvm01 ~]# virsh start test1
[root@localhost ~]# lscpu | grep -i "cpu(s)"
CPU(s):                1

[root@kvm01 ~]# virsh setvcpus test1 2      # 临时生效
[root@localhost ~]# lscpu | grep -i "cpu(s)"
CPU(s):                2

九、迁移

  KVM虚拟机迁移主要有两种方式,分别是冷迁移和热迁移。迁移时特别注意的是保持环境一致。
   • 冷迁移:即关机状态下进行的迁移,相对简单,只需将配置文件、磁盘文件移动到其他服务器进行导入即可。
   • 热迁移:即运行状态下进行的迁移,会将内存数据与硬盘数据同步迁移。下面我们会使用共享存储的方式简单演示下热迁移。

1、冷迁移

(1)迁移磁盘文件和配置文件到另一台服务器
[root@kvm01 opt]# virsh dumpxml test1 > test1.xml
[root@kvm01 opt]# scp -p test1.xml test1.qcow2 test1_add.qcow2 10.0.0.11:/opt

(2)导入启动测试
[root@kvm02 opt]# virsh define /opt/test1.xml 
[root@kvm02 opt]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     test1                          shut off

[root@kvm02 opt]# virsh start test1
[root@kvm02 opt]# virsh console test1
[root@localhost ~]# 

2、热迁移

(1)配置nfs共享数据
[root@kvm01 ~]# mkdir /data
[root@kvm01 ~]# chowm -R qemu.qemu /data
[root@kvm01 ~]# vim /etc/exports
/data  10.0.0.0/24(rw,async,no_root_squash,no_all_squash)
[root@kvm01 ~]# systemctl start nfs rpcbind
[root@kvm01 ~]# mv /opt/* /data/ && mount -t nfs 10.0.0.10:/data /opt/

[root@kvm02 ~]# mount -t nfs 10.0.0.10:/data /opt

(2)主机映射
[root@kvm01 ~]# vim /etc/hosts      # 添加以下配置(各个节点执行)
10.0.0.10 kvm01
10.0.0.11 kvm02

(3)对test1进行热迁移
[root@kvm01 ~]# virsh migrate test1 qemu+ssh://10.0.0.11/system --live --verbose --unsafe --persistent --undefinesource

 选项说明:
  --live:       热迁移
  --verbose:    显示迁移进度
  --unsafe:     即使不安全也强制迁移
  --persistent:      将虚拟机保留在迁移目标服务器上
  --undefinesource:  在源服务器上取消虚拟机的定义

(4)验证结果
[root@kvm01 ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     test                           shut off

[root@kvm02 ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 8     test1                          running
[root@kvm02 ~]# virsh console test1
[root@localhost ~]#
71

发表回复

验证码: − 3 = 2