1. 什么是虚拟化

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

2. 为什么要使用虚拟化

为了充分利于资源,软件运行环境的隔离,只要有虚拟化才能实现。

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

3. kvm虚拟化软件的安装

curl -o  /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum -y install libvirt virt-install qemu-kvm virt-manager

virt-install 命令行安装工具
virt-manager 图形界面安装工具
qemu-kvm 磁盘管理

systemctl start libvirtd
systemctl enable libvirtd

相关工具

  1. VNC:远程的桌面管理工具

  2. libvirt 作用:虚拟机管理软件

  3. libvirt:kvm,xen,qemu,lxc…

  4. virt virt-install virt-clon 作用:虚拟机的安装工具和克隆工具

  5. qemu-kvm qemu-img 作用:管理虚拟机的虚拟磁盘

虚拟机软件

  1. qemu 软件纯模拟全虚拟机软件,特别慢!AIX,兼容性好

  2. xen(半)性能特别好,需要使用专门修改后的内核,兼容性差!

  3. KVM(linux)全虚拟机,他有硬件支持CPU、基于内核,而且不需要使用专门的内核,性能较好、兼容性好。

4.安装一台kvm虚拟机

下载软件TghVNC或者VNC viewer 4.exe 用于远程连接虚拟机

#创建虚拟机磁盘镜像格式
[root@localhost opt]# qemu-img create -f raw /opt/CentOS-7.4-x86_64.img 10G
#创建虚拟机磁盘镜像 qcow2 格式
[root@localhost opt]# qemu-img reate -f qcow2 /opt/test01.qcow2 10G
[root@localhost opt]# virt-install --os-type=linux --os-variant rhel7 --name test01 --memory 512,maxmemory=1024 --vcpus 1,maxvcpus=10 --cdrom=/kvm/disk/CentOS-7-x86_64-DVD-1810.iso --disk path=/kvm/disk/test.qcow2 --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole
开始安装......
域安装仍在进行。您可以重新连接
到控制台以便完成安装进程。

virt-instal #命令安装工具
--virt-type kvm #指定创建类型
--os-type=linux #操作系统类型
--os-variant rhel7 #操作系统具体类型
--name test01 #虚拟机名称
--memory 512,maxmemory=1024 #内存大小
--vcpus 1,maxvcpus=10 #cpu内核数量
--cdrom=/kvm/disk/CentOS-7-x86_64-DVD-1810.iso #指定镜像源
--disk path=/kvm/disk/test.qcow2 #磁盘路径
--network bridge=br0 --network network=default #指定网卡类型 桥接模式 默认网卡类型
--graphics vnc,listen=0.0.0.0 #启用图像化加载,vnc监听地址。 默认端口号5900 会一次累加
--noautocnsole #支持console连接
  1. –virt-type kvm 虚拟化的类型(qemu)
  2. –so-type=linux 系统类型
  3. –os-variat rhel7 系统版本
  4. –name centos 虚拟机的名字
  5. –memory 1024 虚拟机的内存
  6. –vcpu 1 虚拟机的核数
  7. –disk /opt/centos2.raw,format=raw,size=10
  8. –cdrom

磁盘类型

raw: 10G 不支持做快照,性能好

qcow2:支持快照

5. kvm虚拟机的virsh日常管理和配置

说明

命令

查看当前运行的虚拟机

virsh list (-all 查看所有主机)

开机

virsh start 【虚拟机名称】

关机

virsh shutdown 【虚拟机名称】

重启虚拟机

virsh reboot 【虚拟机名】

强制关机

virsh destroy 【虚拟机名称】

挂起虚拟机

virsh suspend 【虚拟机名称】

恢复挂起的虚拟机

virsh resume 【虚拟机名称】

虚拟机重名命

virsh domrename 【old虚拟机名称】【new虚拟机名称】

导出虚拟机xml文件

virsh dumpxml 【虚拟机名】> 【xml文件名】

删除虚拟机

virsh undefine 【虚拟机名】

导入虚拟机

virsh define 【xml文件名】

修复虚拟配置xml

virsh edi 【虚拟机名】

创建快照

virsh snapshot-create 【虚拟机名称】

创建快照并命名

virh snapshot-create-as 【虚拟机名称】 【快照名称】

查看快照

virsh snapshot-list 【快照名称】

还原快照

virsh snapshot-revert 【虚拟机名称】 【快照名称】

删除快照

virsh snapshot-delete 【虚拟机名称】【快照名称】

虚拟机克隆

virt-clone --auto-clone -o 【虚拟机名】】 -n 【新虚拟机名】

自动加载虚拟机

virsh autostart【虚拟机名称】

查询虚拟机vnc端口号

virsh vncdisplay 【虚拟机名】

使用console方式连接

virsh console 【虚拟机名】

qemu-img命令

说明

命令

创建虚拟机磁盘文件

qemu-img create 【磁盘名】

调整虚拟机磁盘容量大小

qemu-img -d 【磁盘名】+5G 或者修改为指定大小 10G

查看磁盘信息

qemu-img info 【磁盘名】

6.kvm虚拟机开机启动和console登录

6.1 kvm虚拟机开机自启动 前提systemctl enable libvirtd

#添加开机自启动
virsh autostart 【虚拟机名】
#取消开机自启动
virsh autostart --disable 【虚拟机名】

6.2 centos7的kvm虚拟机console口

#在虚拟机执行
grubby --update-kernel=ALL --args="console=ttyS0,115200n8"

reboot 重启虚拟机

宿主机连接kvm虚拟机

[root@kvm opt]# virsh console centos7
连接到域 centos7
换码符为 ^] //按住ctrl+] 退出

[root@localhost ~]#

7.kvm虚拟机磁盘格式转换和快照管理

7.1虚拟磁盘格式转换

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

qcow2:cow (copy on write) 占用空间小,支持快照,性能比raw差一点

qcow2安装模式

virt-install --virt-type- kvm --os-type=linux --os-variant rhel7 --name centos7 --memory 1024 --vcpu 1 disk /data/web02.qcow2  --cdrom=/opt/CentOS-7-x86_64-DVD-1708.iso --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole

raw安装模式

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

7.2qemu-img常用命令

说明

命令

创建qcow2磁盘文件

qemu-img create -f qcow2 【磁盘名】 5G

创建raw格式磁盘文件

qemu-img create -f raw 【磁盘名】 5G

调整虚拟机磁盘容量大小

qemu-img resize 【磁盘名】+5G 或者修改为指定大小 10G

查看磁盘信息

qemu-img info 【磁盘名】

不管是什么格式的虚拟磁盘,都不要缩容!

convert 磁盘换格式
#qemu-img convert -f raw -O qcow2 test.raw test.raw.pcow2

<emulator>/usr/libexec/qemu-kvm</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/data/centos7.qcow2'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</disk>

7.2 快照管理

说明

命令

创建快照

virsh snapshot-create 【虚拟机名称】

创建快照并命名

virh snapshot-create-as 【虚拟机名称】 【快照名称】

查看快照

virsh snapshot-list 【快照名称】

还原快照

virsh snapshot-revert 【虚拟机名称】 【快照名称】

删除快照

virsh snapshot-delete 【虚拟机名称】【快照名称】

8.虚拟机的克隆

8.1 完整克隆

virt-clone --auto-clone -o  虚拟机名 -n 新虚拟机名

8.2 手动克隆:

复制磁盘文件
cp web00.qcow2 web01.qcow2
virsh dumpxml centos7 > web01.xml
vim web01.xml

<name>web01</name> //修改
<uuid>f859d86f-351b-4291-9cc0-469 e853c0006</uuid> //删除
<source file='/data/web01.qcow2'/> //修改
<mac address='52:54:00:bc:dd:5b'/> //删除
导入到虚拟机并进行启动测试

virsh define web01
virsh start web01

8.3 链接克隆

#1.基于原磁盘文件,创建连接磁盘文件
qemu-img create -f qcow2 -b 原磁盘文件 创建磁盘文件
#2.导入虚拟机并进行启动测试
virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name web02 --memory 512,maxmemory=3000 --vcpus 1,maxvcpus=10 --disk 磁盘名称 --boot hd --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole

9.kvm虚拟机网络

默认的虚拟机网络是NAT模式网段是192.168.122.0/24

(1)用户模式(NAT):这种方式是默认网络,数据包由NAT方式通过主机的接口进行传送,可以访问外网,但是无法从外网访问虚拟机网络

(2)桥接模式(Bridge):这种模式允许虚拟机像一台独立的主机一样拥有网络,外部的主机可以直接访问到虚拟机内部

9.1 第一次安装选择的网卡模式

默认NAT模式

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

桥接模式

[root@kvm ~]# virsh iface-bridge ens33 br0  #创建桥接

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

9.2 修改网卡桥接模式

#创建桥接网卡 ens33为真实网卡
[root@kvm ~]# virsh iface-bridge ens33 br0 #创建桥接

#此时br0就会占用ens33网络的ip地址
[root@kvm ~]# ifconfig br0
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.154.131 netmask 255.255.255.0 broadcast 192.168.154.255
inet6 fe80::20c:29ff:fee5:a571 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:e5:a5:71 txqueuelen 1000 (Ethernet)
RX packets 20464 bytes 1603615 (1.5 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 15324 bytes 2169921 (2.0 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0


[root@kvm ~]# virsh iface-unbridge ens33 br0 //删除命令

#查看虚拟交换绑定情况
[root@kvm ~]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000c29e5a571 yes ens33
virbr0 8000.52540000e202 yes virbr0-nic
vnet1
vnet2
vnet3

#取消桥接网卡
iface-unbridge br0

#更改虚拟机配置文件为桥接模式
<interface type='bridge'>
<mac address='52:54:00:56:48:53'/>
<source bridge='br0'/>

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

9.3. 创建多个 virbrn虚拟网卡

编写虚拟机网卡xml文件

vim virbrn3.xml

<network>
<name>192.168.20.0</name> ##虚拟机网卡名称
<uuid>66010a76-cfed-4ab7-9b0f-5a00e7549b14</uuid> ## UUId 必须唯一
<bridge name='virbr3' stp='on' delay='0'/> ##修改 必须唯一
<mac address='52:54:00:35:30:44'/> ##修改
<ip address='192.168.20.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.20.129' end='192.168.20.254'/>
</dhcp>
</ip>
</network>

创建

virsh net-create --file virbrn3.xml  ## 创建虚拟网卡
virsh net-start 192.168.20.0
virsh net-autostart 192.168.20.0
virsh net-list ##查看当前虚拟机网卡

10.热添加技术

10.1 kvm虚拟机在线添热添加硬盘

10.1.1 热添加磁盘命令

#先创建磁盘

qemu-img create -f qcow2 add01.qcow2 5G

#临时生效

virsh attach-disk web01 /data/oldboy.qcow2 vdb --subdrver qcow2

#永久生效

virsh attach-disk web01 data/oldboy.qcow2 vdb --subdrver qcow2   --config   //重启后才会生效
virsh attach-disk web01 /kvm_disk/web01.vdb.qcow2 vdb --cache none --subdriver qcow2

#磁盘分离

virsh detach-disk centos7 vdb

10.1.2 添加磁盘后对虚拟机磁盘进行扩容流程

#1.取消虚拟机磁盘挂载
[root@web02 ~]# umount -lf /data

#2.对虚拟机磁盘进行分离
[root@kvm kvm_disk]# virsh detach-disk web02 vdb

#3.扩容磁盘
[root@kvm kvm_disk]# qemu-img resize web02.vdb.qcow2 +5G

#4.查看磁盘容量信息
[root@kvm kvm_disk]# qemu-img info web02.vdb.qcow2

#5.重新添加磁盘到虚拟机
[root@kvm kvm_disk]# virsh attach-disk web02 /kvm_disk/web02.vdb.qcow2 vdb --subdriver qcow2

#6.虚拟机查看磁盘信息
[root@web02 ~]# fdisk -l
磁盘 /dev/vdb:16.1 GB, 16106127360 字节,31457280 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节

#7.虚拟机重新挂载磁盘
[root@web02 ~]# mount -a

#8.虚拟机查看容量大小发现磁盘容量没有改变
[root@web02 ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/vdb xfs 10G 33M 10G 1% /data

#9.刷新虚拟机磁盘容量
xfs_growfs /data

#10.再次查看磁盘容量发现你以改变
[root@web02 ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/vdb xfs 15G 33M 15G 1% /data

10.1.3 根分期扩容

#1.关闭虚拟机
[root@kvm kvm_disk]# virsh destroy web02

#2.扩容磁盘
[root@kvm data]# qemu-img resize web02.qcow2 +5G

#3.启动虚拟机并对磁盘添加分期
[root@kvm data]# virsh start web02

#4.修改虚拟机分区
[root@web02 ~]# fdisk -l

#5.重启虚拟机
[root@web02 ~]# reboot

#6.刷新磁盘
xfs格式:xfs_growfs /dev/sda1
ext4 resize2fs /dev/sda1

10.2 kvm虚拟机在线添加网卡

10.2.1 操作命令

#临时添加网卡

virsh attach-interface web01 --type bridge --source br0 --model virtio

#永久添加网卡

virsh attach-interface web01 --type bridge --source br0 --model virtio --config

#删除网卡

virsh detach-interface web01 bridge --mac 52:54:00:ea:fa:77

#查看虚拟机网卡信息

[root@kvm ~]# virsh domiflist web01
接口 类型 源 型号 MAC
vnet0 bridge br0 virtio 52:54:00:56:eb:b4
vnet2 bridge br0 virtio 52:54:00:07:20:36

10.3 kvm虚拟机在线添加内存

第一次安装需要添加参数:

–memory 512,maxmemory=2048 //分配容量与最大分配内存容量

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

#临时热添加内存

virsh setmem web01 1024M --live

#永久增大内存

virsh setmem web01 1024M --config

10.4 kvm虚拟机在线添加cpu

第一次安装需要添加参数:

–vcpus 1,maxvcpus=10 //分配cpu与最大使用内核数量

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

#临时添加cpu核数

setvcpus web01 4 --live

#永久添加cpu核数

setvcpus web01 4 --config

11.kvm热迁移

1. KVM虚拟化学习_centos

热迁移条件:

kvm热迁移需要将磁盘文件进行文件共享nfs

为什么要热迁移

1.尽可能停机实践短!

服务安全等级

11.1 操作案例

要求:将kvm01中的test01虚拟机热迁移至web01系统

11.1.1 准备环境

kvm01 192.168.10.1 192.168.154.1

kvm02 192.168.10.2 192.168.154.2

nfs—server 192.168.10.3 192.168.154.3

11.1.2 nfs-server 操作

[root@nfs-server ~]# yum -y install nfs-utils
[root@nfs-server ~]# mkdir -p /kvm/disk
[root@nfs-server ~]# echo "/kvm/disk 192.168.10.0/24(rw,no_root_squash,all,squash)" >/etc/exports

#启动nfs
[root@nfs-server ~]# systemctl start rpcbind
[root@nfs-server ~]# systemctl enable nfs

11.1.3 kvm01操作

#安装nfs
[root@kvm02 ~]# yum -y install nfs

#挂载nfs共享文件
[root@kvm02 ~]# echo "192.168.10.3:/kvm/disk /kvm/disk nfs defaults 0 0 "

#安装kvm
[root@kvm02 ~]# yum -y install libvirt virt-install qemu-kvm -y

#1创建磁盘
[root@kvm02 ~]# qemu-img create -f raw /opt/CentOS-7.4-x86_64.img 10G

#安装kvm虚拟机
[root@kvm02 ~]# virt-install --name test01 --memory 512,maxmemory=1024 --vcpus 1,maxvcpus=10 --cdrom=/kvm/disk/CentOS-7-x86_64-DVD-1810.iso --disk path=/kvm/disk/test.qcow2 --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole

#将虚拟机迁移至web02
[root@kvm02 ~]# virsh migrate test01 qemu+ssh://192.168.10.6/system --unsafe
--unsafe 即使不安全也要强制迁移
--persistent 目的地中的持久 VM
--undefinesource 在源中取消定义 VM
--copy-storage-all 使用全磁盘复制的非共享存储进行迁移

11.1.3 web01操作

此时web01中已经存在虚拟机test01 并且是运行状态 中间迁移只丢1个包

[root@web01 disk]# virsh  list --all

Id 名称 状态

5 test03 running
6 test01 running

11.1.4 图形界面操作

需要安装vnc软件于和桌面环境

yum -y groupinstall GNOME 桌面

#安装vnc软件
[root@web01 ~]# yum -y install tigervnc-server
[root@web01 ~]# vncserver :10

1. KVM虚拟化学习_5g_02

11.2 EXSI虚拟化到kvm虚拟机迁移

流程

首选导出ESXI中的的虚拟机为ova格式copy到kvm虚拟机中进行格式

#安装转换格式组件
[root@kvm02 ~]# yum -y install virt-v2v

#将ova转换为qcow2格式
[root@kvm02 ~]# virt-v2v -i ova centos-dev-test01-v2v.ova -o local -os /opt/test.qcow2 -of qcow2

#创建虚拟机并启动
[root@kvm02 ~]# virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name web01 --memory 512,maxmemory=2048 --vcpus 1,maxvcpus=10 --disk /opt/test.qcow2 --boot hd --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole