虚拟化介绍

什么是虚拟化?

虚拟化,通过模拟计算机的硬件,来实现在同一台计算机上同时运行多个不同的操作系统的技术。

为什么要用虚拟化?

阿里云 kvm开源
azure
vmware ESXI商业软件

  • 没有虚拟化之前:计算机的硬件配置越来越高

如服务器的配置:512G 内存,4路 8核16线程 ,12* PCI-E 1T的SSD;
ntp服务,安装多个mysql,安装多个tomcat,安装….

  • linux开源的,很多软件都有依赖包openssl nginx。所以充分利用资源,软件运行环境的隔离,只有虚拟化才行实现。

使用场景

场景1:同一台物理机运行多个php版本 php5.3(openssl,gd) php5.5 php7.2

场景2:机房的迁移,解决了硬件和系统的依赖

场景3:openstack环境,软件发布方式,担心软件客户装不上,直接就提供虚拟机的版本。

场景4:开发环境和测试环境,使用虚拟化,如果开发测试把Linux库文件(.so结尾的是linux 库文件)不小心删除了几个,系统命令就用不了了。
只靠一台物理服务器,30台虚拟机

场景5:业务的快速部署

从头安装系统麻烦,安装服务,配置,克隆虚拟机,改ip

虚拟化的优势

虚拟化:提高了资源的利用率,各个服务的安全性隔离,解决了系统和硬件之间的依赖

kvm虚拟化管理软件的安装

1
yum install libvirt virt-install qemu-kvm -y

KVM:

  • Kernel-based Virtual Machine 只要运行kvm虚拟机的能力,没有管理kvm虚拟机的能力

libvirt 作用:

  • 虚拟机的管理软件
    libvirt: kvm,xen,qemu,lxc….,可以管理多个,是个通用的管理软件

virt virt-install virt-clone 作用:

  • 虚拟机的安装工具和克隆工具
    qemu-kvm qemu-img (qcow2,raw)作用:管理虚拟机的虚拟磁盘

虚拟化软件介绍

  • qemu 软件纯模拟全虚拟化软件,特别慢!AIX,兼容性好!
  • xen(半) 性能特别好,需要使用专门修改之后的内核,兼容性差! 如 redhat 5.5 xen
  • KVM(linux) 全虚拟机,它有硬件支持cpu,基于内核,而且不需要使用专门的内核 centos6 kvm。 性能较好,兼容较好

安装一台kvm虚拟机

宿主机 使用分发软件TightVNC或者VNC Viewer

vnc:

  • 远程的桌面管理工具
1
2
3
# 宿主机执行
systemctl start libvirtd.service
systemctl status libvirtd.service

具体安装

在 10.0.0.11 宿主机安装虚拟机cnetos7

建议虚拟机内存不要低于1024M,否则安装系统特别慢!

1
virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name centos7 --memory 1024 --vcpus 1 --disk /opt/centos2.raw,format=raw,size=10 --cdrom /opt/CentOS-7-x86_64-DVD-1708.iso --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole

宿主机可以使用vnc连接查看

vnc-service:5900

vnc:10.0.0.11:5900

virt-install安装参数解读

1
2
3
4
5
6
7
8
9
10
11
--virt-type kvm    虚拟化的类型(qemu)
--os-type=linux 系统类型
--os-variant rhel7 系统版本
--name centos7 虚拟机的名字
--memory 1024 虚拟机的内存
--vcpus 1 虚拟cpu的核数
--disk /opt/centos2.raw,format=raw,size=10 raw格式的
--cdrom /opt/CentOS-7-x86_64-DVD-1708.iso 系统镜像
--network network=default 使用默认NAT的网络
--graphics vnc,listen=0.0.0.0 图形化配置
--noautoconsole 使用本选项指定不自动试图连接到客户机控制台。默认行为是调用一个VNC客户端显示图形控制台,或者运行 "virsh" "console"命令显示文本控制台。

虚拟机安装过程

image.png

与安装centos7系统类似

kvm虚拟机的管理配置

virsh日常管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
virsh list      # 列出正在运行和挂起的虚拟机
virsh list --all # 列出所有的虚拟机

virsh start centos7 # 开机
virsh shutdown centos7 # 正常关机
virsh destroy centos7 # 拔电源关机



# 如果想把虚拟机迁移,只要把磁盘文件和配置文件迁移走就行了,数据都在磁盘文件里面
virsh dumpxml centos7 >centos7.xml # 导出配置dumpxml


# 删除虚拟机,推荐:先destroy,在undefine
virsh undefine centos7
# 如果正在运行的虚拟机先undefine,virsh list --all一看还在跑着,但是关机virsh shutdown centos7,就没有了,好像是关一台少一台


# 导入虚拟机配置
virsh define centos7.xml
# 只要一导入配置文件,就会在/etc/libvirt/qemu 目录下产生一个配置文件,不能修改,如果要修改,建议使用 virsh edit centos命令,自带语法检查


# 只要一运行这个虚拟机,就会产生一个进程,只要这个进程在,虚拟机就会运行
ps -ef | grep qemu
# 而 virsh virsh undefine centos7 仅仅是把配置文件删掉,进程还在。

修改配置

1
2
3
# 如果宿主机的硬盘不够了,想要将虚拟机的磁盘文件迁走到另一个硬盘上,只是迁移是不够的,这样虚拟机就找不到磁盘文件,不能启动,所以要修改配置文件

virsh edit centos7

image.png

1
2
3
4
5
6
7
8
virsh domrename shop-web01    # 重命名,新版本才有


virsh suspend centos7 # 挂起,时间会暂停
virsh resume centos7 # 从挂起恢复,


virsh vncdisplay centos7 # 查看vnc端口,大规模使用虚拟机时,可以快速定位到vnc的端口号

kvm虚拟机开机启动

1
2
3
4
5
6
7
8
9
10
11
12
13
virsh autostart centos7     # 设置开机启动,前提是 systemctl enable libvirtd


virsh autostart --disable centos7 # 取消开机自启



# 开机自启就是创建了一个软连接
[root@localhost ~]# ls /etc/libvirt/qemu/autostart/
centos7.xml
[root@localhost ~]# ls /etc/libvirt/qemu/autostart/ -l
total 0
lrwxrwxrwx. 1 root root 29 Feb 25 19:48 centos7.xml -> /etc/libvirt/qemu/centos7.xml

console 控制台 登录

1
2
3
4
5
6
7
8
9
10
# 让虚拟机支持console控制, 进入kvm虚拟机,  或者修改内核文件,加入配置参数
grubby --update-kernel=ALL --args="console=ttyS0,115200n8"

# 可以在内核文件上查看
vi /boot/grub2/grub.cfg

# 重启生效

# 现在kvm虚拟机就可以console登陆了,是一个纯命令行的控制台,相当于在虚拟机上查了一根网线
virsh console centos7

kvm虚拟机虚拟磁盘格式转换

  • raw: 裸格式,占用空间比较大,不支持快照功能,性能较好,不方便传输 总50G 占用2G,传输的时候要传50G
  • qcow2:cow (copy on write)占用空间小,支持快照,性能比raw差一点,方便传输 总50G 使用了2G,传输的时候也传2G,就是写多少占多少
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
qemu-img info /opt/centos2.raw      # 查看磁盘信息


qemu-img create -f qcow2 test.qcow2 2G # 创建一块qcow2格式的虚拟硬盘


qemu-img resize /data/centos2.qcow2 + 20G # 扩容,加20G
qemu-img resize /data/centos2.qcow2 40G # 扩容扩到40G


# 转换格式
qemu-img convert -f raw -O qcow2 /data/centos2.raw /data/centos2.qcow2

# 然后修改配置文件, 修改两个地方的磁盘格式
virsh edit centos7

修改的配置文件格式

kvm虚拟机快照管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 创建快照
virsh snapshot-create centos7 # 默认快照名字是unix的时间戳
virsh snapshot-create-as centos7 --name install_service # 自定义快照名字

# 查看快照
virsh snapshot-list centos7

# 还原快照
virsh snapshot-revert centos7 --snapshotname 1582636910

# 删除快照
virsh snapshot-delete centos7 --snapshotname 1582636910
virsh snapshot-delete centos7 --current # 删除当前最新的快照


# raw不支持做快照,qcow2支持快照,并且快照就保存在qcow2的磁盘文件中
# 如果将快照删除,qcow2的磁盘空间不会回收,会保留删除快照之前的空间
# 空间回收的命令:
qemu-img convert -c -f qcow2 -O qcow2 /data/centos2.qcow2 /data/new.qcow2 # -c参数是压缩

kvm虚拟机克隆

完整克隆:将基础磁盘文件完整拷贝一份

链接克隆:依赖基础磁盘文件,把变化的内容保存在一个新的qcow2文件中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 完整克隆,利用官方命令
virt-clone -o web01 -n web02 --auto-clone


# 手动完整克隆
# 主要是磁盘文件和配置文件,先拷贝磁盘文件,再导出原来的配置文件 virsh dumpxml web02 >web03.xml
# 然后修改web03的配置文件,修改名字、删掉uid、disk路径、删掉mac地址
# 最后导入虚拟机配置 virsh define web03.xml



# 链接克隆,官方没有链接克隆的工具
# 先 生成虚拟磁盘文件
qemu-img create -f qcow2 -b web03.qcow2 web04.qcow2 # -b参数就是生成一个链接克隆,raw格式没有链接克隆
# 生成虚拟机的配置文件
# 导入虚拟机并进行启动测试

kvm虚拟机的桥接网络

默认的虚拟机网络是NAT模式,网段192.168.122.0/24,NAT有一个缺陷,就是用户不能访问kvm虚拟机的内网ip

1
2
3
4
5
6
7
8
9
# 创建桥接网卡
virsh iface-bridge eth0 br0

# 取消桥接网卡
virsh iface-unbridge br0


# 创建虚拟机走桥接模式
virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name web04 --memory 1024 --vcpus 1 --disk /data/web04.qcow2 --boot hd --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole

怎么把现有的网络改为桥接网络

1
2
# 需要改配置文件,首先比较网卡这一块的配置有什么区别,可以先把配置文件备份一下,然后对比
vimdiff web01.xml web02.xml

1
2
3
4
5
6
7
virsh edit web04     # 把web04也改成桥接网络

<interface type='bridge'>
<mac address='52:54:00:55:aa:fa'/>
<source bridge='br0'/>

# 在宿主机上,重启虚拟机生效

热添加技术

热添加就是不关机情况下增加资源

kvm虚拟机在线热添加硬盘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 临时生效,重启之后就没有了
qemu-img create -f qcow2 web04-add01.qcow2 20G # 创建硬盘

virsh attach-disk web04(虚拟机名字) /data/web04.qcow2 vdb(盘符) --subdriver qcow2 # qcow2的格式,硬盘附加成功,只是临时的,不会修改xml配置文件,机器一旦重启,还是读取原来的配置文件

# 然后就多了一个20G的盘,需要格式化,挂载就可以用来
mkfs.xfs /dev/vdb
mount /dev/vdb /mnt





# 永久生效
# 在临时附加硬盘的基础上:
virsh attach-disk web04 /data/web04.qcow2 vdb --subdriver qcow2 --config
# 这样配置文件就自动改好了

剥离硬盘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 先把硬盘卸载
umount /nmt

# 剥离硬盘
virsh detach-disk web04 vdb

# 扩容
qemu-img resize web04-add01.qcow2 50G # 扩到50G
virsh attach-disk web04 /data/web04.qcow2 vdb --subdriver qcow2 # 附加硬盘

# 然后在kvm看一下硬盘
fdisk -l # 硬盘大小多了
# 再挂载到mnt看一下
mount /dev/vdb /mnt
# 看一下是否丢数据
ll /mnt # 扩容不会丢数据
df -h # 系统识别出50G,但是df -h看还是20G
# 当第一次格式化的时候,系统会分配inode和block,扩容之后这块磁盘的信息还是以前的,是以前刚格式化完的信息,所以它管理的空间还是之前的20G,现在加到了50G,它前面分区表这段信息inode、block的数量没有变,所以它依旧只能使用20G。为了解决这个问题,有一个命令:
xfs_growfs /dev/vdb # 重新调整inode和block

# 这里的文件系统是xfs,如果时ext4:
resize2fs /dev/vdb # 调整inode和block

kvm虚拟机在线热添加网卡

1
2
3
4
5
# 添加网卡,默认是临时生效,永久生效,需要加上 --config
virsh attach-interface web04 --type bridge --source br0 --model virtio # 使用model参数让网卡名字统一成eth0、eth1,且性能高

# 剥离网卡,通过mac地址区分
detach-interface web04 --type bridge --mac 52:54:00:35:d3:71

kvm虚拟机在线热添加内存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 创建虚拟机要 --memory 512,maxmemory=2048,和之前不一样
virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name web04 --memory 512,maxmemory=2048 --vcpus 1 --disk /data/web04.qcow2 --boot hd --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole


# 临时
virsh setmem web04 1024M

# 永久
virsh setmem web04 1024M --config





# 让已有的机器扩容,可以修改配置文件:

kvm虚拟机在线热添加cpu

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 先创建一个虚拟机,修改cpu的参数,--vcpus ,注意:老版的maxvcpus,新版的提示maxcpus,要加上v,这是个坑
virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name web04 --memory 512,maxmemory=2048 --vcpus 1,maxvcpus=10 --disk /data/web04.qcow2 --boot hd --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole



# 热添加cpu
virsh setvcpus web04 2 # cpu2个
# 永久
virsh setvcpus web04 4 --config




# 让已有的机器支持热添加cpu,修改配置文件,cpu那里多了个current参数

kvm虚拟机热迁移

开机的状态下,从宿主机1迁移到宿主机2

  • 冷迁移kvm虚拟机:配置文件,磁盘文件
  • 热迁移kvm虚拟机:配置文件,nfs共享

热迁移流程:

在kvm01上挂起虚拟机vm01,发送vm的虚拟机配置文件和运行时内存中的数据到vm02,接收完毕后,kvm02恢复vm01,热迁移完成。

架构图如下:

参考:https://www.qstack.com.cn/archives/368.html

实验环境准备

主机名 ip 内存 网络 软件需求 虚拟化
kvm01 10.0.0.11 2G 创建br0桥接网卡 kvm和nfs 开启虚拟化
kvm02 10.0.0.12 2G 创建br0桥接网卡 kvm和nfs 开启虚拟化
nfs01 10.0.0.31 1G nfs

注意:需要做主机名host解析

安装

在kvm01和kvm02安装kvm和NFS,配置桥接网卡

1
2
3
4
5
yum install libvirt virt-install qemu-kvm nfs-utils -y     # 两台宿主机都要安装

systemctl start libvirtd.service

virsh iface-bridge eth0 br0 # 配置桥接网卡

在nfs01上安装配置nfs

1
2
3
4
5
6
7
8
9
yum install nfs-utils -y

mkdir /data # 创建共享目录
vim /etc/exports # 挂载目录
# 写入下面信息
/data 10.0.0.0/24(rw,async,no_root_squash,no_all_squash)

systemctl restart rpcbind # 重启服务
systemctl restart nfs

kvm01和kvm02挂载共享目录

1
mount -t nfs 10.0.0.31:/data /opt     # kvm01和kvm02挂载到nfs01 /data 目录 

安装一台基于桥接模式的虚拟机

1
virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name web04 --memory 512,maxmemory=2048 --vcpus 1 --disk /data/web04.qcow2 --boot hd --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole

热迁移的命令

1
2
# 热迁移的命令
virsh migrate --live --verbose web01(当前kvm虚拟机) qemu+ssh://10.0.0.11/system --unsafe

kvm管理平台openstack