2017 11-27 kvm虚拟化技术

一.虚拟化技术的介绍

(1)虚拟化技术类型:

1.主机虚拟化:xen,kvm.virtualbox.openv
2.系统虚拟化:wine
3.容器(用户隔离空间):lxc(Linux container),openv
4.应用程序级虚拟化:jvm,pvm
5.模拟器:qemu

(2)主机虚拟化

1.CPU:

模拟:emulation, 虚拟机的arch与物理平台的arch可以不相同;qemu;
虚拟:virtualization
完全虚拟化(full-virt)
BT: 二进制转换 (软件)
HVM:硬件辅助的虚拟化(硬件)
半(准)虚拟化 (para-virt)
GuestOS得明确知道自己运行于虚拟化技术

2.cpu环的概念

cpu环0,cpu环1,cpu环2,cpu环3


搜狗截图20171202162920.png

解释:cpu从里到外分为环0,环1,环2,环3,一般情况下环和环2不进行工作,环3会执行一些简单的普通命令,而环0则执行一些特殊命令。例如执行一个计算命令2*3,该命令就会直接在环3上执行,但是一旦关机后该结果就会消失,如果想要执行io读写命令,此时环0就会工作,将计算结果存储到磁盘上,这一过程的实现是通过环0能够执行特殊指令去调用内核空间实现存储。,而用户空间没有权限执行。
注意:对此引入了cpu级别的硬件虚拟化概念,就是在环0内又加入了环-1,环0用来运行虚拟机的操作系统,而环-1则运行宿主机的操作系统。因此常常以cpu环是否存在环-1来判断该系统是否支持虚拟化

3.主机虚拟化类型

  • TYPE-I:基于硬件级别直接运行hypervisor
    例: xen,vmware,ESX/ESXI
    Hypervisor:是一种运行在物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享一套基础物理硬件,因此也可以看作是虚拟环境中的"元"操作系统,它可以协调访问服务器上的所有物理设备和虚拟机,也叫虚拟机监视器(Virtual Machine Monitor)。Hypervisor是所有虚拟化技术的核心。非中断地支持多工作负载迁移的能力是Hypervisor的基本功能。当服务器启动并执行Hypervisor时,它会给每一台虚拟机分配适量的内存、CPU、网络和磁盘,并加载所有虚拟机的客户操作系统。
  • TYPE-II:
    于硬件级别运行一个OS(Host OS),而此OS上运行一个VMM;
    例:vmware workstation, virtualbox, kvm
  • Linux目前流行的开源虚拟化技术解决方案:
    主机虚拟化:xen, kvm, virtualbox
    容器级:lxc, libcontainer, runC, openvz
    模拟器:qemu
  • KVM的组件:
    kvm.ko:模块
    API:系统应用接口,系统留给应用程序的一个调用接口
    qemu-kvm:用户空间的工具程序
    qemu-kvm是一个开源仿真器,为kvm虚拟机监控程序提供了硬件仿真
    libvirt:是一套免费的,开源的支持linux系统的主流虚拟化工具的C函数库,其为包括xen,kvm等各种虚拟化工具提供一套方便的可靠的编程接口,本身属于工具,而是一种可以建立工具来管理客户操作系统的API

4.快速使用kvm技术

  • 首先yum install libvirt-daemonize-kvm qemu-kvm virt-manager


    搜狗截图20171202170555.png
  • 此时加载kvm模块,modprobe kvm
  • systemctl start libvirtd.service
  • grep -i -E '(vmx|svm|lm)' /proc/cpuinfo——cpu是否支持虚拟化


    搜狗截图20171202171118.png
  • lsmod |grep kvm——查看kvm类型


    搜狗截图20171202171426.png
  • 创建一个物理网桥
    拓扑图解释原理:


    搜狗截图20171202174517.png

    因此在创建虚拟机之前要先创建一个虚拟网卡(物理网桥),这是因为在安装虚拟机操作系统时,需要安装PXE系统,那么就需要该虚拟机具有外部通讯的功能,只有这样才能DhCP获取ip地址从而实现自动化安装,物理网桥的作用就是一个虚拟网卡,通过物理交换机和外部进行信息的交换与通讯

  • cd /etc/sysconfig/network-scripts
    vim ifcfg-ens37
    NAME=ens37
    DEVICE=ens37
    ONBOOT=yes
    IPADDR=172.18.250.223——将该地址删除,没有ip地址就相当于一个交换机/
    BRIDGE=br0——网桥为br0
  • Vim ifcfg-br0——创建物理网桥
    NAME=br0
    DEVICE=br0
    ONBOOT=yes
    IPADDR=172.18.250.223
    DNS=172.18.0.1
    PREFIX=16
    此时br0被设置成物理网桥(虚拟网卡)
  • 重启network
    ip a


    搜狗截图20171202175618.png

    brctl show


    搜狗截图20171202175749.png
  • 在 VMware Workstation上
    virt-manager


    搜狗截图20171202180152.png

    创建虚拟机


    搜狗截图20171202200739.png

    选择内存大小和cpu数量
    搜狗截图20171202200839.png

    选择虚拟机磁盘大小
    搜狗截图20171202200931.png

    配置主机名,选择网桥


    搜狗截图20171202201041.png

    开始安装
    搜狗截图20171202201118.png

    实现快速安装

5.总结

虚拟化技术的分类:
(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, ...

二.通过磁盘镜像文件实现虚拟机的下载

(1)镜像文件的下载地址:https://launchpad.net/cirros/
下载的镜像文件:http://download.cirros-cloud.net/0.3.0/cirros-0.3.0-x86_64-disk.img
(2)在宿主机上执行qemu-img -h来查看磁盘镜像文件的格式及创建选项,一般使用qcow2格式。其中co=copy,w=write.是一种非常高级的格式,支持镜像文件的压缩加密及快照等功能
(3)开始创建
mkdir -pv /app/vm/images,cd到该目录下
开始执行qemu-img create -f qcow2 -o ? /app/vm/images/test.qcow2
解释上述命令:创建磁盘镜像文件时需要的选项并且如何查询帮助,-f代表文件的格式类型,-o代表选项并且后面要加?,后面要接preallocation,表示有关镜像文件的分配,其中off表示不分配内容,使用时再分配,而metadata表示只分配元数据,full表示指定分配多大空间。一般情况下选择metadata
具体的命令操作: qemu-img create -f qcow2 -0 size=120G,preallocation=metadata /app/vm/images/test.qcow2
创建成功后执行ll -h来查看

搜狗截图20171202211151.png

(4)开始图形化安装虚拟机
virt-manager
其他选择与之前快速安装虚拟机类似,只是在选择磁盘大小时选择第二个select or create cutom storage
然后加入路径 /app/vm/images/test.qcow2
然后其他选项不变进行安装即可
(5)以上方式是人为自创建得一个镜像文件,接下来通过下载的镜像的文件来实现
(6)mkdir /app/vm/iamges2,将cirros-0.3.0-x86_64-disk.img镜像文件下载当前目录下,并且 cp cirros-0.3.0-x86_64-disk.img
c1.img 和c2.img
通过qemu-img info c1.img来查看信息
搜狗截图20171202213331.png

在物理机上执行virt-manager
搜狗截图20171202213446.png

选择虚拟机镜像文件路径
搜狗截图20171202213546.png

配置内存大小和cpu数量
搜狗截图20171202213605.png

修改主机名,选择网桥等选项后开始安装
出现如图选项后根据默认的用户名和密码进行登录
搜狗截图20171202214114.png

进行sudo su -切换成root用户
ip a 发现已经配置好网址,此时可以利用c2.img再创建一个虚拟机进行相互之间的通讯

三.使用qemu-kvm来手动安装虚拟机

(1)使用qemu-kvm管理vms:

Qemu:
处理器模拟器
仿真各种IO设备
将仿真设备连接至主机的物理设备
提供用户接口

(2)标准选项的介绍

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:磁盘映像文件的格式;
  • 显示选项:
    -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

(3)qemu-kvm的使用

1.首先如果要执行qemu-kvm命令时,要先执行 in -sv /usr/libexec/qemu-kvm /usr/bin/,链接到/usr/bin/的path路径,可以让qemu-kvm命令生效
2.开始执行命令
qemu-kvm -name c2 -m 64 -smp 2,cores=1(内核数),sockets=1(槽数) -drive file=/vm/images2/c2.img,if=virtio(半虚拟化),media=disk -nographic(不启用图形)
开启之后会进行30多次的连接失败后,才能成功登陆,然后进入虚拟机状态
执行ctrl -a x:退出模拟器状态
ctrl -a h :查看帮助
ctrl -a c :宿主机与虚拟机之间进行切换
3.针对上述情况如果想要快速登录,则要在ftp上下载cirros-0.3.0-i386-disk.img(经过处理后的镜像)
mkdir -pv /app/vm/images3/,并cd 该目录下
cp cirros-0.3.0-i386-disk.img c1.img c2.img
4.yum install tigervnc
执行命令:qemu-kvm -name c1 -smp 2 -m 64 -drive file=/app/vm/images3/c1.img,if=virtio,media=disk -vnc :0(代表vnc监听的端口默认为5900,其中最后一个0代表第一个终端) -daemonize


搜狗截图20171202221302.png

在物理机上执行vncviewer :0,虚拟机登陆成功

四.网络选项的设置

(1)网络选项:

-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 1
fi  

其它选项:
-daemonize:以守护进程运行;

(2)通过网络选项实现创建虚拟机

1.cd /app/vm/images3 cp c2.img c3.img

vim /etc/qemu-ifup

#!/bin/bash
#
 bridge=vnet0
 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

2.创建物理网桥(虚拟网卡)

brctl addbr vnet0
ip link set vnet0 up


搜狗截图20171202222550.png

vim /etc/qemu-ifdown——拆除网卡

#!/bin/bash
#
 bridge=vnet0
 if [ -n "$1" ];then


  brctl delif $bridge $1
  [ $? -eq 0 ]&& exit 0 || exit 1
  else
  echo "Error: no interface specified."
  exit 2
  fi

注意:两个脚本都要加执行权限

3.执行命令

  • qemu-kvm -name c1 -m 64 -smp 2 -drive file=/app/vm/images3/c1.img,if=virtio,media=disk -vnc :0 -daemonize -net nic,model=e1000,macaddr=52:54:00:00:00:10(mac地址52:54:00:00为固定的) -net tap,script=/etc/qemu-ifup
  • qemu-kvm -name c2 -m 64 -smp 2 -drive file=/app/vm/images3/c2.img,if=virtio,media=disk -vnc :0 -daemonize -net nic,model=e1000,macaddr=52:54:00:00:00:11(mac地址要改变)-net tap,script=/etc/qemu-ifup
    在物理机上执行vncviewer :0


    搜狗截图20171202223736.png

    为了实现通讯为该虚拟机配置ip地址
    ifconfig eth0 10.1.0.1/24 up
    在另一台虚拟机上 ifconfig eth0 10.1.0.2/24 up
    此时两台虚拟机可以进行Ping命令

4.为vnet0配置ip地址

ifconfig vnet0 10.1.0.254/24 up
此时vnet0网卡既可以作为交换机,也可以作为虚拟网卡
拓扑图解释:


搜狗截图20171202224837.png

在宿主机上创建了一个网桥(vnet0),如果不给这个网桥配置ip地址,那就相当于一个交换机,两个虚拟机通过交换机可以进行ping命令,但是不能和宿主机进行通讯,因此为网桥配置ip地址后就可以实现虚拟机与宿主机之间的通讯了,此时就相当于一个仅主机模式,如果通过iptables策略开启snat策略实现跳转的话,就可以和外部进行通讯,此环境就相当于nat模式

5在虚拟机上分别将网关指向虚拟网卡的ip地址

ip route add default via 10.1.0.254/24
此时虚拟机和宿主机就可以实现ping命令,此时相当于一个仅主机模式,如果想要实现nat模式就要设置ipatbles策略
开启宿主机的路由转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
添加iptables的snat规则
iptables -t nat -A POSTROUTING -s 10.1.0.0/24 -j SNAT --to-source 172.18.250.223
此时在虚拟机上ping 172.18.0.1可以Ping通

五.实现虚拟机的自动分配地址

(1)首先查看netns帮助
ip netns help


搜狗截图20171203151626.png

netns主要是可以创建一个新的空间,创建一个新的网络环境
例: ip netns add router0——创建一个名为router0的网络空间,和宿主机无关系
使用ip netns exec router0 ifconfig -a来查看新创建的空间


搜狗截图20171203152136.png

(2)为router0添加虚拟网卡
ip linkn add myeth1 type veth peer name myeth2
创建的网卡是成对出现

ip a查看


搜狗截图20171203152629.png

(3)将其中一个网卡添加到router0的网络空间中
ip link add myeth2 netns router0
搜狗截图20171203152808.png

(4)修改网卡名
ip netns exec router0 ip link set dev myeth2 name eth0 ——将router0中的myeth2改名为eth0
搜狗截图20171203153213.png

(5)为网卡配置ip地址
ip netns exec router0 ifconfig eth0 10.2.0.253/24 up
ifconfig myeth1 10.2.0.252/24 up
搜狗截图20171203153718.png

ping命令测试
搜狗截图20171203153755.png

以上操作属于容器类型的虚拟化,作为了解,下面介绍虚拟机的自动获取ip地址的方式

dnsmasq

通过dnsmasq实现自动获取ip地址
yum install dnsmasq
命令: dnsmasq --listen-address 10.2.0.253,127.0.0.1 --dhcp-range=10.1.0.11,10.1.0.50,24h(地址有效时间) --dhcp-option=3(就是网关的意思),10.2.0.253
qemu-kvm -name c1 -m 64 -smp 2 -drive file=/app/vm/images3/c1.img,if=virtio,media=disk -vnc :0 -daemonize -net nic,model=e1000,macaddr=52:54:00:00:00:10 -net tap,script=/etc/qemu-ifup
在物理机执行vncviewer :0
就会发现ip地址已经自动获取
如果将 /etc/qemu-ifup脚本中的bridge=vnet0改为br0,再执行 qemu-kvm -name c1 -m 64 -smp 2 -drive file=/app/vm/images3/c1.img,if=virtio,media=disk -vnc :0 -daemonize -net nic,model=e1000,macaddr=52:54:00:00:00:10 -net tap,script=/etc/qemu-ifup,会发现虚拟机地址是172范围内的


搜狗截图20171203160127.png

六.virsh命令的应用

(1)虚拟机的生成需要依赖于预定义的xml格式的配置文件
生成工具: virt-manager,virt-install
因此要安装 yum install virt-install virt-manager
cd /etc/libvirt/qemu/——查看xml格式的配置文件
(2)创建新的虚拟机,使用


搜狗截图20171203161017.png

重新创建一个名为c2的虚拟机,方式同之前的方式一样
此时在/etc/libvirt/qemu/下会有一个c2.xml配置文件
(3)通过已有的.xml文件来生成一个新的虚拟机
使用virsh命令实现
首先来介绍virsh命令的使用


搜狗截图20171203161515.png

list --all
搜狗截图20171203161730.png

destroy c2:执行该命令就可以将c2虚拟机关闭
start c2:执行start命令就会重新开启虚拟机
virsh console c2:直接连到虚拟机
搜狗截图20171203162329.png

执行ctrl ]就会剥离终端(注意是剥离终端,但是虚拟机还在运行)


搜狗截图20171203162602.png

(4)开始手动创建xml配置文件
cd /etc/libvirt/qemu
cp c2.xml template.xml
vim template.xml
搜狗截图20171203163042.png

virsh create template.xml --console 创建并登录
创建并登录成功后退出并进入virsh中,执行all --list发现没有template虚拟机,因此要将名字改为c3后再加入进来
cp template.xml c3.xml
virsh define /etc/libvirt/qemu/c3.xml
再次list --all查看
搜狗截图20171203163530.png

创建成功,这样就不需要每次都执行qemu-kvm -name等操作来开启虚拟机了,只需要进入visrh,执行start name 和destroy name来实现开启和关闭命令
(5)其他常用命令介绍
dumpxml c2
搜狗截图20171203163921.png

save:挂起
suspend:暂停(暂时存储到内存中),如果关机内容就会丢失
resume:重新运行
例:suspend c2

resume c2


搜狗截图20171203164406.png

使用save命令
开启另一个终端
virsh console c2
执行ping 172.18.0.1,然后ctrl ]退出虚拟机终端
此时在原终端上执行 save c2 /tmp/c2.dump --running——将ping命令的状态保存的路径
之后只要执行restore /tmp/c2.dump --running就可以恢复之前的状态
搜狗截图20171203165014.png

setvcpu——增加虚拟机数量
例 setvcpu c2 2,但是并不是想设置几个都可以,这是和之前的创建时就固定好的,使用setvcpu只是要开启几个cpu的意思
dominfo c2
搜狗截图20171203165415.png

实现热插拔设备的命令操作
在正在运行的c2虚拟机上再加入一个.img的镜像文件,打开另一个终端
cd /app/vm/images3
qemu-img create -f qcow2 -o size=20G,preallocation=metada ./test.img
回到之前的终端 执行domblklist c2
domblkinfo c2 vda——查看磁盘信息
搜狗截图20171203170706.png

attach-disk c2 /app/vm/images3/test.img vdb
搜狗截图20171203170717.png

执行detach-disk c2 vdb拆除该磁盘
搜狗截图20171203170742.png

网卡热插拔
attach-interface c2 bridge vnet0 --model virto
detach-interface bridge --mac——根据指定的mac地址来进行拆除
注意:
hda /app/c1.img #hda时IDE硬盘,在这里不支持热插拔
vda /app/c4.img #注意vda格式的是半虚拟化的支持热插拔

推荐阅读更多精彩内容