本章概要
- 虚拟化
- 常见虚拟化技术
- KVM
- Virsh命令
- 虚拟机管理软件
- qemu-kvm
1、虚拟化
- 在计算机技术中,虚拟化(技术)或虚拟技术(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等),予以抽象、转换后呈现出来并可供分割、组合为一个或多个计算机配置环境。由此,打破实体结构间的不可切割的障碍,使用户可以比原本的配置更好的方式来应用这些计算机硬件资源。这些资源的新虚拟部分是不受现有资源的架设方式,地域或物理配置所限制。一般所指的虚拟化资源包括计算能力和数据存储。
- 虚拟机:虚拟计算机设备
在管控逻辑上实现切割,在有限的资源之上覆盖一层管理软件,让管理软件在底层存储逻辑概念上对硬件加以切分,在逻辑上用软件模拟出或虚拟出硬件
CPU虚拟化
- 管理软件在逻辑上把CPU上连续的时间轴上切分为多个时间片,分给不同的虚拟机,处理该虚拟机的进程,这就相当于给该虚拟机配置了一个CPU
- 现代计算机以多任务多用户模式运行,内核把提供计算能力的计算资源进行虚拟化,因此操作系统就相当于内核的一个虚拟机
虚拟机是在操作系统对内核虚拟化之后进行的二次虚拟化,在虚拟化资源上安装操作系统,操作系统上存在两个空间:内核空间和用户空间,这样一来就存在了两个内核,也即存在两级管理 - x86架构cpu
从外向内为环3、环2、环1、环0
特权指令:存放在环0 控制指令
非特权指令:存放在环3 运算操作的非特权指令
环1和环2没有使用
只有操作系统有权限运行环0上的特权指令,任何运行在用户空间的进程使用非特权指在环3上运行,要想使用环0上的特权指令就需要进行系统调用,系统把环0进行封装并查任何一个请求者是否有权限进行调用
如下图所示:
- 半虚拟化、准虚拟化(paravirtualization)
典型代表:Xen
直接让内核知道运行在虚拟环境中,需要更改内核,linux支持
修改虚拟机的内核和宿主机的内核,让二者进行对接。当有需求虚拟机不会直接调用内核,而是调用宿主机提供的API,这样就去除了其中一部分步骤
- 完全虚拟化
通过 VMM 来预先拦截这些 OS 当中原本不能被虚拟化的命令(nonvirtualizable instructions),并将其进行二进制转译的替换操作,使操作系统认为自己可以直接掌控硬件,并不知道实际上已经被虚拟化成为虚拟机了,而应用程序一般性的命令则还是直接向硬件请求,以维持良好的性能。如下图所示:
- 硬件辅助虚拟化hvm
虚拟机内核使用环0,宿主机内核使用环-1
虚拟机内核发送特权指令时会触发环-1,唤醒真正的宿主机内核执行相关任务
需要CPU硬件生产厂商支持,在环0内增加一个环,即-1环
内存虚拟化
- 把虚拟机称为客户机Guest,物理机称为宿主机Host
物理机和虚拟机均可视为两层结构:
客户机Guest虚拟地址到客户机Guest物理地址的映射
宿主机Host虚拟地址到宿主机Host物理地址的映射 - 二次虚拟化:操作系统是对物理内核的一次虚拟化,在操作系统之上进行再次虚拟化是为二次虚拟化,相当于在宿主机之上叠加客户机,这样一来就形成了四级结构
如下所示:
四级结构:
客户机虚拟地址GVA-->客户机物理地址GPA-->宿主机虚拟地址HVA-->宿主机物理地址HPA
客户机虚拟地址GVA:Guest Virtual Adress
客户机物理地址GPA:Guest Physical Adress
宿主机虚拟地址HVA:Host Virtual Adress
宿主机物理地址HPA:Host Physical Adress
其中前两步由虚拟机的系统页表完成,
中间两步由 VMM 定义的映射表(由数据结构 kvm_memory_slot 记录)完成,它可以将连续的虚拟机物理地址映射成非连续的 Host 机虚拟地址,
后面两步则由 Host 机的系统页表完成
这样做得目的有两个:
提供给虚拟机一个从零开始的连续的物理内存空间。
在各虚拟机之间有效隔离、调度以及共享内存资源
-
页表page table:存储虚拟地址到物理地址的映射关系
-
MMU(内存管理单元):基于硬件实现对页表的管理,加速页表的查询速度。
-
传统的内存虚拟化方式,虚拟机的每次内存访问都需要VMM介入,并由软件进行多次地址转换,其效率是非常低的。因此才有了影子页表技术和 EPT 技术。
-
影子页表(shadow page table)简化了地址转换的过程,实现了Guest虚拟地址空间到Host物理地址空间的直接映射。
要实现这样的映射,必须为Guest的系统页表设计一套对应的影子页表,然后将影子页表装入Host的MMU中,这样当Guest访问Host内存时,就可以根据MMU 中的影子页表映射关系,完成GVA到HPA的直接映射。而维护这套影子页表的工作则由VMM来完成。
由于Guest中的每个进程都有自己的虚拟地址空间,这就意味着VMM要为Guest中的每个进程页表都维护一套对应的影子页表,当Guest 进程访问内存时,才将该进程的影子页表装入Host的MMU中,完成地址转换。
我们也看到,这种方式虽然减少了地址转换的次数,但本质上还是纯软件实现的,效率还是不高,而且VMM承担了太多影子页表的维护工作,设计不好。
为了改善这个问题,就提出了基于硬件的内存虚拟化方式,将这些繁琐的工作都交给硬件来完成,从而大大提高了效率。 -
EPT 扩展页表 在原有影子页表的基础之上,直接实现了客户机物理地址到宿主机物理地址的映射,步骤如下所示:
三级结构:客户机虚拟地址GVA-->客户机物理地址GPA-->宿主机物理地址HPA
即影子页表实现客户机Guest虚拟地址到客户机Guest物理地址的映射,
EPT页表实现Guest物理地址到宿主机Host物理地址的映射
而影子页表存在MMU中被管理,这样一来就实现了Guest物理地址到宿主机Host物理地址的直接映射,进一步提升了访问的效率
总结:
内存虚拟化经历从虚拟内存,到传统软件辅助虚拟化,影子页表,再到硬件辅助虚拟化,EPT 技术的进化,效率越来越高。
转载博客为 https://blog.csdn.net/yongliang_w/article/details/78367644
https://www.cnblogs.com/bakari/p/7966707.html
-
软件级:
影子页表(shadow page table) 属于半虚拟化 -
硬件级:
AMD:NPT(嵌套式页表)
Internet:EPT(扩展页表) 属于完全虚拟化 -
二级转换:
影子页表:虚拟机进程-->虚拟机内核-->物理机内核 基于软件实现
EPT:虚拟机进程-->物理机内核 基于硬件实现,速度更快
IO虚拟化
- IO路径需要虚拟
IO设备背后所需要的设备也需要虚拟
IO设备模拟器:在物理机上用文件充当硬盘使用,即在虚拟机层上使用文件模拟硬盘,在虚拟机访问硬盘接口时,查看到的是用文件模拟的硬盘
虚拟机用户空间某进程访问硬盘时,需要两级驱动:
首先把IO请求发送给虚拟机内核,内核需要驱动软件模拟的虚拟机硬盘,因此虚拟机内核把IO请求指令封装为物理格式发送给模拟虚拟机硬盘的软件,软件把指令转为对宿主机内核的IO请求,宿主机再驱动物理硬盘接口连接物理硬盘
假如在此过程中软件模拟的硬盘给scsi格式,而物理硬件为USB格式,这就形成了两级驱动
解决方法:
半虚拟化:
减少中间环节:让虚拟机内核知道处于虚拟空间,把虚拟机内核请求封装起来直接发送给物理机内核
IO透传技术:穿透物理机内核,给虚拟机内核分配一部分物理磁盘,让虚拟机直接驱动物理硬盘
性能好,影响迁移,并不常用
网络虚拟化
- 软件模拟
用纯软件模拟交换机
veth device 虚拟以太网设备
可以模拟出一对网卡,一头连接虚拟机充当网卡,一头连接交换机充当接口
linux用纯软件在内核级模拟交换机,完成报文交换
OpenVSwitch 开源虚拟交换机ovs,功能强大 - 半虚拟化
透传技术:影响迁移,不常用
知识扩展:
vmware workstation网络模式
仅主机模式 虚拟机仅能和宿主机通信
可以把安装vmware生成虚拟网卡看做一个虚拟交换机,给虚拟网卡配置一个ip地址,并且虚拟机连接到该虚拟交换机上,相互之间就可以通信;此时虚拟交换机没有打开转发功能,因此只能连接在虚拟交换机上的主机之间相互通信
注意:仅主机模式仅支持虚拟机内同一网段主机之间通信,那么虚拟机之间不同网段通信则需要开启转发功能,手动添加路由条目或者指定网关
NAT模式
虚拟交换机开启虚拟机转发功能,只需在宿主机进行SNAT源地址地址转换,把虚拟机内部的主机ip地址转换为物理网卡的ip地址,这样就能实现虚拟机内部的所有主机与虚拟机之外的主机进行通信
虚拟机启动自动获取地址:在虚拟机开启一个进程设置为DHCP服务器,连接到虚拟交换机上,如此就能自动获取ip地址
桥接模式
宿主机的物理网卡腾出来当做交换机,再创建虚拟网卡充当宿主机的网卡,宿主机的ip地址直接转移到虚拟网卡之上,物理机与虚拟机都可以连接到物理网卡充当的交换机上与web(外网)进行通信
缺点:使用桥接模式连接的主机都处于同一个网段,容易产生广播风暴
2、常见虚拟化技术
主机级虚拟化
- 主机级虚拟化 虚拟出完整的主机
Type-I 一型虚拟化
hypervisor:在硬件之上没有运行宿主机,而是直接运行虚拟化软件创建虚拟机
其中,第一个虚拟机称为Dom0,为特权虚拟机;后续虚拟机为普通虚拟机称为DomU,为非特权虚拟机
名词解析:
百度百科:虚拟机直接运行在系统硬件上,创建硬件全仿真实例,被称为“裸机”型。
裸机型在虚拟化中Hypervisor直接管理调用硬件资源,不需要底层操作系统,也可以将Hypervisor看作一个很薄的操作系统。这种方案的性能处于主机虚拟化与操作系统虚拟化之间。
如:xen, vmware ESX/ESXI
Type-II 二型虚拟化
VMM:Virtual Machine Manager 虚拟机管理器,虚拟化软件的统称,如:VMware workstation
在物理硬件之上安装宿主机操作系统,宿主机操作系统有自己的内核空间和用户空间,在用户空间内安装VMM(即虚拟化软件),在VMM之上再安装虚拟机,每个虚拟机都有自己的内核空间和用户空间
名词解析:
百度百科:虚拟机运行在传统操作系统上,同样创建的是硬件全仿真实例,被称为“托管(宿主)”型。
托管型/主机型 Hypervisor运行在基础操作系统上,构建出一整套虚拟硬件平台(CPU/Memory/Storage/Adapter),使用者根据需要安装新的操作系统和应用软件,底层和上层的操作系统可以完全无关化,如Windows运行Linux操作系统。主机虚拟化中VM的应用程序调用硬件资源时需要经过:VM内核->Hypervisor->主机内核,因此相对来说,性能是三种虚拟化技术中最差的.如:vmware workstation, virtualbox, kvm
知识扩展:
Xen 安装时属于Type-II类型虚拟化,一旦安装以后生效,就变成了Type-I类型虚拟化
kvm 完全基于linux操作系统,是linux系统中的一个内核模块,一旦装入该内核模块,则linux内核称为了hypervisor
用户空间级虚拟化
- 用户空间虚拟化
Type-III 三型虚拟化
使用虚拟机的目的:一个操作系统能够运行多个应用程序(如一台设备运行多个httpd服务),达到应用程序程序运行环境隔离的目的
容器级虚拟化 把用户空间级虚拟化,即把宿主机操作系统的一个用户空间分割为多个用户空间,每个用户空间模拟出运行特定应用程序的空间,这就是容器
名词解析:
百度百科:虚拟机运行在传统操作系统上,创建一个独立的虚拟化实例(容器),指向底层托管操作系统,被称为“操作系统虚拟化”。
操作系统虚拟化是在操作系统中模拟出运行应用程序的容器,所有虚拟机共享内核空间,性能最好,耗费资源最少。但是缺点是底层和上层必须使用同一种操作系统,如底层操作系统运行的是Windows系统,则VPS/VE就必须运行Windows。
如:docker容器技术 使得容器运行起来更为便捷的管理工具
3、KVM
- KVM
Kernel-based VM 基于内核的虚拟机 - Quamranet公司研发,强依赖硬件辅助虚拟化hvm
- kvm属于linux系统中的一个内核模块,linux系统一旦载入kvm模块,会在/dev目录下自动创建一个虚拟设备文件/dev/kvm,在用户空间使用命令行工具,调用该字符设备提供的接口,借助于内核的kvm模块能够创建虚拟机,每个虚拟机表现为用户空间的一个进程。
qemu
- qemu:虚拟机操作系统模拟器,虚拟化软件
- qemu+kvm
kvm:cpu,ram 对cpu和内存虚拟化
qemu:io,cli 对IO设备虚拟化并提供一个管理接口client
qemu-kvm 基于kvm研发的qemu,仅支持kvm
qemu-kvm+kvm为基本架构
说明:
KVM内核模块只负责CPU和内存的虚拟化,加载了它以后,用户就可以进一步通过工具创建虚拟机(KVM提供接口),
但仅有KVM还是不够的,用户无法直接控制内核去做事情(KVM只提供接口,怎么创建虚拟机,分配vCPU等并不在它上面进行),
还必须有个运行在用户空间的工具才行,KVM的开发者选择了比较成熟的开源虚拟化软件QEMU来作为这个工具,并对其进行了修改,最后形成了QEMU-KVM。
在QEMU-KVM中,KVM运行在内核空间,QEMU运行在用户空间,实际模拟创建,管理各种虚拟硬件,QEMU将KVM整合了进来,
通过/ioctl 调用 /dev/kvm,从而将CPU指令的部分交给内核模块来做,KVM实现了CPU和内存的虚拟化,但kvm不能虚拟其他硬件设备,
因此qemu还有模拟IO设备(磁盘,网卡,显卡等)的作用,KVM加上QEMU后就是完整意义上的服务器虚拟化。
当然,由于qemu模拟io设备效率不高的原因,现在常常采用半虚拟化的virtio方式来虚拟IO设备
以上内容转载:https://blog.csdn.net/u013946404/article/details/78739830
libvirt安装和使用
-
判断CPU是否支持硬件虚拟化
grep -i -E "lm|svm|vmx" /proc/cpuinfo -
标签flags:
svm:ADM cpu
vmx:Internet cpu
lm 表示运行在64位
注意:如果只能搜索到lm,没有搜索到svm或vmx,则说明不支持虚拟化,如果在vmware workstation虚拟机中则需要在虚拟机编辑设置中,点击处理器选项,右边虚拟化引擎选项框中勾选"虚拟化Intel VT-x/EPT或AMD-V/RVI(V)"选项才能显示。
只有关闭虚拟机以后勾选此选项再次开启虚拟机才能生效
如图所示:
-
modprobe kvm 加载kvm模块
-
lsmod |grep kvm 查看是否加载成功
-
安装相关软件:
安装软件
yum install libvirt-daemon-kvm qemu-kvm virt-manager libvirt
启动libvirtd服务
systemctl start libvirtd.service
注意:如果启动失败,提示"Failed to start Virtualization daemon",可以尝试以下操作:
yum update librbd1
更新后,重启libvirtd服务。
libvirt
- libvirt C/S架构
- libvirtd 守护进程,可看做是对qume-kvm的二次封装
- VMM KVM管理工具
提供常用的虚拟机管理工具如virsh(类似vim编辑器),virt-install,virt-manager等 - libvirt网络通信
实现虚拟机与外部通信有两种方式:桥接模式和nat模式
安装libvirt以后,libvirtd守护进程会自动创建一个nat桥:virbr0,默认ip地址为:192.168.122.1
该nat桥就相当于一个交换机,只要虚拟机里的主机和物理机连接到该交换机,相互之间就可以相互通信,如果宿主机开启转发功能并进行源地址转发,则可以实现虚拟机内部主机与外部网络通信。 - 开启图形管理界面
说明:
打开核心转发功能:(临时生效,永久生效需要更改配置文件)
sysctl -w net.ipv4.ip_forward=1
或者echo 1 > /proc/sys/net/ipv4/ip_forward
关闭firewalld服务
systemctl stop firewalld
systemctl disable firewalld
重启libvirtd服务
systemctl restart libvirtd
该服务会自动生成防火墙规则,实现源地址转换SNAT,从而虚拟机内网主机能与外部网络通信
启动图形管理界面
virt-manager (建议使用xmanager连接)
虚拟化技术
- 虚拟化技术的分类:
主机级别虚拟化
模拟器:模拟成异构的架构
Qemu,PowerPC
完全虚拟化:cpu的环0用软件模拟,环3在硬件物理cpu上
依赖于hvm,BT技术
半虚拟化:环0没有使用软件模拟,而是让虚拟机内核明确知道自己运行在虚拟机之上
容器级虚拟化:
LXC,OpenVZ
库级别虚拟化
wine
程序级虚拟化
jvm,pvm
kvm管理工具
- kvm管理工具:
图形GUI:virt-manager,virt-viewer
命令行CLI:virsh,virt-install - libvirt相关命令
brctl
rpm -qf \which brctl
查看brctl命令由哪个软件包生成
bridge-utils
内核模块bridge,能够以软件方式在网络协议栈上模拟出硬件交换机设备
使用brctl命令对模拟出的交换机设备其进行管理
所谓的"桥",可以理解为交换机设备
brctl子命令
addbr 创建交换机
delbr 删除交换机
addif 添加带有网卡的网线,把网线插入设备
delif 删除带有网卡的网线,把网线拔出设备
show 查看交换机设备
stp 开启或关闭指定设备上的stp协议,默认启用该协议
示例:
brctl addbr mybr0 创建交换机
brctl stp mybr0 on mybr0交换机开启stp协议
- ip命令 能够创建虚拟以太网设备
ip link子命令:
add 添加二层设备
可添加设备类型:虚拟以太网设备veth
del 删除二层设备
set 设置设备属性
name 为网卡重命名
示例:
添加一条两头带有网卡的网线,一头网卡为veth0.0,另一头网卡为veth0.1
ip link add veth0.0 type veth peer name veth0.1
激活网卡
ip link set dev veth0.0 up
ip link set dev veth0.1 up
把veth0.1网卡关联到mybro交换机
brctl addif mybr0 veth0.1
激活交换机mybr0
ip link set mybr0 up
ip netns 子命令
add 创建一个名称空间(虚拟机)
exec 在创建的虚拟机内执行命令
示例:
创建一个名称空间(虚拟机)
ip netns add myns
把veth0.0网卡关联到myns虚拟机
ip link set veth0.0 netns myns
查看名称空间(虚拟机)myns中的网卡
ip netns exec myns ifconfig -a
把名称空间(虚拟机)内的网卡veth0.0重命名为eth0
ip netns exec myns ip link set veth0.0 name eth0
把名称空间(虚拟机)内的网卡veth0.0配置ip地址
ip netns exec myns ifconfig eth0 10.10.0.1/24
测试:
在名称空间(虚拟机)内ping桥(交换机)的ip地址
ip netns exec myns ping 10.10.0.254
4、virsh命令
virsh网络相关命令
- virsh
virsh help network 查看virsh与网络有关的命令
virsh子命令:网络相关命令
net-create 使用xml文件创建交换机并启动
net-define 使用xml文件创建交换机不启动
net-destroy 删除网络
net-list 列出现有交换机
net-dumpxml 显示现有网络定义的xml格式的配置文件
virsh net-dumpxml default 显示默认xml格式配置文件
示例:
[root@centos7 ~]# virsh net-dumpxml default
<network connections='2'>
<name>default</name> 网络名称,默认为defualt
<uuid>b3e9e37c-51b5-4fc1-a9e2-bbe8e06a3701</uuid> uuid
<forward mode='nat'> 转发类型为nat,如果需要SANT定义则需要对地址范围进行设置
<nat>
<port start='1024' end='65535'/> 网络地址池范围
</nat>
</forward>
<bridge name='virbr0' stp='on' delay='0'/> 把哪个桥(交换机)关联到该网络,当前为virbr0桥
<mac address='52:54:00:03:11:7b'/> 关联到该网络的桥(交换机)的mac地址
<ip address='192.168.122.1' netmask='255.255.255.0'> 当前桥(交换机)的ip地址和子网掩码
<dhcp>
<range start='192.168.122.2' end='192.168.122.254'/> dhcp地址池范围,如果不存在dhcp服务器,可移除该项
</dhcp>
</ip>
</network>
- 文件默认位置:/etc/libvirt/qemu/networks/default.xml
- 复制该文件并进行修改即可创建一个桥(交换机)设备
示例:根据默认xml文件创建网桥
cd /etc/libvirt/qemu/networks/
cp default.xml mynet0.xml
vim /etc/libvirt/qemu/networks/
<network>
<name>mynet0</name> 网络名称为mynet0
<uuid>b3e9e37c-51b5-4fc1-a9e2-bbe8e06a3710</uuid> uuid必须进行更改,可以删除该项会自动生成,也可以手动更改,只要与原来不一致就可
<bridge name='mybr1' stp='on' delay='0'/> 桥(交换机)名称,把该桥绑定到当前网络
<mac address='52:54:00:03:11:ab'/> mac地址也必须进行更改,可以手动进行更改
<ip address='10.0.0.100' netmask='255.255.255.0'> 设置桥(交换机)的ip地址
<dhcp>
<range start='10.0.0.21' end='10.0.0.100'/> 设置dhcp地址池范围
</dhcp>
</ip>
</network>
使用virsh命令根据mynet0.xml文件创建桥(交换机)
virsh net-create mynet0.xml
因为刚才网卡veth0.1被关联到mybr0桥,从因此把网卡veth0.1从mybr0桥(交换机)拆下来安装到mybr1桥上使用
brctl delif mybr0 veth0.1
brctl addif mybr1 veth0.1
更改名称空间myns的ip地址为10.0.0.1
测试:
名称空间myns是否能与桥mynet0 ping通
ping 10.0.0.100
- 创建桥接接口
使用物理桥
virsh
nmtui
/etc/sysconfig/network-scripts/目录下的脚本 - 创建物理桥,把宿主机物理网卡当做物理桥,创建虚拟网卡当做宿主机的网卡使用
注意:更改的网卡必须是能够连接外网的网卡,即该网卡是桥接模式或nat模式,才能连接外网
示例:
cd /etc/sysconfig/network-scripts
cp ifcfg-ens33 ifcfg-br0
编辑ifcfg-ens33文件,删除ip地址、子网掩码、网关、DNS,并在最后一行加上BRIDGE=br0
vim ifcfg-ens33
BRIDGE=br0
编辑ifcfg-br0文件,更改设备类型为桥,更改设备名称,删除uuid,ip地址不变
vim ifcfg-br0
TYPE=Bridge 注意:首字母大写,后面字符小写
NAME=br0
DEVICE=br0
重启网络服务
systemctl restart network
查看网卡会发现多出br0网卡且ip地址为原ip地址,原来的网卡ens33没有ip地址
此时在kvm中创建虚拟机时,选择网卡为桥接网卡即可连接外网
virsh虚拟机管理相关命令
- virsh子命令:管理虚拟机相关命令
virsh help domain
shutdown 关闭一个域(即虚拟机)
start 启动一个处于关闭状态的虚拟机
distory 销毁域,强制断电
create 使用xml文件创建虚拟机并启动
define 使用xml文件创建虚拟机不启动
desc 查看虚拟机状态
autostart 物理机启动后,自动启动虚拟机
console 连接到虚拟机终端
dumpxml 查看虚拟机定义
save 把虚拟机状态保存到文件中,类似于vmware的挂起状态
restore 从保存虚拟机状态的文件中恢复该虚拟机,id号会变
reboot 重启虚拟机
reset 重置虚拟机
suspend 挂起,不同于vmware的挂起,意为暂停
resume 把虚拟机从暂停状态恢复
virsh help monitor
dominfo 查看虚拟机相关信息
dommemstate 域的内存统计
domstate 当前虚拟机状态
domstats 当前虚拟机内部统计数据
domiflist 查看虚拟机网卡数
domblklist 查看虚拟机硬盘,需要指定虚拟机
domblkstat 查看虚拟机硬盘统计数据,需要指定虚拟机
domifstat 查看虚拟机网卡数据量,需要指定虚拟机和虚拟机的哪个网卡
注意:应用程序关闭再次开启进程号会发成改变,虚拟机也可以看做是一个进程,因此关闭再启动虚拟机,虚拟机id号也会改变
支持设备热插拔
- 支持热插拔操作:网卡,硬盘
- 实现热插拔网络设备:
virsh help domain
attach-device 热插入设备
attach-disk 热插入硬盘设备
attach-interface 热插入网络设备
detach-device 热拔出设备
detach-disk 热拔出硬盘设备
detach-interface 热拔出网络设备
attach-disk/detach-disk/domblklist:磁盘设备的热插拔;
attach-interface/detach-interface/domiflist:网络接口设备的热插拔;
type:bridge
source:BRIDGE_NAME
注意 :无须事先创建网络接口设备;
示例:热插拔网络设备(网卡)
热插入一个网卡
virsh attach-interface c1 bridge mybr1
热拔出一个网卡
virsh detach-interface c1 bridge --mac 52:54:00:88:33:e3
注意:在拔出网卡时,如果一个类型下(如:bridge类型)有多个网卡,则需要指定网卡的mac地址才能拔出
virsh domiflist c1 查看c1虚拟机的网卡信息
virsh console c1 使用终端控制台连接虚拟机,需要输入用户名密码
使用ctrl+] 退出控制台
退出后再次登录无需再次输入密码
- 热插拔磁盘设备文件
qemu-img命令 专用于管理虚拟机磁盘设备文件
usage: qemu-img command [command options]
create 创建磁盘镜像文件
info 查看磁盘镜像文件信息
snapshot 为磁盘镜像文件创建快照或恢复快照
rebase 改变快照的基础镜像文件
resize 动态改变磁盘镜像文件大小
convert 转换磁盘镜像文件格式
Supported formats: vvfat vpc vmdk vhdx vdi ssh sheepdog rbd raw host_cdrom host_floppy host_device file qed qcow2 qcow parallels nbd iscsi gluster dmg tftp ftps ftp https http cloop bochs blkverify blkdebug
cow 写时复制 - 硬盘划分大小时有以下几种方式:
稀疏格式:指定磁盘大小,不立即分配实际大小,磁盘用多少给多少
稠密格式:指定磁盘大小,立即分配磁盘实际大小
查看创建磁盘镜像文件需要指定选项:
qemu-img create -f qcow2 -o ? /vm/c1/test.img
说明:
Supported options:
size Virtual disk size 指定虚拟硬盘大小
compat Compatibility level (0.10 or 1.1) 指定兼容级别
backing_file File name of a base image
backing_fmt Image format of the base image 基于磁盘文件当前状态创建快照
encryption Encrypt the image 支持对磁盘文件加密
cluster_size qcow2 cluster size
preallocation Preallocation mode (allowed values: off, metadata, falloc, full) 指定为磁盘预分配多少空间
full 完全分配 falloc 用多少分多少
metadata 稀疏磁盘格式 off 不分配
lazy_refcounts Postpone refcount updates
示例:
创建网络磁盘
qemu-img create -f qcow2 -o size=40G,preallocation=metadata,compat='1.1' /vm/c1/test.img
为虚拟机添加磁盘镜像文件
virsh attach-disk c1 /vm/c1/test.img vdb
从终端控制台登录虚拟机c1查看硬盘
virsh console c1
fdisk -l 发现添加的vdb磁盘被自动识别为vda
移除网络磁盘
virsh detach-disk c1 vdb
注意:移除之前要确保没人使用,先卸载网络磁盘,然后再删除网络磁盘
注意:删除时指定磁盘名为添加时指定的名字而不是系统自动识别的磁盘名字
virsh命令定义虚拟机
- 使用virsh命令进行虚拟机定义
virsh dumpxml c1 查看c1虚拟机的xml定义
示例:
创建虚拟机时会在/etc/libvirt/qemu目录下自动创建本虚拟机的xml文件,因此可以根据此xml文件稍做更改,即可创建新的虚拟机
cd /etc/libvirt/qemu
cp c1.xml c3.xml
vim c3.xml 只需更改以下几项即可
<name>c3</name> 更改名称
删除uuid项
<source file='/vm/c3/c3.img'/> 磁盘文件路径
<target dev='vda' bus='virtio'/> 磁盘格式,总线类型为半虚拟化类型
<mac address='52:54:00:cd:67:b7'/> 网络接口mac地址,推荐使用随机数生成器生成连续的数字
注意:可使用脚本批量创建多个虚拟机,只需随机生成mac地址最后两位,其他相关信息直接指定即可
创建c3目录
mkdir /vm/c3 -p
复制镜像到c3目录下
cp /root/cirros-no_cloud-0.3.0-i386-disk.img /vm/c3/c3.img
根据xml自定义文件创建虚拟机
virsh create /etc/libvirt/qemu/c3.xml
- virsh 子命令
virsh list --all 列出所有虚拟机,包括启动和未启动状态的虚拟机
virsh help domain
undefine 取消定义一个域,即删除虚拟机
注意:undefine命令只能删除使用命令(如:define,create命令)创建的虚拟机,通过复制其它虚拟机xml文件修改创建的虚拟机无法被删除,系统认定这种方式创建的虚拟机为短暂临时的虚拟机,无法通过undefine命令删除
制作磁盘镜像模板
- 如果使用其他主机的镜像文件当做模板创建虚拟机,则创建的虚拟机中会保留有其他主机的一些信息(如主机密钥),这是十分不安全的
- 需要安装软件包libguestfs libguestfs-tools
virt-sysprep 系统磁盘镜像模板处理命令,可以去除模板中的敏感信息
-d 移除模板中用户和主机的私有信息或指定的私有信息
--enable operations 默认移除主机密钥,udev定义的网络等
--list operations 列出默认可被移除的选项
--operation operations(或--operations operations) 指定移除选项
--run-dry 干跑,不实际运行,可用于测试
--install PKG 在虚拟机外部安装软件包
镜像文件路径:/var/lib/libvirt/images/centos7.0-2.qcow2
示例:
virt-sysprep -d centos7.0-2 删除磁盘镜像文件模板中默认的私有信息,-d只需指定磁盘镜像文件名称
注意:磁盘镜像文件要去掉qcow2的后缀)系统会自动查看该文件,无需指定文件路径
- 制作完模板,可使用脚本更改系统定义的xml文件中必要的信息(如名称,uuid,网络接口mac地址等),然后使用virsh create或define 命令可批量创建虚拟机
5、虚拟机管理软件
常见虚拟机管理工具
- kvm管理工具统计网站:
https://www.linux-kvm.org/page/Management_Tools - kvm管理工具:
kimchi:基于H5研发web GUI; virt-king;
OpenStack: IaaS
oVirt:红帽官方,在yum仓库中,需要指定ovirt仓库路径,使用yum命令安装即可使用
Proxmox VE 中小企业虚拟化管理工具,是一个操作系统镜像,基于debian制作,使用web界面使用
kimchi
- kimchi 项目托管在github上,需要去该网站进行下载
- github下载地址:
https://github.com/kimchi-project/kimchi/releases - kimchi是作为wok的插件运行,因此使用kimchi需要安装两个软件包(注意:两个软件包版本要一致)
软件包链接地址
kimchi软件包 https://github.com/kimchi-project/kimchi/releases/download/2.5.0/kimchi-2.5.0-0.el7.centos.noarch.rpm
wok软件包 https://github.com/kimchi-project/kimchi/releases/download/2.5.0/wok-2.5.0-0.el7.centos.noarch.rpm - 安装注意事项:
使用yum安装软件包,注意:软件包安装要启用epel源
systemctl daemon-reload 启动守护进程
systemctl start wokd 启动wokd服务,会监听本地所有网卡8001端口
注意要关闭selinux,否则会出现错误
使用浏览器登录地址:https://172.20.45.100:8001
注意:172.20.45.100为本机地址,登录时使用https,用户名密码为系统用户名密码
为kimchi提供物理桥相关的网络:
示例:
cd /etc/libvirt/qemu/networks/
vim br0.xml
<network>
<name>br0</name>
<bridge name='br0'/>
<forward mode='bridge'/>
</network>
virsh net-create ./br0.xml 创建物理桥
注意:小型测试环境中推荐使用kimchi,生产环境中推荐使用 proxmox VE
6、qemu-kvm
使用qemu-kvm管理vms
- Qemu:
处理器模拟器
仿真各种IO设备
将仿真设备连接至主机的物理设备
提供用户命令行接口
该命令默认不再PATN路径下,无法直接使用,可以通过软链接方式,把该命令链接到PATH路径下即可使用
ln -sv /usr/libexec/qemu-kvm /usr/bin - qemu-kvm命令语法:
qemu-kvm [options] [disk_image]
选项有很多类别:
标准选项、块设备相关选项、显示选项、网络选项、...
选项类别详解:
标准选项:
-machine [type=]name:-machine help来获取列表,用于指定模拟的主机类型;
-cpu cpu:-cpu help来获取列表;用于指定要模拟的CPU型号;
-smp n[,maxcpus=cpus][,cores=cores][,threads=threads][,sockets=sockets]:指明虚拟机上vcpu的数量及拓扑;
-boot [order=drives][,once=drives][,menu=on|off] [,splash=sp_name][,splash-time=sp_time][,reboot-timeout=rb_time][,strict=on|off]
order:各设备的引导次序:c表示第一块硬盘,d表示第一个光驱设备;-boot order=dc,once=d
-m megs:虚拟机的内存大小;
-name NAME:当前虚拟机的名称,要惟一;
块设备相关的选项:
-hda/-hdb file:指明IDE总线类型的磁盘映射文件路径;第0和第1个;
-hdc/-hdd file:第2和第3个;
-cdrom file:指定要使用光盘映像文件;
-drive [file=file][,if=type][,media=d][,index=i] [,cache=writethrough|writeback|none|directsync|unsafe][,format=f]:
file=/PATH/TO/SOME_IMAGE_FILE:映像文件路径;
if=TYPE:块设备总线类型,ide, scsi, sd, floppy, virtio,...
media=TYPE:介质类型,cdrom和disk;
index=i:设定同一类型设备多个设备的编号;
cache=writethrough|writeback|none|directsync|unsafe:缓存方式;
format=f:磁盘映像文件的格式;
CentOS磁盘镜像文件下载:
https://cloud.centos.org/centos/7/images/
显示选项:
-display type:显示的类型,sdl, curses, none和vnc;
-nographic:不使用图形接口;
-vga [std|cirrus|vmware|qxl|xenfb|none]:模拟出的显卡的型号;
-vnc display[,option[,option[,...]]]]:启动一个vnc server来显示虚拟机接口; 让qemu进程监听一个vnc接口;
display:
(1) HOST:N
在HOST主机的第N个桌面号输出vnc;
5900+N
(2) unix:/PATH/TO/SOCK_FILE
(3) none
options:
password:连接此服务所需要的密码;
-monitor stdio:在标准输出上显示monitor界面;
Ctrl-a, c:在console和monitor之间切换;
Ctrl-a, h
网络选项:
-net nic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v]
为虚拟机创建一个网络接口,并将其添加至指定的VLAN;
model=type:指明模拟出的网卡的型号,ne2k_pci,i82551,i82557b,i82559er,rtl8139,e1000,pcnet,virtio;
-net nic,model=?
macaddr=mac:指明mac地址;52:54:00:
-net tap[,vlan=n][,name=str][,fd=h][,fds=x:y:...:z][,ifname=name][,script=file][,downscript=dfile]:
通过物理的TAP网络接口连接至vlan n;
script=file:启动虚拟机时要执行的脚本,默认为/etc/qemu-ifup
downscript=dfile:关闭虚拟机时要执行的脚本,/etc/qemu-ifdown
ifname=NAME:自定义接口名称;
/etc/qemu-ifup
#!/bin/bash
#
bridge=br0
if [ -n "$1" ];then
ip link set $1 up
sleep 1
brctl addif $bridge $1
[ $? -eq 0 ] && exit 0 || exit 1
else
echo "Error: no interface specified."
exit 2
fi
其它选项:
-daemonize:以守护进程运行;
示例1:
~]# qemu-kvm -name c2 -smp 2,maxcpus=4,sockets=2,cores=2 -m 128 -drive file=/images/kvm/cos-i386.qcow2,if=virtio -vnc :1 -daemonize -net nic,model=e1000,macaddr=52:54:00:00:00:11 -net tap,script=/etc/qemu-ifup
示例2:
~]# qemu-kvm -name winxp -smp 1,maxcpus=2,sockets=1,cores=2 -m 1024 -drive file=/data/vms/winxp.qcow2,media=disk,cache=writeback,format=qcow2 file=/tmp/winxp.iso,media=cdrom -boot order=dc,once=d -vnc :1 -net nic,model=rtl8139,macaddr=52:54:00:00:aa:11 -net tap,ifname=tap1,script=/etc/qemu-ifup -daemonize
- 半虚拟化:virtio
建议:Network IO, Disk IO使用virtio,性能会有显著提升; - dnsmasq:
listen-address=192.168.1.132,127.0.0.1
dhcp-range=192.168.1.50,192.168.1.150,48h
dhcp-option=3,192.168.0.1
综合实验:基于kvm虚拟化实现分布式部署lamp
实验环境需求:
拓扑图:
![](http://www.yuandangsheng.top/wp-content/uploads/2023/04/综合实验拓扑图.png)
三台虚拟机,两个网络,两台虚拟桥,一个物理桥,一台跳板机(堡垒机)
宿主机充当物理桥,两个网卡
物理桥网卡1:172.20.124.
物理桥网卡2如果为桥接模式,则可以直接连接网卡;如果为仅主机模式,则需要进行SANT源地址转换
apache服务器
分别连接物理桥br0和mynet1网络
物理桥br0网卡172.20.124.
mynet1网卡192.168.10
fpm服务器
分别连接mynet1和mynet2网络
mynet1网卡192.168.10.
mynet2网卡192.168.11.
数据库服务器
连接mynet2网络
mynet2网卡192.168.11.
mynet1网络地址范围:192.168.10.20--192.168.10.100
mynet2网络地址范围:192.168.11.20--192.168.11.100
kvm虚拟环境搭建过程:
创建网络:
使用系统default默认网络xml文件创建mynet1网络和mynet2网络
cp default.xml mynet1.xm{l,2}
vim mynet1.xml
<network>
<name>mynet1</name> 网络名称
<uuid>066afb36-d94c-4c7c-b839-83d2668fdcab</uuid> uuid删除或者手动更改
<forward mode='nat'/>
<bridge name='mybr1' stp='on' delay='0'/> 关联到网络的桥名称
<mac address='52:54:00:90:f7:df'/>
<ip address='192.168.10.100' netmask='255.255.255.0'> 定义桥的地址
<dhcp>
<range start='192.168.10.20' end='192.168.10.100'/> 定义网络地址范围
</dhcp>
</ip>
</network>
mynet2.xml文件也用类似方法创建
创建虚拟机:
从网络下载qcow2磁盘镜像文件,直接进行系统安装
下载地址:http://cloud.centos.org/centos/7/images/
注意:磁盘镜像解压后为raw格式的文件
创建存放三个系统磁盘镜像文件的目录,并把磁盘镜像分别复制到对应的目录中
mkdir -pv /vm/c{1,2,3}
cp centos7.raw /vm/c{1,2,3}/
需要安装工具包对磁盘镜像文件系统的密码进行初始化设置为123(可自定义)
yum install libguestfs-tools
cd /vm/c1/ 进入对应目录下执行以下命令
virt-customize -a CentOS-7-x86_64-GenericCloud-1703.qcow2 –root-password password:123
使用virt-manager命令开启图形界面安装虚拟机操作系统
系统安装后先配置好yum,安装需要软件包,注意调整好系统时间,可以使用ntp服务器(172.20.0.1)进行同步
安装完系统以后,开始进行amp部署
部署完成,测试wordpress访问正常,开始设置防火墙规则
防火墙配置:
各服务器ip地址:
数据库服务器:
192.168.11.66
Fpm服务器:
192.168.10.48
192.168.11.83
http服务器:
172.20.124.67
192.168.10.21
跳板机:
172.20.124.131
192.168.10.22
192.168.11.43
物理桥br0:
172.20.124.132
连接外网:
172.20.121.77
注意:
(1)使用连接追踪功能设置防火墙要弄清楚谁访问谁,即数据流的方向
如:外网访问http服务,在http服务器设置规则,目标为本机80端口
如:http服务器向fpm服务器请求动态资源,在http服务器上,目标端口为fpm服务器的9000端口,在fpm服务器上,目标端口为本机9000端口
如:Fpm服务器向数据库服务器请求数据,在fpm服务器上,目标端口为数据库服务器的3306端口,在数据库服务器上,目标端口为本机的3306端口
(2)要牢记客户端访问服务器端时,目标端口是确定的,源端口是随机生成的
http服务器防火墙配置:
br0物理桥ip:172.20.124.132
Fpm服务器ip:192.168.10.48
跳板机ip:192.168.10.22
1 设置外网能访问本机的80端口
iptables -A INPUT -d 172.20.124.67 -p tcp -m multiport --dports 80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
2 向fpm服务器请求动态资源
向fpm服务器9000端口转发数据(出方向)
iptables -A OUTPUT -s 192.168.10.21 -d 192.168.10.48 -p tcp --dport 9000 -m state --state NEW,ESTABLISHED -j ACCEPT 注意:该规则范围小,应放在OUTPUT第一条
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
3 设置跳板机: 22端口
允许跳板机访问,拒绝其他主机访问
iptables -I INPUT 2 -s 192.168.10.22 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
放行ESTABLISHED状态主机
iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
通过设置通用规则设置白名单(即拒绝所有主机访问)
iptables -A INPUT -j REJECT
iptables -A OUTPUT -j REJECT
Fpm服务器防火墙配置:
跳板机ip:192.168.10.22
http服务器ip:192.168.10.21
数据库服务器ip:192.168.11.66
1 允许http服务器访问本机动态资源
允许http服务器向本机9000端口发送数据(进方向)
iptables -A INPUT -s 192.168.10.21 -d 192.168.10.48 -p tcp --dport 9000 -m state --state NEW,ESTABLISHED -j ACCEPT
2 设置本机访问数据库服务器
向数据库服务器3306端口发送请求(进方向)
iptables -A OUTPUT -s 192.168.11.83 -d 192.168.11.66 -p tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
3 设置跳板机访问
允许跳板机访问通过22端口远程连接本机
iptables -I INPUT 2 -s 192.168.10.22 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
放行ESTABLISHED状态主机
iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
使用通用规则设置白名单(拒绝所有主机访问)
iptables -A INPUT -j REJECT
iptables -A OUTPUT -j REJECT
数据库服务器防火墙配置:
跳板机ip:192.168.11.43
Fpm服务器ip:192.168.11.83
1 fpm服务器设置
允许fpm服务器访问本机3306端口(进方向)
iptables -A INPUT -s 192.168.11.83 -d 192.168.11.66 -p tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
2 跳板机设置
只允许跳板机访问本机22端口
iptables -A INPUT -s 192.168.11.43 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
放行ESTABLISHED状态主机
iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
使用通用规则设置白名单(拒绝所有主机)
iptables -A INPUT -j REJECT
iptables -A OUTPUT -j REJECT
跳板机防火墙配置:
出方向:
允许向数据库服务器发送连接22端口请求
iptables -A OUTPUT -s 192.168.11.43 -d 192.168.11.66 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
允许向http服务器发送连接22端口请求
iptables -A OUTPUT -s 192.168.10.22 -d 192.168.10.21 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
允许向fpm服务器发送连接22端口请求
iptables -A OUTPUT -s 192.168.10.22 -d 192.168.10.48 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
放行ESTABLISHED状态主机
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
只允许通过br0访问本机的22端口远程
iptables -I INPUT 2 -s 172.20.124.132 -d 172.20.124.131 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
放行ESTABLISHED状态主机
iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
使用通用规则设置白名单(拒绝所有主机)
iptables -A INPUT -j REJECT
iptables -A OUTPUT -j REJECT
文章评论