一、KVM –介绍 :
1.虚拟化
虚拟化是云计算的基础。简单的说,虚拟化使得在一台物理的服务器上可以跑多台虚拟机,虚拟机共享物理机的 CPU、内存、IO 硬件资源,但逻辑上虚拟机之间是相互隔离的。
物理机我们一般称为宿主机(Host),宿主机上面的虚拟机称为客户机(Guest)
KVM 全称是 基于内核的虚拟机(Kernel-based Virtual Machine),它是一个 Linux 的一个内核模块,该内核模块使得 Linux 变成了一个 Hypervisor,依赖于硬件虚拟化本身,只有硬件支持虚拟化,才能运行KVM
2.KVM 架构
KVM 是基于虚拟化扩展(Intel VT 或者 AMD-V)的 X86 硬件的开源的 Linux 原生的全虚拟化解决方案。KVM 中,虚拟机被实现为常规的 Linux 进程,由标准 Linux 调度程序进行调度;虚机的每个虚拟 CPU 被实现为一个常规的 Linux 进程。这使得 KMV 能够使用 Linux 内核的已有功能。
但是,KVM 本身不执行任何硬件模拟,需要客户空间程序通过 /dev/kvm 接口设置一个客户机虚拟服务器的地址空间,向它提供模拟的 I/O,并将它的视频显示映射回宿主的显示屏。目前这个应用程序是 QEMU。
3.虚拟化技术类型:
主机虚拟化:xen, kvm, virtualbox, …
容器(用户空间隔离): lxc(LinuX Container), openvz, …
系统库虚拟化:wine, …
应用程序级虚拟化:jvm, pvm,…
4.模块虚拟
mmu (内存管理单元)
(1)主机虚拟化
CPU:
模拟:emulation, 虚拟机的arch与物理平台的arch可以不相同;qemu;
虚拟:virtualization
完全虚拟化(full-virt)
BT: 二进制转换 (软件)
HVM:硬件辅助的虚拟化(硬件)
半(准)虚拟化 (para-virt)
GuestOS得明确知道自己运行于虚拟化技术
(2)硬盘的虚拟
可以用文件构建虚拟的假硬盘空间来供使用:例如有20G的硬盘可分给10人没人10G,理论上超出了自己实际硬盘的大小,但在实际是使用当中,每个人可能只使用1G就够了。
(3)网卡的虚拟
用软件的方式给每个虚拟机虚拟一块网卡和MAC地址,当通信时使用同一块物理网卡,网卡通讯有排队方式,在同一台物理网卡上,排队执行任务。(将物理网卡设为混杂模式;无论是不是发向本机物理网卡的内容都给与接收);此时将物理网卡也虚拟化一个MAC地址,把物理网卡当作交换机来使用。
(4)CPU的虚拟化
宿主机内核运行在CPU的0环上,然后每个虚拟机,用软件的方式都虚拟出一个CPU的0环。软件实现的速度会很慢。
最后发展为,在环0里添加一个环-1;宿主机的内核运行在环-1上;虚拟机的内核运行在环0上。虚拟机的其他应用在CPU的环3上;现在的pc机上都支持这一技术。
(5)I/O设备的虚拟化
虚拟机如何使用硬盘的空间:虚拟机在物理硬盘上划分一个文件来使用,此文件也是靠宿主机通过文件系统将磁盘分区后,并创建文件系统后,分给虚拟机一个文件的大小的空间。在宿主机上表现的就是一个文件,而在虚拟机上表现的就是一块硬盘。所以还需要用软件的方式模拟一个适配器,将此文件,模拟成硬盘。这种方式为全虚拟化,据统计全虚拟化的速率只有真实物理硬盘的40%,而半虚拟化可以达到80%,所以我们要实现半虚拟化,实现方法:宿主机有多块硬盘时,直接将一整块硬盘给虚拟机使用,而不是要通过宿主机以文件的方式来使用。(此方法叫I/O透传)
二、虚拟化的技术类型:
1.主机虚拟化:
虚拟化的结构:物理机器—–>操作系统——->虚拟化管理平台——->虚拟机(这种方法,虚拟机上的一个应用要运行,首先调用自己的内核,然后再经过虚拟化管理平台,最后传到物理机的内核,这种方法虚拟机上的应用要通过三层调用才能够处理,效率太低)此种为type-2虚拟化。
两级管控平台:将虚拟化平台和操作系统合二为一,直接运行再物理硬件上,然后再虚拟化平台上在创建虚拟机,这样就变成了两级调用。这种虚拟化管理平台被统称为:Hypervisor 。(兼具操作系统和虚拟换管理的作用)此种为type-1虚拟化种类。在这种技术下常用的虚拟化软件有:xen, kvm, virtualbox:
xen的工作方式:首先在操作系统上安装xen;(rpm包);装好之后重启宿主机的操作系统,起来之后xen就成为了操作系统,直接运行在物理硬件之上了,将原来宿主机的操作系统,挤下去成为第一个虚拟机(dom0)。将刚挤下去的成为第一个虚拟机(dom0)的当为它的管理接口(管理接口:创建,删除,新建虚拟机)后面创建的虚拟机为dom1;dom2……
KVM的工作方式:KVM是内核模块,一旦装上KVM的内核模块,原来的内核,就变为虚拟化管理平台:Hypervisor ,不用重启就直接可以在虚拟化管理平台上创建虚拟机了。
2.容器级级虚拟化 :(相较于主机级虚拟化隔离的不彻底)
:lxc, libcontainer, runC, openvz
Linux内核运行在物理设备上;在内核上运行多个操作系统如:centos,wubantu;susan;等,因为他们都是基于linux内核来开发的不同界面的操作系统而已,底层运行的内核是相同的。在每个操作系统上在运行每个应用。在内核上运行一个软件来创建和管理容器,是一个很小的软件,基本不消耗性能。
由于多个操作系统使用的是同一个内核,当在操作系统上执行关机命令,就会将内核关闭,所以需要将每个操作系统隔离开来,关掉的只是自身容器 本身而已。各个操作系统之间的操作互补干扰。(共享内核)
模拟器:qemu
Linux目前流行的开源虚拟化技术解决方案:
主机虚拟化:xen, kvm, virtualbox
容器级:lxc, libcontainer, runC, openvz
模拟器:qemu
modinfo kvm:查看KVM的详细模块信息(在centos和红帽系统上已将KVM编译到内核模块里,只是没有装载而已)
三、kvm技术应用
1 .判断CPU是否支持硬件虚拟化
grep -i -E ‘(vmx|svm|lm)’ /proc/cpuinfo
vmx:Intel VT-x (inter的CPU出现vmx;lm “64位的操作平台”字样代表支持硬件虚拟化)
svm:AMD AMD-v (AMD的CPU出现svm字样代表支持硬件虚拟化)
由于在虚拟主机上在创建虚拟主机是不支持的,需要在vmware上修改虚拟机的cpu之后:就会出现你所要搜索的VMX了。
2.常用的虚拟机管理命令(virt-manager为例)
yum install libvirt-daemon-kvm qemu-kvm virt-manager libvirt (安装包)
(virt-manager :图形管理工具”如同vmware一样实现对虚拟机的创建删除等管理” libvirt:虚拟化工具;远程可使用virsh命令行工具来管理kvm)
modprobe kvm (加载kvm模块)
systemctl start libvirtd.service (启动服务: 并查看进程ps aux /usr/sbin/libvirtd是否运行起来了)
/etc/libvirt/ (各配置文件存放的目录)
virt-manager (在图形化界面运行此命令打开管理虚拟机的图形界面)
virsh iface-bridge ens33 br0 (创建一个桥接网卡地址)
桥接到ens33上,新建的虚拟机就会连接到ens33上网卡及地址,如果要想此虚拟机连接到外网上,则开始就需要桥接到可以连接到外网的ens37网卡上。在虚拟机的硬件设备中,选择刚创建的网桥作为自己的网卡设备:可以在安装好虚拟机后再硬件设备里去更改,也可以在新建虚拟机的时候有选项时添加网卡的选项:如下图设置的内容:
上图的网卡地址是自己创建的网桥和宿主机的网卡链接到一起的。
如果需要内网相通,只需要在各个虚拟机都添加一个内网的网卡(内网网卡通过创建网桥的方式将其创建出来),然后配置各自的内网的IP地址。
小结:如果宿主机没有图形化界面,则无法打开图形化的管理窗口,可以在其他有图形环界面的机器上,配置号kvm然后打开虚拟主机的管理图形化窗口在链接到创建虚拟机的宿主机上去,这样就可以以图形化的方式来管理宿主机上的虚拟机了。如下图:
利用虚拟机管理器去新建一个虚拟机:
和使用VMwaer一样来新建一个虚拟机。(可以一步步的安装也可以使用自动换安装光盘导入后自动化来安装)
在centos7上
virsh list (列出在本机上正在运行的虚拟机)
的
将虚拟机安装生成的文件和镜像放到共享文件目录下,当宿主机宕机后还可以在启动虚拟机。但这种做法需要通过网络来传输数据,会造成延时。最后采用在一处建立一个启动虚拟机的镜像模板文件,只需要将虚拟机启动起来,然后用户的数据存放在本地的共享存储上,当宿主机宕机之后,在新的宿主机上只需将镜像模板文件下载下来然后开启linux.,在将共享文件里的用户数据挂载到系统上就可以了。
/var/lib/libvirt/images/ (存放虚拟机文件的目录)
/etc/libvirt/qemu/会生一个centos6.9.xml文件,此文件是配置虚拟机的详细参数
virsh命令:
虚拟机的生成需要依赖于预定义的xml格式的配置文件;其生成工具有两个:virt-manager, virt-install;
virsh和virt-manager都可以实现对虚拟机的管理,一个是命令行的工具,一个是图形化的工具。
/etc/libvirt/qemu/会生一个centos6.9.xml文件,此文件是配置虚拟机的详细参数。如果将此文件更改一下,就可以使用创建新的虚拟机了。
创建虚拟机:
create:从xml格式的配置文件创建并启动虚拟机(virsh create –console /etc/libvirt/qemu/centos6.9.xm)
define:从xml格式的配置文件创建虚拟机不启动;
virsh list (列出所有的虚拟机)
停止:
virsh destroy +虚拟机的名称:强行关机;
virsh shutdown +虚拟机的名称:关机;
启动:
virsh start +虚拟机的名称:启动
virsh reboot +虚拟机的名称:重启;
virsh undefine +虚拟机的名称:删除虚拟机;
suspend/resume:暂停于内存中,或继续运行暂停状态的虚拟机;
真正实现的效果:pause/unpause
virsh save +虚拟机名/virsh restore +文件名 :保存虚拟机的当前状态至文件中,或从指定文件恢复虚拟机;
console:连接至指定domain的控制台;
域的设备资源管理:
cpu-stats
vcpuinfo
vcpucount
setvcpus
vcpupin
setmaxmem
virsh setmem +虚拟主机名 1500 (更改内存大小;改完后会触发重启)
四、虚拟机维护
1.虚拟主机磁盘设备的创建和更改替换:(以下操作是在KVM主机上的)
attach-disk/detach-disk/domblklist:磁盘设备的热插拔;
cd /var/lib/libvirt/images/ (进入存放虚拟 机文件的目录下)
virsh domblklist centos6.9 (查看虚拟主机名为cents6.9下的磁盘)
Target Source
————————————————
vda /var/lib/libvirt/images/centos6.9.img (第一块磁盘默认为vda;类似如sda;sdb等)
hda –
qemu-img create -f qcow2 -o size=20G,preallocation=metadata ./secon.img (在当前目录下创建一个20G的磁盘。secon.img 新创建的磁盘名称;qcow2;位创建磁盘的格式)
qemu-img info secon.img (查看刚刚创建的磁盘文件的信息)
virsh attach-disk centos6.9 /var/lib/libvirt/images/secon.img vdb (将刚创建的磁盘加到虚拟机上)
virsh domblklist centos6.9 (在此查看虚拟机的磁盘信息:发现已经有了第二块磁盘上了)
virsh console centos6.9 (连接到虚拟机上查看,分区,使用)
virsh detach-disk centos6.9 vdb (拆除vdb磁盘。拆除之前要确保磁盘不在挂载使用)
这样就实现了磁盘的热插拔。
2.实现网络接口的热插拔:(以下操作是在KVM主机上的)
attach-interface/detach-interface/domiflist:网络接口设备的热插拔;
type:bridge
source:BRIDGE_NAME
virsh domiflist centos6.9 (查看虚拟主机的网卡信息)
virsh attach-interface centos6.9 bridge virbr0 (将虚拟主机的网卡桥接到virbr0上去:virbr0:是物理桥;查看虚拟主机的网卡信息会发现多了而一个网卡地址)
virsh detach-interface centos6.9 bridge –mac 52:54:00:5e:0d:05 (拆除网卡:需要写要拆除网卡的mac地址)
再次去创建的虚拟主机上查看网卡信息就会发现已经拆掉了。
五、虚拟化技术总结
1.模拟器和虚拟化的区别:
模拟器:底层的硬件架构和上层的虚拟出来的硬件环境可以各不相同。
虚拟换:底层的硬件架构必须要和上层虚拟出的硬件架构相同,因为有些虚拟机的指令是直接运行在物理CPU的环3上的。如果不同,可能无法运行命令。
虚拟化技术的分类:
(1) 模拟:Emulation
Qemu, PearPC, Bochs, …
(2) 完全虚拟化:Full Virtualization,Native Virtualization
BT/hvm
VMWare Workstation, VirtualBox, VMWare Server, Parallels Desktop, KVM(hvm), XEN(hvm)
(3) 半虚拟化:Para-Virutalization
特点:GuestOS明确知道自己运行虚拟机之上;
xen, UML(user-mode linux)
(4) 容器级虚拟化:
LXC, OpenVZ, libcontainer, runC, rkt, Linux V Servers, Virtuozzo, …
(5) 库级别虚拟化:
wine
(6) 程序级虚拟化
jvm, pvm, …
主机虚拟化:Emulation, Full Virtualization, Para-Virutalization
Type-I:Hypervisor直接运行于硬件;
Type-II:VMM运行主机OS之上;
2.云栈的类别:
IaaS, PaaS, SaaS, FWaaS, DBaaS, LBaaS, …
brctl: (创建的网桥可以当作网卡使用)
yum install bridge-utils (brctl的命令的安装包)
brctl addbr mybr0 (添加一个网桥)
brctl show (查看创建的网桥)
ifconfig mybr0 up (想要使用,需要将创建的网桥开启)
ip addr add 10.0.0.1/16 dev mybr0 (给刚创建的网桥卡,添加IP地址)
ping 10.0.0.1 (ping自己也可以ping的通)
ifconfig mybr0 down; brctl delbr mybr0 (先将网卡卸载 然后再删除)
3.qemu :(使用qemu对虚拟机进行管理)
Qemu:
处理器模拟器
仿真各种IO设备
将仿真设备连接至主机的物理设备
提供用户接口
和libvirt 工具一样可以实现对虚拟主机的管理。
brctl addbr mybr0 (添加一个网桥)
brctl show (查看创建的网桥)
ifconfig mybr0 up (想要使用,需要将创建的网桥开启)
yum install qemu-kvm (安装包)
ln -sv /usr/libexec/qemu-kvm /usr/bin/ (由于安装好的qemu不在/usr/bin/下所以需要链接至其下)
qemu-kvm命令语法:
qemu-kvm [options] [disk_image]
qemu-kvm -machine ?(查看所支持模拟机器的类型)
qemu-kvm -cpu ? (查看模拟所支持的cpu的类型)
CentOS磁盘镜像文件下载:
https://cloud.centos.org/centos/7/images/
vim /etc/qemu-ifup (新建一个脚本)
#!/bin/bash
#
bridge=mybr0
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
bash -n /etc/qemu-ifup (检查脚本的语法错误)
chmod +x /etc/qemu-ifup (添加执行权限)
mkdir /data/VMs/c1 -p (创建文件夹。来存放磁盘镜像文件)
cd /data/VMs/c1/ (进入此目录下)
cirros-no_cloud-0.3.0-x86_64-disk.img (再ftp服务器里ISOs里将此镜像文件下载到本目录下,也可以将centos镜像文件放在这里)
mv cirros-no_cloud-0.3.0-x86_64-disk.img c1.img (将文件重新命名)
qemu-kvm -name c1 -smp 2 -m 128 -cpu host -drive file=/data/VMs/c1/c1.img,if=virtio,media=disk,cache=writeback,format=qcow2 -net nic,macaddr=52:54:00:00:00:11,model=virtio -net tap,script=/etc/qemu-ifup -vnc :0 (回车查看5900的端口 已经打开了)
通过桌面上的vnc链接到本机的IP地址192.168.60.20:0 (就可以连接上了)
连接上之后,给此虚拟机添加一个IP地址:ifconfig eth0 10.0.0.4/16
查看添加的网卡接口位:tap0
远程ssh也是可以来凝结本虚拟机的。
如果需要关闭虚拟机直接将qemu进程杀掉就可以了。
如果再创建一个虚拟机,vnc的编号要改;mac地址也要改;磁盘镜像文件也要添加新的