个人博客:传送阵

一、虚拟化介绍

什么是虚拟化?

虚拟化指通过虚拟化技术将一台物理计算机虚拟为多台逻辑计算机,在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可以使用不同的系统,并且系统和系统之间互不干扰,能够充分合理的利用物理计算机的资源。

为什么要用虚拟化技术?

  • 一变多
  • 充分利用物理计算机的资源
  • 虚拟化是向云演进的必要基础

假设公司有三台服务器,但是有60位开发人员,每个人都要求有一个测试环境,怎么能把这三台服务器合理地分配给这60个人使用?这时候我们就可以使用虚拟化技术,用这三台物理服务器虚拟出60个系统然后分配成开发人员。

假设一台服务器的性能很高,我们仅仅需要NTP服务,有些太浪费了,我们完全可以将这一台高性能服务器虚拟成10台虚拟机,然后在虚拟机里面安装NTP服务,其它的9台虚拟机用来做别的事情。

应用场景?

  • 同一台物理机运行php多个版本

  • 机房的迁移,解决了硬件和系统的依赖

  • 云的趋势的势不可挡,而云计算机必须依赖于虚拟化

  • 开发环境和测试环境(3台物理服务器,60个开发,要求都要有自己的独立环境,快照)

  • 业务的快速部署(第一次部署时快照,后面直接克隆)

常见的虚拟化软件

vmware vspere:付费,图形界面,管理简单方便

kvm:免费的,纯命令行,LINUX内核原生集成。

KVM、vmware与虚拟化是什么关系?

kvmvmwrae都可看做是一个可以实现虚拟化的软件。

查看

[root@kvm01 ~]# lscpu
Virtualization:        VT-x
Hypervisor vendor:     VMware   #显示虚拟化平台是vmware
Virtualization type:   full

通过vmware workstation打开的的虚拟机是上述这样的,如果是阿里云主机就会显示是kvm了。

二、通过kvm安装centos7系统

在使用kvm时,建议将内存调整到4G以上。

第一步:安装kvm管理软件、上传镜像、启动kvm服务。

//使用本地yum源安装kvm的管理软件,这三个软件的作用下方有解释
[root@kvm01 ~]# yum install libvirt* virt-* qemu-kvm* -y

//上传一个centos7的镜像到/opt目录,不能用rz,rz不能上传大于4G的,用xshell的xftp上传。
[root@kvm01 opt]# ls
CentOS-7-x86_64-DVD-1810.iso

//启动kvm服务
[root@kvm01 ~]# systemctl start libvirtd.service

//安装kvm之后会多出两个网卡:virbr0和vnet0,在后面的小节我们会有解释这两个网卡的作用

libvirt:用来管理虚拟机

virt:用来安装和克隆虚拟机用的

qemu:用来管理虚拟机的磁盘的。

第二步:开始安装centos7

先准备好VNC客户端,在360软件管家里面即可下载到,如下图所示(只安装客户端即可):

虚拟化--KVM_干货

//通过下面这些参数进行安装,莫慌,下文当中有解释。
[root@kvm01 ~]# virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name centos7 --memory 1024 --vcpus 1  --disk  /opt/centos7.raw,format=raw,size=10 --cdrom /opt/CentOS-7-x86_64-DVD-1810.iso --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
[root@kvm01 opt]# ss -tnlp | grep 5900
LISTEN     0      1            *:5900                     *:*                   users:

运行时此命令之后,立马通过vnc连接,格式是ip:5900的,快一点,不然就会检测磁盘了

通过vnc安装系统时,不用更改内核,设置时区、不用kvm(慢)而用标准分区一个根分区即可,主机名、网卡打开,最小化安装

virt-install --virt-type kvm 指定安装的虚拟机类型是kvm

--os-type=linux 指定系统的类型是linux

--os-variant rhel7 指定系统的版本是rhel7

--name centos7 指定虚拟机的名字为centos7

--memory 1024 指定内存为1G

--vcpus 1 指定cpu为1颗

--disk /opt/centos7.raw 指定磁盘的路径是/opt/centos7.raw

format=raw 指定磁盘的格式,常用的有两种格式,下方有解释

size=10 指定磁盘的大小为10G,默认单位为G

--cdrom /opt/CentOS-7-x86_64-DVD-1810.iso 指定光盘镜像的位置

--network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole 网络使用NAT网络,通过VNC图形界面安装,侦听到0.0.0.0,最后一个选项的意思是运行完当前使命令之后返回终端,而不是一直占用

raw 这种类型的磁盘,不支持快照,但是性能好,用的比较少。

qcow2 这种类型的磁盘,支持快照,性能相对raw差一点,用的比较多。

注意:第一台虚拟机默认的端口是9500,第二台是9501,依次类推

三、常用操作

虚拟机列表

[root@kvm01 ~]# virsh list   #不加--all只能看正在运行的虚拟机
 Id    Name                           State
----------------------------------------------------
 1     centos7                        running
[root@kvm01 ~]# virsh list --all  #加上-all查看所有的虚拟机状态
 Id    Name                           State
----------------------------------------------------
 1     centos7                        running

开关机

//开机

[root@kvm01 ~]# virsh start centos7

//"温柔"关机

[root@kvm01 ~]# virsh shutdown centos7

//强制关机

[root@kvm01 ~]# virsh destroy centos7

导出虚拟机

kvm虚拟化与vmware workstation虚拟化有些不同,vmware虚拟出来的虚拟机通常会有多个文件,而kvm的虚拟机只有两个文件:配置文件和磁盘文件,我们怎样才能找到某个虚拟机对应的文件呢?其实很简单,先列出所有的虚拟机,然后再通过virsh edit 虚拟机名,然后过滤“source file”就会把磁盘的路径过滤出来,而虚拟机的配置文件都会存放在/etc/libvirt/qemu/这个目录里面,以虚拟机名字命名的的.xml文件。实际上virsh edit 虚拟机名打开的就是该虚拟机的配置文件,配置文件里面记录了磁盘文件的路径。通过edit命令打开配置文件有语法检测,直接通过vim打开没有语法检查,如下所示:

[root@kvm01 ~]# du -smh /opt/*
1.4G	/opt/centos2.raw   #虚拟机的磁盘文件,看起来是10G,实际上是1.4,传输进又变成了10G。
4.3G	/opt/CentOS-7-x86_64-DVD-1810.iso
[root@kvm01 ~]# ll //etc/libvirt/qemu
-rw------- 1 root root 4175 Dec  9 15:35 centos7.xml     #centos7的配置文件
drwx------ 3 root root   42 Dec  9 14:45 networks

其实所谓的导出虚拟机,只要把这两个文件复制走就可以了,不过配置文件最好是导出来,而不是直接拷贝走,通过virsh dumpxml centos7 > /opt/centos7.xml即可把配置文件导出来,导出到别的主机之后再通过vrish define centos7.xml `就把配置文件导入了,然后再根据配置文件里面磁盘文件的路径将磁盘文件放到正确的路径就可以启动了,就是这么简单,如下所示:

//备份配置文件
virsh dumpxml centos7 > /opt/centos7.xml

//删除虚拟机,其实就是删除默认的配置文件而已,磁盘文件没有变动
virsh undefine centos7

//还原时候,用define命令导入
vrish define centos7.xml

重命名

//必须关机之后才能重命名
[root@kvm01 ~]# virsh domrename centos7 centos7.1
error: Requested operation is not valid: cannot rename active domain
[root@kvm01 ~]# virsh destroy centos7  #关机之后才能更改
[root@kvm01 ~]# virsh domrename centos7 centos7.1

挂起&恢复

//挂起
[root@kvm01 ~]# virsh suspend centos7.1
Domain centos7.1 suspended
//恢复
[root@kvm01 ~]# virsh resume centos7.1
Domain centos7.1 resumed

查看某个虚拟机对应的端口

[root@kvm01 ~]# virsh vncdisplay centos7.1
:0 

:0代表5900,如果是:1就代表是5901端口.

kvm开机启动

前提:kvm服务必须是开机启动的,默认就这样的;

//设置虚拟机centos7.1开机启动
[root@kvm01 ~]# virsh autostart centos7.1
//关闭虚拟机centos7.1开机启动
[root@kvm01 ~]# virsh autostart --disable centos7.1

console登陆(失败,暂无查出原因)

在虚拟机上先配置一下内核参数然后重启虚拟机:

grubby --update-kernel=ALL --args="console=ttyS0,115200n8"
reboot
//在物理机上通过这条命令即可通过console登录
[root@kvm01 ~]# virsh console centos7
四、克隆

磁盘格式转换

raw:裸格式,占用空间比较大,不支持快照,性能好。

qcow2:cow(写时复制,,用多少就 占用多少),占用空间小,支持快照,性能比raw差一点-----常用

[root@kvm01 ~]# qemu-img info /opt/centos7.raw 
image: /opt/centos7.raw
file format: raw
virtual size: 10G (10737418240 bytes)
disk size: 1.3G

如上所示,虽然仅占用了1.3G,但是一旦使用cp这样的命令进行传输时,文件大小就会变成10G,所以,我们要在传输之前将格式转换成qcow2格式,而且qcow2格式支持快照,raw格式不支持快照,这是个大问题。

//-f源格式,-O目标格式
[root@kvm01 opt]# qemu-img convert -f raw -O qcow2 centos7.raw centos7.qcow2

//关机
virsh shutdown centos7

//既然磁盘文件的名字变了,配置文件也要修改一下,指向新的磁盘文件
[root@kvm01 opt]# virsh edit centos7
 <driver name='qemu' type='qcow2'/>
<source file='/opt/centos2.qcow2'/>
[root@kvm01 opt]# virsh start centos7

快照管理

只要qcow2的磁盘格式才支持快照哟!raw格式的磁盘文件并不支持快照。

快照的存放位置,在它原本的文件放在一起了,每做一次,原磁盘文件就会变大,删除了快照,容量还是那么大,不会回收了,因为已经创建了。

//做快照
[root@kvm01 opt]# virsh snapshot-create centos7

//查看快照列表
[root@kvm01 opt]# virsh snapshot-list centos7
 Name                 Creation Time             State
------------------------------------------------------------
 1575796675           2019-12-08 17:17:55 +0800 running
 
//删除centos7的快照 1575796675 ,通过snapshot-list命令可以看到
virsh snapshot-delete centos7 --snapshotname 1575796675   

//还原快照
[root@kvm01 opt]# virsh snapshot-revert centos7.1 --snapshotname 1575796675

完整克隆

完整克隆,速度比较慢

//克隆cenots7,-o后面是旧名字,-n后面是新的虚拟机的名字,
[root@kvm01 ~]# virt-clone --auto-clone -o centos7 -n centos7.clone

手动克隆

  1. 复制虚拟磁盘文件
  2. 备份源虚拟机的配置文件,另存为web02
  3. 修改web02的配置文件
    • 修改name
    • 删除uuid
    • 删除mac
    • 修改虚拟机磁盘路径
  4. 导入web02
  5. 检查是否正常启动

链接克隆

**链接克隆的格式:qemu-img create -f 格式 -b 旧磁盘名 新磁盘名 **

[root@kvm01 opt]# ls
centos2-clone.qcow2  centos2.qcow2  CentOS-7-x86_64-DVD-1810.iso  centos7.xml  rh
[root@kvm01 opt]# qemu-img create -f qcow2 -b centos2.qcow2 centos3.qcow2
[root@kvm01 opt]# qemu-img info centos3.qcow2
image: centos3.qcow2
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 196K    #文件很小
cluster_size: 65536
backing file: centos2.qcow2   #基于这个文件实现的克隆
Format specific information:
    compat: 1.1
    lazy refcounts: false
五、网络相关

当我们安装了一台KVM虚拟机之后,默认是这个虚拟机是以服务的方式运行的,默认侦听在5900端口,我们通过物理机的IP+端口的方式就可以进行连接。其实我们在物理机通过ssh服务也可以进行连接。虽然KVM虚拟机与物理机不在同一个网段,使用SSH依然还是可以连接,因为当我们安装好KVM之后,默认又会生成一个新网卡,这个新网卡的IP与虚拟机自动获取的IP地址是同一个网段的,所以使用物理机就可以连接这个虚拟机。

我们发现只要物理机能够上网,虚拟机就能上网,本来以为这和vmware workstation的原理是一样的,结果发现是不一样的,kvm虚拟的网关竟然是物理机上网卡的地址,其实仔细想一想,在生产环境当中根本不可能使用NAT模式的,因为一旦使用了NAT模式,就只有物理机能连接虚拟机,别人不能用。真正在生产环境当中使用的是桥接模式。

nat地址转换(默认)

当我们没有安装kvm的时候,ifconfig默认只会有两个网卡,一个是物理网卡(ens33或eth0),另一个是本地环回网卡lo,当我们安装完kvm之后发现又会增加两个网卡,virbr0vnet0,那么这两个网卡是用来做啥子的呢?virbr0的地址与虚拟机的IP是在同一个网段,并且virbr0的地址是虚拟机的网关,,vnet0是虚拟机的网卡,虚拟机网卡通过交换机连接网关,virbr0再通过nat地址转换,通过物理网卡eth0上网,如下图所示:

虚拟化--KVM_干货_02

桥接网络

假设物理网卡的名字是ens33,我们要把虚拟机桥接到物理网络当中来,操作非常简单,但是操作之前我们最好把原理搞清楚,原理图如下所示:

虚拟化--KVM_干货_03

//将物理网卡ens33的IP移动到br0上
[root@kvm01 ~]# virsh iface-bridge ens33 br0

//别忘记重启一下网络服务,不然不生效的哟!
[root@kvm01 ~]# /etc/init.d/network restart
//将物理网卡的地址移动到br0网卡上之后,再查看网卡发现又多了一个网卡br0
[root@kvm01 ~]# ifconfig
//重新生成一个新的网卡br0,物理网卡上的地址被移动到了新的网卡上
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.80.240  netmask 255.255.255.0  broadcast 192.168.80.255
//曾经的物理网卡地址没有了
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether 00:0c:29:cb:07:0e  txqueuelen 1000  (Ethernet)
        RX packets 80142  bytes 52934639 (50.4 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 71073  bytes 8736045 (8.3 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
//下面这是NAT模式用的虚拟网卡
virbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
//下面这个是虚拟机的网卡,来来一个虚机就是vent1
vnet0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::fc54:ff:fe59:fe59  prefixlen 64  scopeid 0x20<link>
        ether fe:54:00:59:fe:59  txqueuelen 1000  (Ethernet)
        RX packets 1179  bytes 135342 (132.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 3752  bytes 255893 (249.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

在物理机上的操作完成后,桥接网络还没有完成 ,虚拟机上还要操作,因为虚拟机默认是nat网络,我们要将虚拟机的网络改为桥接,直接更改配置文件即可,如下所示:

[root@kvm01 ~]# virsh list
 Id    Name                           State
----------------------------------------------------
 7     centos7.2                      running
 
//改之前最好先关机
[root@kvm01 ~]# virsh destroy centos7.2

//更改配置文件
[root@kvm01 ~]# virsh edit centos7.2
 <interface type='bridge'>    #类型由之前的default改为bridge
 <source bridge='br0'/>       #桥接到br0上
 
//启动虚拟机之后,就发现它的地址与br0(物理机)是同一个网段了,桥接成功。
六、加硬盘和扩容

在线加硬盘

在线增加硬盘也是很常见的需求了,操作如下所示:

//虚拟机上默认就只有一个块硬盘10G
[root@kvm001 ~]# fdisk -l
Disk /dev/vda: 10.7 GB, 10737418240 bytes, 20971520 sectors
/dev/vda1   *        2048    20971519    10484736   83  Linux
//下面的操作是物理机
//在opt目录下创建一块硬盘,其实在哪里创建都可以,指定磁盘类型,指定名字,指定大小5G即可。
qemu-img create -f qcow2 add01.qcow2 5G

//给centos7.2这台主机增加上这块盘,vdb是指明盘符,--live是在线增加,不加缓存,指定驱动
[root@kvm01 ~]# virsh attach-disk centos7.2 /opt/add01.qcow2 vdb --live --cache=none --subdriver=qcow2
//下面是虚拟机的操作
//增加完硬盘之后,发现多了一块盘
[root@kvm001 ~]# fdisk -l

Disk /dev/vda: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000b859c

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048    20971519    10484736   83  Linux

Disk /dev/vdb: 5368 MB, 5368709120 bytes, 10485760 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

扩容

如果觉得新加的这块硬盘容量还是太小,想要扩容这块盘,就要先卸载这块盘。

//下面是物理机的操作
//卸载新增加的这块硬盘
[root@kvm01 ~]# virsh detach-disk centos7.2 vdb

//扩容,加5G
[root@kvm01 ~]# qemu-img resize /opt/add01.qcow2 +5G

//再次添加上
[root@kvm01 ~]# virsh attach-disk centos7.2 /opt/add01.qcow2 vdb --live --cache=none --subdriver=qcow2
//下面是虚拟机的操作,发现新增加的那块硬盘果真加了5G。
[root@kvm001 ~]# fdisk -l
Disk /dev/vda: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000b859c

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048    20971519    10484736   83  Linux

Disk /dev/vdb: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

注意:一旦在虚拟上使用了这块磁盘,比如已经格式化并且已经在里面创建了文件之后,再加扩容量,再挂载之后,会发现容量还是保持在原来的大小,是因为格式化之后,文件系统已经固定了,新加的空间没有格式化,如果想用的话,就得执行xfs_growfs /dev/vdb,用来更新文件系统,这仅是针对xfs的分区, 新的空间就会被添加上了,如果文件系统是ext系列的话,就得使用resizefs /dev/vdb

七、热迁移

热迁移原理

所谓的热迁移就是在不停机或极短暂(几秒)即可恢复的手段。

前提条件就是必须使用的是共享存储,这样才能实现热迁移。

必须是桥接网络

我们在做冷迁移时,其实迁移的都是两个文件:配置文件和磁盘文件,但是热迁移时就不只这两个软件 ,还有,还有什么呢?我们想一下,当kvm01运行的时候,内存当中肯定有数据,我们仅把配置文件和磁盘文件迁移过去,没有内存的东西不行呀,这怎么办呢?好在红帽公司早就给我们想好了,我们使用virtual machine manager软件就可以实现将内存里面的数据一起迁移到其它主机,但是这个软件是图形化的,所以我们要也安装图形化。

热迁移操作

环境描述:

按理说是需要三台机器的,一台是需要迁移的服务器A,另一台是用来承载的的服务器B,还有一台是nfs用来共享存储的服务器C。但是考虑到我的电脑只有8G的内存,我们可以这样,A服务器“兼职"做NFS.

角色/名字 IP 描述
kvm01 192.168.80.5
kvm02 192.168.80.6 目标
nfs 192.168.80.5 共享存储/data

准备工作:

  • 两边都得安装kvm,别忘记启动kvm。kvm01要有虚拟机,kvm02上并不要求有虚拟机。

  • 两边都必须是桥接,桥接完成之后别忘记重启网卡。

  • 虚拟机最好是静态地址,我们这里用192.168.80.10,UUID删除掉。

第一步:在kvm01安装图形界面&远程连接工具&vnc服务端

//用本地yum源
yum groupinstall "GNOME Desktop"  -y
yum install openssh-askpass -y
yum install tigervnc-server -y

我们安装图形界面的原因是用来承载vnc服务端,vnc的服务端是图形界面的,我们通过vnc客户端连接上服务端之后,就可以图形界面操作了。因为连接时要加密的,所以我们还要安装个加密传输的协议openssh。

第二步:给vnc服务端设置密码

//给vnc服务端设置密码,并启动vnc-server
[root@kvm01 ~]#vncpasswd----->输入两次密码,然后按n

//启动vncserver
[root@kvm01 ~]# vncserver :1

//检查一下vncserver是否启动
[root@kvm01 ~]# ss -tnlp | grep 590
LISTEN     0      1            *:5900                     *:*                   users:(("qemu-kvm",pid=11600,fd=17))
LISTEN     0      5            *:5901                     *:*                   users:(("Xvnc",pid=20532,fd=9))
LISTEN     0      5           :::5901                    :::*                   users:(("Xvnc",pid=20532,fd=10))

第三步:在kvm01上安装nfs,并共享带有虚拟机磁盘的目录 ,在kvm01和kvm02上挂载,挂载到同一个目录

[root@kvm01 ~]# yum install nfs-utils
[root@kvm01 ~]# mkdir /data
[root@kvm01 ~]# cat /etc/exports
/data 192.168.80.0/24(rw,async,no_root_squash,no_all_squash)   #禁止uid的映射
[root@kvm01 ~]# systemctl start nfs
//将opt目录下的所有文件(主机要磁盘文件)移动到data目录下
[root@kvm01 ~]# virsh shutdown centos7
[root@kvm01 ~]# mv /opt/* /data/

//两边都要挂载,更改所有人和所属组,更改所有人和所属组于前面的no_root_squash,no_all_squash相关。
[root@kvm01 ~]# mount -t nfs 192.168.80.5:/data /opt
[root@kvm02 ~]# mount -t nfs 192.168.80.5:/data /opt
[root@kvm01 ~]# chown -R qemu:qemu /opt
[root@kvm02 ~]# chown -R qemu:qemu /opt
//kvm01和kvm02都准备好域名解析文件
[root@kvm01 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.80.5 kvm01
192.168.80.6 kvm02

从kvm01上连接kvm02

虚拟化--KVM_干货_04

开始迁移

虚拟化--KVM_干货_05