KVM虚拟化系统学习笔记
Posted wx600649499b2bc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KVM虚拟化系统学习笔记相关的知识,希望对你有一定的参考价值。
第一章 KVM虚拟化系统的基本概念
1.1虚拟化系统基本概念
1.1.1虚拟化系统架构
1.1.2软件虚拟化和硬件虚拟化
实现虚拟化的关键:虚拟化层必须能够截获计算元件对物理资源的直接访问,并将其重新定向到虚拟资源池中。
根据“截获、重定向”的方式,虚拟化可分为软件虚拟化和硬件虚拟化。
软件虚拟化:用纯软件的方式实现“截获、重定向”;如:QEMU、Vmware的软件虚拟化
优点:可在硬件不支持虚拟化的环境中运行;
缺点:性能较差。
硬件虚拟化:物理资源本身提供了对“截获、重定向”功能的支持;如:Intel virtualizationTechnologgy(Intel VT) ,AMD-V
优点:虚拟化硬件支持Guest OS直接在其上面运行,无需进行二进制转换,性能较软件虚拟化更优;
缺点:需要物理资源支持VT功能,需要CPU、主板芯片组、Bios支持VT。
1.1.3 准虚拟化和全虚拟化
准虚拟化:基于希望解决软件虚拟化性能上的损失,提出了一项解决方案:改动Guest OS的代码,使它以为自己是运行在虚拟化环境中,可于虚拟系统协同工作。这种方法称为准虚拟化。
注解:
张三:一个运行在虚拟化环境中的Guest OS(Linux),但是他的代码告诉他,他是一个操作系统,于是他理所当然认为自己是直接运行在物理资源上,理所应当可以直接调用物理资源。
张二:一个运行在虚拟化环境中的Guest OS(windows)
李四:底层操作系统,“哼哼,老子才是真正的操作系统。”
王五:虚拟化系统
赵六:物理资源
张三:“赵六,我需要物理资源!”
赵六:“你丫只是个应用程序,想要物理资源,让你老大李四跟我说。”
李四:“张三,你丫只是个应用程序,还想冒充操作系统,滚一边去!”
张三:“靠,老子明明是操作系统!”
王五:“张三,你小子只是我搞出来的山寨货,想要物理资源,得先问我。”
张三: “王王大哥,给点物理资源吧!”
王五:“好的,你等着,让我跟底层操作系统骗点!”“李四大哥,张三这二货只是个应用程序,他让我跟您申请点物理资源,麻烦您处理一下!”
李四:“还是王五懂规矩,现在刚好有多余的物理资源,拿去用吧!”
(虚拟化系统截获了Guest OS对物理资源的直接访问,并将Guest OS的访问需求重定向到自己,实现了基于软件的全虚拟化)
张二(windows):“赵六,给我一些物理资源!”
赵六:“滚犊子!”
王五:“你个二货,要资源跟我申请啊,不要直接去找赵六老大了,不知道自己的身份吗?”
张二:“唉,造孽啊!”
王五:“唉,总这样也不行啊,这两二货天天骚扰赵六老大,总有一天被打断腿。这样,我来给这个两二货洗洗脑,让他有需求来找我!”
给张三洗脑中……..(修改Guest OS代码,让它以为自己就是运行在虚拟化系统中,实现准虚拟化。)
给张二(windows)洗脑中…….“唉,这个张二是个又丑又硬的货,洗脑不成功哇” (windows是闭源系统,无法修改源代码,无法实现准虚拟化。
张三:我又需要物理资源了,“赵六…….”,唉不对,要资源应该跟王五要哇。
“王五哥,我需要物理资源!”
王五:“这才乖嘛,等着,我去跟李四哥要去。
……………………
张三:"王五哥,我要物理资源,我又要资源了"
王五:"靠,你想累死我啊,等着….."
张三:"快点,我急着用呢"
王五:"急毛线啊,等着,唉,累死我了."
(由于Guest OS每次需要物理资源都需要虚拟化系统转发,基于软件的全虚拟化系统性能低下)
全虚拟化:
为客户机提供了全套虚拟硬件平台,包括 CPU、内存、外设等。支持任何可以真实物理物理平台上运行的操作系统。
基于软件的全虚拟化系统性能较为低下。
基于硬件的全虚拟化系统是现在主流的虚拟化技术的核心。
性能比较:
基于硬件的全虚拟化 》基于软件的准(半)虚拟化 》基于软件的全虚拟化
KVM系统的CPU和内存虚拟化,为基于硬件的全虚化模式;
外设(磁盘、网卡等I/O设备),为基于软件的全虚拟化模式;
通过virtio技术,也可实现外设的准(半)虚拟化,可提高外设的性能。
1.1.4 KVM系统介绍
Kernel Virtual Machine :内核虚拟机
2006年由Qumranet公司发布,同年10月被正式纳入Linux Kernel,成为内核源代码的一部分。
2008年9月4日,Redhat收购了Qumranet公司。
2010年11月,Redhat发布RHEL 6.0,这个改造版中,用KVM取代了原来xen系统。
在KVM系统中,每个虚机都是Linux的一个常规进程,由Linux调试程序进行调度。
KVM本身并不执行任何模拟,需要用户空间程序来进行实现硬件模拟功能。
这个空间程序就是大名鼎鼎的QEMU。
KVM系统架构:
KVM模块:
KVM模块是KVM虚拟机系统的核心部分,主要功能是打开硬件的虚拟化功能,创建特殊设备文件:/dev/kvm,并等待来自用户空间的命令。
QEMU:用户空间程序,虚拟机的创建、运行、管理等操作,是QEMU和KVM模块相互配合的过程。
注解:如果把KVM模块看作是一个系统内核的话,那QEMU就是操作系统,而Virsh、Virt-manager等管理工具就是应用程序。
QEMU本身就是一个开源虚拟机软件,是用纯软件方式实现虚拟化的,因此性能比较低下。
QEMU和KVM的结合,是典型的开源系统的代码共用和合作。
QEMU不但可以和KVM结合使用,还可以和其它虚拟机系统结合使用,比如Xen.
1.2 KVM实验环境的搭建
1.2.1 KVM系统安装
第一步:在BOIS中打开电脑的虚拟化功能(一般现在的电脑支持)
第二步:安装vmware workstation
由于学习成本的问题,我们不可能每个人都去购买一台服务器来做实验,因此推荐使用vmware workstation这个虚拟化软件来搭建实验环境。
Vmware workstation下载链接:https://www.vmware.com/go/getworkstation-win
下载完安装包后,跟普通软件一样安装就行。
第三步:新建虚拟机
点击“文件”--“新建虚拟机”
centos安装界面
GUI界面安装上
查看内核版本:
命令:uname -r
查看centos版本:
命令:cat /etc/centos-release
各种版本在操作上可能会有所不同,不过都是大同小异。
确认KVM模块是否被加载
命令:lsmod | grep kvm
确认qemu是否已安装:
命令:rpm -qa | grep qemu
安装qemu
yum install qemu-kvm
安装管理工具和应用程序接口:libvirt
yum install libvirt -y
安装管理工具:virt-install,virt-manager,virsh
Yum install virt-install virt-manager
到些为止,KVM环境基本架设完毕。
1.2.2小试牛刀,创建第一个虚拟机
第一步:创建一个虚拟机的镜像文件(相当于虚机的存储空间)
dd if=/dev/zero of=kvm1bs=1M count=8096
第二步:Qemu-kvm执行程序默认在/usr/libexec/下面,需要在/sbin下创建qemu-kvm命令的软链接:
ln /usr/libexec/qemu-kvm/sbin -s
第三步:用qemu开启虚拟机,其操作界面默认运行在VNC下,所以要安装VNC
yum install tigervnc
第四步:启动虚机机并开始安装Guest OS
Qemu-kvm -hda kvm1 -cdrom /XXX.iso -boot oder=cd,once=d -vnc0.0.0.0:0
第五步:查看系统监听端口,确认VNC服务已经起来:
netstat -tupln
第六步:在centos图形界面中,用vncviewer工具进入虚机的操作界面:
Vncviewer :0
第七步:也可以用windows版的vncviewer进入虚机的操作界面:不过需要防火墙放通
Firewall-cmd --add-service=vnc-server
第二章虚拟机的基本配置(qemu-kvm)
2.1使用qemu-kvm配置虚拟机的CPU
虚拟化系统中CPU的一些概念:
VCPU:虚拟机(guest os)中拥有的cpu即称为vcpu.
每个guest os都是宿主机OS中的一qemu进程;
每个vcpu则是qemu进程派生出来的一个线程。
进程和线程的关系
(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程是操作系统可识别的最小执行和调度单位。
(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。
(3)处理机分给线程,即真正在处理机上运行的是线程。
(4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
SMP和numa
Smp:symmetric multi-processor(对称多处理器)
多CPU通过一个总线访问内存。
缺点:当内存接口达到饱和的时候,增加处理器并不能获得更高的性能,SMP支持的CPU个数有限。
Numa:每个处理器有自己的内存,每个处理器也可以访问别的处理器的内存。
CPU配置
qemu-kvm -smp n,[maxcpus=maxcpus],[cores=cores],[threads=threadw],[sockets=sockets]
参数注解:
n:VCPU数量(默认为1 )
maxcpus:最大使用cpu数量(配合cpu热插拨机制使用)
cores:每个cpu的core数量;
threads:每个core线程数量;
sockets:cpu插槽数量
实验1:
qemu-kvm test1.qcow2 -monitor stdio -vnc 0.0.0.0:0
(不加任何CPU参数)
实验2:
qemu-kvm -smp 2 test1.qcow2 -monitor stdio -vnc 0.0.0.0:0
实验3:
qemu-kvm -smp2,maxcpus=3,cores=2 test1.qcow2 -monitor stdio -vnc 0.0.0.0:0
实验4:
qemu-kvm -smp 2,maxcpus=3,cores=1,sockets=1 test1.qcow2-monitor stdio -vnc 0.0.0.0:0
VCPU=sockets * cores * threads
指定CPU型号:
Guest os未指定型号时:
查看当前qemu支持的cpu型号:
qemu-kvm -smp 2,maxcpus=3,cores=1,sockets=1 -cpuSandyBridge test1.qcow2 --vnc 0.0.0.0:0
2.2使用qemu-kvm配置虚拟的内存
虚机机内存配置
qemu配置命令:
qemu -m <size> test1.qcow2
如果不加内存配置参数,默认分配给虚机的内存为128M
在虚机中使用free -h查看内存大小为108M。
少掉的内存为内核执行文件占用和系统保留占用,108M为实际可用内存。
实验1:为虚机分配1024M内存
qemu-kvm -m 1024 test1.qcow2 -monitorstdio -vnc 0.0.0.0:0
2.3 使用qemu-kvm配置虚拟机的存储
虚拟机存储配置
qemu-kvm -hda file -fdafile -cdrom file
hda:指定虚拟机第一块硬盘。在Guest os中表现为/dev/hda或/dev/sda。hda对应的值,可以为磁盘镜像文件,也可以为宿主机的存储设备文件。
hdb/hdc…:指定虚拟机中的第二、三块硬盘。依此类推。
fda:指定虚拟机中的第一个软驱。
cdrom:指定虚拟机的光驱。cdrom是Guest os中的第三个IDE设备,不能和hdc同时使用。
mtdblock:虚拟机中的flash存储器
sd:虚拟机中的sd卡
详细配置存储参数:qemu-kvm -drive option,[option],[option]……..
option参数注解:
1)file= 指定磁盘镜像文件名,或存储设备文件名;
2)if= 指定存储驱动器的接口类型(如ide、scsi(目录qemu版本不支持)、virtio);
3)bus= 指定存储驱动器的总线编号;
4)unit= 指定存储驱动器的单元编号;
5)index= 同一种接口驱动器的索引编号;
6)media= 设置存储驱动器中媒介的类型(disk、cdrom)
7 )snapshot= 可选值为(on,off),当值为on时,不会将更改、新增的数据回写到磁盘镜像文件中,而是写到一个临时文件中。默认为off. 可以在monitor中,使用commit命令强制回写。
8)cache= cache访问方式,可先值为(none,write back,writethrough)
默认值:writethrough,(直写模式)数据直接写入磁盘里,不使用缓存;在数据更新时,同时写入Guest os Pagecache和后端块设备。
writeback:(回写模式)在数据更新时只写入 Guestos 和宿主机os的PageCache。只在数据被替换出缓存时,被修改的缓存数据才会被写到后端存储。此模式的优点是数据写入速度快,因为不需要写存储;缺点是一旦更新后的数据未被写入存储时出现系统掉电的情况,数据将无法找回。
none:这种模式作用在Guest OS Pagecache和物理磁盘Cache中,相当于虚拟机能直接访问宿主机的磁盘,性能不错!
性能上: writeback > none >writethrough
安全上 :writeback < none <writethrough
9)format= 指定磁盘的格式,默认情况下由qemu自动识别。如:qcow2,vmdk,raw
10)serial= 分配 给设备的序列号
11)addr= 存储控制器的PCI地址
12)id= 设置驱动器id
13)readonly= on|off 是否只读
设置启动顺序
qemu-kvm -boot [order=drives ],[once=drives ],[menu=on|off]
注解:
drives:
a:第一个软驱
b:第二个软驱
c:第一块硬盘
d:光驱
n:网络启动)
order:设定启动顺序,如设成order=dc,即先从光驱启动,再从第一块硬盘启动。
once:设定第一次的启动顺序,重启后失效。
menu:启用交互式启动菜单
qemu支持的磁盘镜像文件
使用qemu-img -h命令查看支持的磁盘镜像文件格式
常用格式介绍:
1、raw
原始磁盘镜像格式,qemu-img命令的默认格式。
之前用DD创建的磁盘镜像文件就是raw格式。
2、qcow2
qemu推荐的文件
支持稀疏文件,支持AES加密,支持快照。
3、qcow
旧版的qcow2,现在很少使用
4、vdi
virtualbox镜像文件格式
5、vmdk
vmware镜像文件格式
6、vpc
Microsfot virtual pc文件格式
qemu硬盘管理工具qemu-img
命令格式:qemu-img [command] [-o options]
1)check:对镜像文件进行检查,查找镜像文件中的错误;
目前只支持qcow2、qed、vdi格式
2)create [-f fmt][-o option] filename [size]
创建镜像文件
-f 镜像文件格式(如raw、qcow2)
-b指定backing_file(这个镜像文件只记录与backing_file差异的部分)
-o 选项(如backing_file)
Size 指定文件大小(如M、G、T)
3)commit [-f fmt] filename
提交filename中的内容到backing_file中。
4)convert[-c] [-f fmt] [-O output_fmt][-o option] filename outputfilename
镜像文件格式转换
-c:压缩
-f:源文件格式
-O:输出文件格式
Filename:源文件名
Ouputfilename:输出文件名
5)info filename
显示镜像文件信息
6)snapshot [-l |-a snapshot|-c snapshot|-d snapshot] filename
-l 列出所有快照
-a使用一个快照
-c创建一个快照
-d删除一个快照
7)resize filename[+|-]size
增加、减小镜像文件的大小(qcow2格式不支持减小空间)
2.4使用qemu-kvm配置虚拟机的网络
虚拟机的网络配置
Qemu-kvm提供了三种网络模式
1、桥接(bridge)
将虚拟机的网卡桥接到宿主机的物理网卡。虚拟机和宿主机处于同一个网络内,使用同一个网段。相当于将虚拟机的网卡和宿主机的网卡接在同一台二层交换机上。
2、NAT
宿主机需要两块网卡,一块网卡连接物理网络,另一块网卡(通常是虚拟网卡)和虚拟机网卡做桥接。虚拟机需通过宿主机的NAT功能,转发数据包。(这时宿主机相当一台NAT路由器。
3、qemu内部的用户模式
完全由qemu模拟出来的一种网络模式,性能相对较差。
基本网络配置
qemu-kvm -netnic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v]
建立一个新的网卡,并加入vlan n(默认为 vlan 0)
macaddr:网卡的mac地址
model:网卡型号默认为rtl8139
name:网卡名称
addr:网卡PCI地址
2.4.1桥接模式配置
安装桥接管理工具:yum instal bridge-utils
检查一下tun模块是否被加载
如果未加载,使用modprobe tun命令加载一下。
新建一个bridge(br0)
vim /etc/sysconfig/network-scripts/ifcfg-br0
Ifcfg-br0文件配置内容
DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
IPADDR=192.168.0.198
PREFIX=24
GATEWAY=192.168.0.1
DNS=114.114.114.114
ONBOOT=yes
修改宿主机物理网卡配置
vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
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=ens33
UUID=ac25a1e2-258c-42c9-aa11-f5565b3474d9
DEVICE=ens33
ONBOOT=yes
#IPADDR=192.168.0.197 #将此行注释掉
#PREFIX=24 #将此行注释掉
#GATEWAY=192.168.0.1 #将此行注释掉
#DNS1=114.114.114.114 #将此行注释掉
BRIDGE=br0 #新增此行
重启网络服务:systemctl restart network
使用ifconfig查看当前网络情况,br0已启动,IP地址配置在br0上
虚拟机配置命令
qemu-kvm -net nic -net tap,script= filename
-net tap:添加一块tap虚拟网络设备(用于连接虚拟机的网卡)
-nettap[,vlan=n][,name=str][,fd=h][,ifname=name][,script=file][,downscript=dfile][,helper=helper][,sndbuf=nbytes][,vnet_hdr=on|off][,vhost=on|off][,vhostfd=h][,vhostforce=on|off]
vlan:配置加入的vlan号
ifname:指定tap设备的名称
script:指定启动虚机时宿主机执行的脚本(默认为/etc/qemu-ifup)
创建/etc/qemu-ifup脚本
#!/bin/bash
ip link set up $1
brctl addif br0 $1
downscript:虚拟机关闭时执行的脚本(非必要)
2.4.2NAT模式配置
新建一个桥br1,用于连接虚拟机的网卡(跟桥接模式一样)
Vim/etc/sysconfig/network-script/ifcfg-br1
DEVICE=br1
TYPE=Bridge
BOOTPROTO=static
IPADDR=192.168.100.254
PREFIX=24
ONBOOT=yes
修改br1的IP地址为:192.168.100.254(根据环境不同自己配置)
重启网络服务systemctl restart network
查看网络情况:ifconfig
宿主机安装DHCP软件(建议使用dnsmasq)
yum install dnsmasq
配置/etc/dnsmasq.conf文件内容
Interface=br1
dhcp-range=192.168.100.100,192.168.100.200,255.255.255.0,12h
dhcp-option=option:router,192.168.100.254
dhcp-option=option:dns-server,114.114.114.114
放通宿主机防火墙DHCP服务
firewall-cmd --add-service=dhcp
创建/etc/qemu-ifup-NAT脚本(参考桥接配置)
#!/bin/bash
ip link set $1 up
brctl addif br1 $1
启动虚拟机
qemu-kvm -m 2048 -net nic -nettap,script=/etc/qemu-ifup-NAT test1.qcow2
此时虚拟机应该已成功获取到IP地址、网关、DNS,已经可以和宿主机br1连通。但是还无法访问外网。
开启宿主机的数据包转发功能
修改 /etc/sysctl.conf文件
net.ipv4.ip_forward = 1
立即应用配置:sysctl -p
NAT配置
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -j MASQUERADE
将宿主机当成一个NAT网关,主有虚拟机通过宿主地址转换后访问外网。
OpenStack学习笔记----安装虚拟化工具