KVM虚拟化架构

发布时间 2023-11-22 16:20:41作者: 往事已成昨天

手把手教学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-

期待你的

分享

点赞

在看

对抗一下

创作不易,支持一下呗

收录于合集 #虚拟化
 2
上一篇web管理kvm虚拟机webvirtmgr
 
阅读 176
步步运维步步坑
 
 
关注后可发消息