KVM虚拟化架构
手把手教学kvm虚拟化使用
kvm
概念
kvm 是做为内核模块嵌入linux 的,所以并不会剥夺kernel的cpu和内存的控制权
kvm 的管理方式是将运来的用户空间作为控制台,对kvm 进行管理,包括创建,删除,保存,迁移,配置虚拟机等.
kvm 每创建的一个虚拟机都是在一个额外的进程 ,其拥有的cpu 和内存被抽象为线程,如果我们想关闭一个虚拟机,直接kill 掉其对应即可
kvm使用一个设备文件/dev/kvm 作为整个kvm的调用接口, /dev/kvm 工作于Hypervisor(内核空间)kvm 只是一个模块,所以它没有提供有关I0调用的方法,所以借用QEMU通过这个使用IO设备---当kvm的用户空间需要进行IO操作的时候,首先会把请求发送给自己的内核,然后Guest内核会向宿主机的用户空间的QUMU程序发送请求,让其为自己进一步的操作,最后宿主机用户空间的qumu再对真正的内核进行请求,进行IO操作
两类组件
/dev/kvm
qumu:工作于用户空间主要用于实现模拟PC机的IO设备
特性
-
支持将分配的VM的内存交换至SWAP;
-
支持使用Huge Page(大内存页)机制;
-
支持使用Intel EPT或AMD RVI技术完成内存地址映射;
-
> 将多个MV加载的相同的内存页(比如相同的库文件)合并成一个,从而减少内存的占用;类似于共享内存功能;当某虚拟机要修改自己的内存页时,会通过写时复制为其创建一个副本,供其修改;
-
支持KSM(Kernel Same-Page Merging);
存储:
支持本地存储 支持网络附加存储 支持存储区域网络 支持分布式存储:GlustFS
迁移:
跨物理主机迁移,可分为热迁移和冷迁移;
-
冷迁移:线下迁移,关机迁移,服务中断;
-
热迁移:线上迁移,服务不中断,在虚拟机运行过程中,将其内存中的数据复制(复制时虚拟机会暂停)一份到另一台物理主机上,且挂载其位于共享存储中的磁盘映像文件,从而实现实时迁移,然后原先的虚拟机就可以关掉了;
设备驱动:
-
支持IO设备的完全虚拟化:模拟硬件
-
支持IO设备的半虚拟化:在Guest OS中安装驱动,类似于front-end(Guest OS提供)|backed-end(Kernel提供)机制;
常用组件为virtio,其支持块设备(virtio-blk)的半虚拟化、网络设备(virtio-net)的半虚拟化、PCI设备(virtio-pci)的半虚拟化、控制台设备(virtio-console)的半虚拟化、内存空间动态扩展机制(virtio-ballon)的半虚拟化;
局限:
过载使用CPU时会导致性能下降,所以一般不建议虚拟CPU的数量(物理机上的所有VCPU数量)大于物理CPU的数量(此处的数量指的是核心数); 时钟不精确,这几乎时所有虚拟机的弊病,其依赖于时间同步机制(比如NTP); MAC地址可能冲突(虚拟机数量特别多的时候才能遇到的问题);
工具栈:
QEMU组件: 主要提供了以下功能:
处理器模拟器,用于完成异构; 仿真IO设备; 管理模拟的设备至真实设备; 调试器 与模拟器交互的用户接口;
工具: qemu-io qemu-img qemu-kvm:专门用于管理KVM的工具; libvirt工具栈:支持远程管理,需要在被管理主机上运行libvirtd服务; virsh、virt-install:字符命令行管理工具 virt-manager、virt-viewer:图形化的管理工具
服务安装
查看机器是否支持虚拟化
# cat /proc/cpuinfo | egrep 'vmx|svm'
安装软件:
# yum groupinstall "Virtualization Client" "Virtualization Platform" "Virtualization Tools" -y
# yum install -y qemu-kvm libvirt ###qemu-kvm用来创建虚拟机硬盘,libvirt用来管理虚拟机
# yum install -y virt-install ###用来创建虚拟机
跟虚拟机相关的目录:
/etc/libvirt/storage #存储池配置文件存放位置
/etc/libvirt/qemu/ #虚拟机配置文件存放位置
/etc/libvirt/qemu/networks #虚拟网络配置文件存放位置
/var/lib/libvirt/images/ #虚拟磁盘文件存放位置(默认存储池)
启动服务:
# systemctl start libvirtd
图形管理器virt-manager命令方式安装虚拟机: virt-install
存储
存储池:
存储池(Storage pools)是放置虚拟机的存储位置,存储池可以建立在好几种方式的存储上,我们以基于目录为存储池来学习。
默认存储池位置: **/var/lib/libvirt/images/**
创建存储池(目录)[非必须] 1.图形方式: 编辑 → 连接详情 → 存储 2.命令方式:
# mkdir /kvm/disk
定义存储池
# virsh pool-define-as vmdisk --type dir --target /kvm/disk
查看已定义的存储池
# virsh pool-list --all
激活并自动启动已定义的存储池,存储池不激活无法使用。
# virsh pool-start vmdisk
# virsh pool-autostart vmdisk
这里vmdisk存储池就已经创建好了,可以直接在这个存储池中创建虚拟磁盘文件了。
存储卷:
存储卷(storage volume)指虚拟磁盘文件,可以理解为虚拟机的硬盘在存储池中创建虚拟机存储卷virsh命令:
创建存储卷:
# virsh vol-create-as vmdisk mini.qcow2 20G --format qcow2
查看存储卷:
# virsh vol-list vmdisk
名称 路径
----------------------------------------------------------------------------
mini.qcow2 /kvm/disk/mini.qcow2
qemu命令(不会被存储池管理)
qemu-img create -f qcow2 /var/lib/libvirt/images/mini.qcow2 20G
注1:KVM存储池主要是体现一种管理方式,可以通过挂载存储目录,lvm逻辑卷的方式创建存储池
注2:KVM存储池也要用于虚拟机迁移任务。
存储池相关管理命令
取消激活存储池
# virsh pool-destroy vmdisk
取消定义存储池
# virsh pool-undefine vmdisk
网络
KVM虚拟机网络配置的两种方式:NAT方式和Bridge方式。 NAT--用户网络(User Networking):让虚拟机访问主机、互联网或本地网络上的资源的简单方法,但是不能从网络或其他的客户机访问客户机。** Bridge--虚拟网桥(Virtual Bridge):这种方式要比用户网络复杂一些,但是设置好后客户机与互联网,客户机与主机之间的通信都很容易。**
Bridge方式
Bridge方式即虚拟网桥的网络连接方式,是客户机和子网里面的机器能够互相通信。可以使虚拟机成为网络中具有独立IP的主机。
配置:
1、编辑修改网络设备脚本文件,增加网桥设备br0 # vim /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
BOOTPROTO=static
ONBOOT=yes
TYPE=bridge
IPADDR=192.168.50.40
GATEWAY=192.168.40.254
DNS1=114.114.114.114
DNS2=8.8.8.8
2、编辑修改网络设备脚本文件,修改网卡设备ens33 # vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BRIDGE=br0
BOOTPROTO=none
DEVICE=enp33
ONBOOT=yes
3、重启网络服务
# /etc/init.d/network restart
4、校验桥接接口
# ifconfig br0
# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.f0795962c1cc no en33
virbr0 8000.5254005a2e43 yes virbr0-nic
启动STP
# brctl stp sr0 on
NAT方式(默认)
NAT方式是kvm安装后的默认方式。它支持主机与虚拟机的互访,同时也支持虚拟机访问互联网,但不支持外界访问虚拟机。
修改NAT网络例:将default网络的dhcp功能关闭修改网络配置文件
virsh net-edit defult #删除以下三行
```bash
<dhcp>
<range start='192.168.122.2' end='192.168.122.254'/>
</dhcp>
```
重启default网络
virsh net-destroy default #关闭default网络
virsh net-start default #启动default网络
1.创建NAT网络: 1). 图形方法: 2). 命令方法:
# cd /etc/libvirt/qemu/networks/
# cp default.xml nat-20.xml
修改配置文件:
vim nat-20.xml #改名称,UUID,MAC地址
<domain name='nat-20'/> #加一行nat网络名称
创建网络:
virsh net-create nat-20.xml
查看网络:
# virsh net-list --all
# virsh net-define /etc/libvirt/qemu/networks/nat-20.xml
# virsh net-autostart nat-20
虚拟机安装
# virt-install -n c7 \
--memory 1024 \
--vcpus=1 \
--cdrom /data/iso/CentOS-7-x86_64-DVD-1908.iso \
--disk /data/img/c7.qcow2,size=10,format=qcow2,bus=scsi \
--network bridge=br0 \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole
参数说明:
--name # 虚拟机名称,需全局惟一
--memory # 虚拟机内在大小,单位为MB
--vcpus # VCPU个数及相关配置
--virt-type # 使用的hypervisor,如kvm、qemu、xen等;所有可用值可以使用virsh capabilities命令获取;
--cdrom # 光盘安装介质
--disk # 指定存储设备及其属性
--network bridge=br0 # 将虚拟机连入宿主机的网络中
--graphics vnc,listen=0.0.0.0 # 使vnc可以连接
--noautoconsole # 禁止自动连接至虚拟机的控制台
虚拟机管理:
连接
查看虚拟机ip
virsh dumpxml domain |grep 'mac addr'
vncview 端口可用netstat -tnlp 查看
安装过程和vmware 安装无异 vi /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0
UUID=0e913cd6-599e-4bdb-a2ca-2c15bb87ea60
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.50.100
GATEWAY=192.168.50.254
DNS1=114.114.114.114
DNS2=8.8.8.8
[root@localhost ~]# ping -c 3 g.cn
PING g.cn (203.208.41.98) 56(84) bytes of data.
64 bytes from 203.208.41.98 (203.208.41.98): icmp_seq=1 ttl=128 time=22.7 ms
64 bytes from 203.208.41.98 (203.208.41.98): icmp_seq=2 ttl=128 time=18.9 ms
64 bytes from 203.208.41.98 (203.208.41.98): icmp_seq=3 ttl=128 time=22.2 ms
--- g.cn ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2005ms
rtt min/avg/max/mdev = 18.998/21.344/22.752/1.678 ms
[root@localhost ~]#
使用 ssh 可直接连接
初始化
# systemctl stop firewalld
# systemctl stop NetworkManager
# systemctl disable firewalld
# systemctl disable NetworkManager
宿主机能使用console命令连接
# systemctl start serial-getty@ttyS0.service
# systemctl enable serial-getty@ttyS0.service
# setenforce 0
#sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config
epel源
# rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
# yum install -y net-tools vim lrzsz tree screen lsof tcp wget tcpdump nc mtr nmap openssl-devel ntpdate glances bash-completion psmisc
文件描述符数量
# echo "* soft nofile 65535" >> /etc/security/limits.conf
# echo "* hard nofile 65535" >> /etc/security/limits.conf
# echo "* soft nproc 65535" >> /etc/security/limits.conf
# echo "* hard nproc 65535" >> /etc/security/limits.conf
记录历史命令
# echo 'export HISTTIMEFORMAT=" %F %T `whoami` "' >> /etc/profile
# source /etc/profile
ntp配置
# crontab -e
*/5 * * * * /usr/sbin/ntpdate time1.aliyun.com
【内核参数优化】
# cat /etc/sysctl.conf
# 表示套接字由本端要求关闭,这个参数决定了它保持在FIN-wAIT-2状态的时间,默认值是60秒,建议调整为2,该参数对应系统路径为:/proc/sys/net/ipv4/tcp_fin_timeout 60
net.ipv4.tcp_fin_timeout = 2
# 表示开启TCP链接中TIME_WAIT sockets的快速回收,该参数对应系统路径为:/proc/sys/net/ipv4/tcp_tw_recycle,默认为0 表示关闭,不建议开>启,因为nat网络问题
net.ipv4.tcp_tw_reuse = 1
# reuse和recycle这俩个参数是为防止生产环境下web,squid等业务服务器time_wait网络状态数量过多设置的
net.ipv4.tcp_tw_recycle = 0
#表示开启SYN Cookies功能,当出现SYN等待队列溢出时,启用Cookies来处理,可防范少量SYN攻击,该参数对应系统路径为:/proc/sys/net/ipv4/tcp_syscookies,默认为1,表示开启
net.ipv4.tcp_syncookies = 1
# 关闭ipv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
# 避免放大攻击
net.ipv4.icmp_echo_ignore_broadcasts = 1
#允许系统打开的端口范围,不建议从1024开始,因为某些端口会存在10000以内。一般情况下已够用。
net.ipv4.ip_local_port_range = 10000 65000
缓存设置
# yum makecache
克隆
将c7克隆一个为c7-2
# virt-clone -o c7 -n c7-2 -f /data/img/c7-2.qcow2
修改ip地址之后即可使用
#!/bin/bash
#delete KVM host completely
read -p "please input host that you want to delete:" $host
virsh destroy $host
virsh undefine $host
rm -f /var/lib/libvirt/images/$host.qcow2
快照
创建
# virsh snapshot-create-as c7 c7-mir
恢复
# yum install acpid -y
恢复快照前虚拟机需要关闭
# virsh snapshot-revert c7 c7-mir
删除
删除快照也需要虚拟机关闭
# virsh snapshot-delete c7 c7-mir
查看
# virsh snapshot-list c7
Name Creation Time State
------------------------------------------------------------
c7-mir 2020-10-18 23:58:49 -0400 running
[root@km img]#
virsh snapshot-dumpxml c7 c7-mir ## 查看一个快照的详细信息 virsh snapshot-current #查看最新的快照
迁移
虚拟机迁移分为冷迁和热迁冷迁:又叫静态迁移,虚拟机在关机状态下,拷贝虚拟机虚拟磁盘文件与配置文件到目标主机中,实现的迁移。热迁:又叫动态迁移,虚拟机无需关机,无需拷贝虚拟磁盘文件,但是需要迁移到的虚拟主机之间需要有相同的目录结构虚拟机磁盘文件.基于共享存储的热迁移
冷迁
迁移源主机: 192.168.50.40 km
迁移目标主机: 192.168.50.41 km2
1.确定虚拟机处于关机状态
virsh list --all
2准备迁移c7虚拟机,查看该虚拟机配置的磁盘文件
virsh domblklist c7
3.拷贝磁盘文件,配置文件到目标宿主机
# cd /data/img
# rsync c7.qcow2 192.168.50.41:/data/img
# cd /etc/libvirt/qemu
# rsync c7.xml 192.168.50.41:/etc/libvirt/qemu
4.在目标宿主机上激活虚拟机
# virsh define /etc/libvirt/qemu/test.xml
5.启动虚拟机
# virsh start test
热迁(基于本地存储)
迁移源主机: 192.168.50.40
迁移目标主机: 192.168.50.41
使用tcp认证
配置libvirtd服务** 源宿主机和目标宿主机都要执行**vim /etc/libvirt/libvirtd.conf
listen_tls = 0
listen_tcp = 1
tcp_port = "16509"
listen_addr = "0.0.0.0"
auth_tcp = "none"
mdns_adv = 0
配置libvirtd监听方式(无论是tcp,ssh,tls认证方式都需要配置) ** 源宿主机和目标宿主机都要执行**
# vim /etc/sysconfig/libvirtd
LIBVIRTD_ARGS="--listen"
**编辑/etc/libvirt/qemu.conf文件 **源宿主机和目标宿主机都要执行
#vim /etc/libvirt/qemu.conf
vnc_listen = "0.0.0.0"
重启libvirtd服务,使配置生效, 源宿主机和目标宿主机都要执行
systemctl restart libvirtd
检查端口和进程,源宿主机和目标宿主机都要执行
# netstat -tanp |grep libv
tcp 0 0 0.0.0.0:16509 0.0.0.0:* LISTEN 5061/libvirtd
原机器和目标机器要做好hosts解析
在源宿主机测试连接目标宿主机
# virsh -c qemu+tcp://192.168.50.41/system list --all
在目标宿主机上创建同样大小的磁盘文件,名称,路径,大小都要一样
# virsh vol-create-as img c7-2.qcow2 10G --format qcow2
迁移
# virsh migrate --live --copy-storage-all --unsafe --persistent test qemu+tcp://km-2/system
不知道是不是宿主机是vmware 的缘故报错说cpu 不支持
硬件管理
添加硬件都可以用virsh edit DomainName 来修改
cpu
生成环境只增不减virsh setvcpus c7 2
硬盘
创建一个硬盘qemu-img create -f qcow2 c7-sdb.qcow2 20G#新建xml文件[root@idc img]# vim temp.xml
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' cache='writeback'/>
<source file='/data/img/c7-sdb.qcow2'/>
<target dev='sdb' bus='scsi'/>
</disk>
#加载xml文件 参数 --config 是写入配置文件 --live 是热添加
virsh attach-device c7 temp.xml --config --live
Device attached successfully
#查看虚拟机c7的硬盘信息
virsh domblklist c7
模板复制
# cp /data/kvm/img/CentOS7.6-template.qcow2 /Data/kvm/img/node-192.168.5.90-test.qcow2
# virt-install --name node-test1 --ram 512 --vcpus=1 --virt-type kvm --disk /data/kvm/img/node1-test.qcow2,size=5,bus=virtio --network bridge=br0,model=virtio --import --graphics vnc,listen=0.0.0.0 --noautoconsole
XML文件管理
编辑xml模板文件(避免出现问题先随便创建一个虚拟机然后复制修改)
cd /data
mkdir xml
cd xml
cp /etc/libvirt/qemu/centos1.xml /data/xml/centos2.xml
name 修改
生成uuid 替换原本uuid
创建磁盘镜像并替换
qemu-img create -f raw centos2.raw 10G
挂在iso
随即生成mac地址并替换
echo 00:60:2f:`openssl rand -hex 3 | sed 's/\(..\)/\1:/g; s/.$//'`
方法1:IP地址不会变,修改
复制模板镜像
修改从模板复制过来的xml文件,路径(/etc/libvirt/qemu/domain.xml)并做修改
virsh define domain.xml
KVM主机动态更改cpu数量和内存大小https://yq.aliyun.com/articles/474895/磁盘管理参考https://www.cnblogs.com/1naonao/p/12009025.html
qcow2 和 raw 的区别
【qcow2】: 占用空间小,支持加密,支持压缩,支持快照的特点
【raw】:启动的虚拟机I/O效率高
命令
*virsh list --all 查看所有虚拟机状态
*virsh destroy centos_test1 强制停止一个虚拟机
*virsh shutdown vm-name 正常关机
* virsh dumpxml vm-name 查看kvm虚拟机配置文件
* virsh edit vm-name 修改虚拟机的配置文件(部分选项修改以后start虚拟机就可以生效)
* virsh start vm-name 启动kvm虚拟机
* virsh shutdown vm-name 正常关机
* virsh destroy vm-name 非正常关机,强制关闭虚拟机(相当于物理机直接拔掉电源)
* virsh undefine vm-name 删除vm的配置文件
* ls /etc/libvirt/qemu 查看删除结果,Centos-6.6的配置文件被删除,但磁盘文件不会被删除
* virsh define file-name.xml 根据配置文件定义虚拟机
* virsh suspend vm-name 挂起,终止
* virsh resumed vm-name 恢复被挂起的虚拟机
* virsh autostart vm-name 开机自启动vm
* virsh console <虚拟机名称> 连接虚拟机
*virsh suspend vm-name 挂起虚拟机
*virsh resumed vm-name 恢复被挂起的虚拟机
*virsh snapshot-create 创建快照
*virt-df -h vm-name 查看虚拟机的磁盘信息
*virt-clone -o rhel7.0 -n rhel7.0-01 -f /var/rhel7.0-01.qcow2 克隆虚拟机
virsh snapshot-create rhel7.0 创建快照(格式必须是qcow2)
virsh snapshot-list rhel7.0 查看快照信息(如果要恢复的话或者删除必须要看名称是什么)
virsh snapshot-revert rhel7.0 1537275180 恢复快照
virsh snapshot-delete rhel7.0 1537275180 删除快照
vrish参数
autostart#自动加载指定的一个虚拟机
connect#重新连接到
hypervisorconsole#连接到客户会话
创建#从一个SML文件创建一个虚拟机
start#开始一个非活跃的虚拟机
销毁#删除一个虚拟机
define#从一个XML文件定义一个虚拟机
domid#把一个虚拟机名或UUID转换为
IDdomuuid#把一个郁闷或ID转换为
UUIDdominfo#查看虚拟机信息
domstate#查看虚拟机状态
domblkstat#获取虚拟机设备快状态
domifstat#获取虚拟机网络接口状态
dumpxml #XML中的虚拟机信息
编辑#编辑某个虚拟机的XML文件
list#列出虚拟机
migration#将虚拟机迁移到另一台主机
退出#退出非互动终端
reboot#重新启动一个虚拟机
resume#重新恢复一个虚拟机
保存#把一个虚拟机的状态保存到一个文件
#把一个虚拟机的内核转储到一个文件中以方便分析
shutdown#关闭一个虚拟机
setmem#更改内存的分配
setmaxmem#更改最大内存限制值
暂停#挂起一个虚拟机
vcpuinfo#虚拟机的cpu信息
版本#显示virsh版本
添加博主
微信号|yfq940-
期待你的
分享
点赞
在看
创作不易,支持一下呗