KVM

    kvm: Kernel-based Virtual Machine

            Qumranet公司 --> RedHat

            (1) X86_64

            (2) HVM:

                Intel VT

                AMD AMD-v

                

        KVM的组件:

            两类组件:

                (kvm.ko)/dev/kvm:工作为hypervisor,在用户空间可通过系统调用ioctl()与内核中的kvm模块交互

                        从而完成虚拟机的创建、启动、停止、删除等各种管理功能;

                qemu-kvm进程:工作于用户空间,用于实现IO设备模拟;用于实现一个虚拟机实例;

                

        KVM模块load进内存之后,系统的运行模式:

            内核模式:GuestOS执行IO类的操作时,或其它的特殊指令操作时的模式;它也被称为“Guest-Kernel”模式;

            用户模式:Host OS的用户空间,用于代为GuestOS发出IO请求;

            来宾模式:GuestOS的用户模式;所有的非IO类请求;

            

        安装使用KVM:

            判断CPU是否支持硬件虚拟化:

                grep -i -E '(vmx|svm|lm)' /proc/cpuinfo

                    vmx:Intel VT-x

                    svm:AMD AMD-v

[root@L~]#grep -i -E '(vmx|svm|lm)' /proc/cpuinfo    #lm—>long mode 只能支持64位的
[root@L~]#modinfo kvm


       KVM运行逻辑,虚拟机运行需要虚拟出CPU的核心数,即vcpu0、vcpu1、vcpuN,CPU和内存的虚拟是由kvm kernel module来管理,vcpu是当做一个线程进行管理的。

        IO设备用Qemu进行虚拟,并且进行管理。

        运行中的一个kvm虚拟机就是一个qemu-kvm进程,运行qemu-kvm程序并传递给它合适的选项及参数即能完成虚拟机启动,终止此进程即能关闭虚拟机;

                    

            kvm工具栈:

                qemu:

                    qemu-kvm(命令的管理界面、仅能用在本机上运行) 

                    Qemu-img (虚拟机硬盘管理)

                libvirt:

                    GUI:virt-manager, virt-viewer(virt-manager 能做虚拟机的全生命周期管理)

                    CLI: virsh, virt-install (virsh 只能管理,但不能安装,virt-install负责安装虚拟机的工具)

                            虚拟机能使用很多种格式的硬盘

                                Raw格式的(dd命令,kvm可以使用)

                                vmdk(VMware格式的)

                                vdi(virtualbox格式的)

                                Qcow、Qcow2(Qemu-kvm格式的,qemu copy on write 写时复制技术)

                    

                    C/S:

                        libvirtd

                    

            安装:

                (1) 装载内核模块

                    kvm:核心模块

                    kvm-intel|kvm-amd

                    

    使用virt-manager管理KVM

        # yum install qemu-kvm libvirt-daemon-kvm  virt-manager

        # modprobe kvm

        

        # systemctl start libvirtd.service

        

        # virt-manager &

        

    安装kvm相关包

[root@L~]#yum install qemu-kvm libvirt-daemon-kvm  virt-manager libvirt 
#centos6 没有daemon包,装libvirt
[root@Lapp]#lsmod | grep kvm
kvm_intel             166504  0 
kvm                  515469  1 kvm_intel
[root@Lapp]#ls /dev/ | grep kvm
kvm
    加载kvm模块
[root@L~]#modprobe kvm
    启动libvirtd
[root@L~]#systemctl start libvirtd.service
[root@L~]#service libvirtd start
Starting libvirtd daemon:                                  [  OK  ]
[root@L~]#ssh -X root@192.168.1.9
[root@Llibvirt]#ll
总用量 48
-rw-r--r--. 1 root root   518 1月   5 03:20 libvirt.conf    
-rw-r--r--. 1 root root 13204 1月   5 03:20 libvirtd.conf   #守护进程的文件
-rw-r--r--. 1 root root  1176 1月   5 03:20 lxc.conf
drwx------. 2 root root  4096 4月  27 16:25 nwfilter
drwx------. 3 root root  4096 4月  27 16:25 qemu
-rw-r--r--. 1 root root 15340 1月   5 03:20 qemu.conf
[root@L~]#virsh iface-bridge wlan0 br0       #一定要注意,附加失败就远程断开了,最好设置个自动重启服务
Created bridge br0 with attached device wlan0
[root@L~]#brctl delbr br0                    #删除桥


    网络虚拟化:

        二层的虚拟网络设备:

            kernel net bridge/brctl

            openvswitch

            

        CentOS 7创建物理桥,使用内核自带的桥接模块实现:

            桥接口配置文件保留地址信息;

                TYPE=Bridge

                Device=BRIDGE_NAME

                

            物理网卡配置文件:

                删除地址、掩码和网关等相关的配置,添加

                BRIDGE=BRIDGE_NAME

                

            重启网络服务即可:

                

        使用qemu-kvm管理vms:

            

Qemu命令:

                处理器模拟器

                仿真各种IO设备

                将仿真设备连接至主机的物理设备

                提供用户接口

            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/imag es/

                            

                    显示选项:提供显示接口

                         -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:以守护进程运行;

                            

#试验:生成虚拟机并完成网络转发模型

[root@L~]#ln -sv /usr/libexec/qemu-kvm /usr/bin/       #想使用,需要添加变量
"/usr/bin/qemu-kvm" -> "/usr/libexec/qemu-kvm”
[root@L~]#vim /etc/qemu-ifup
[root@L~]#bash -n /etc/qemu-ifup 
[root@L~]#chmod u+x /etc/qemu-ifup 

[root@L~]#qemu-kvm -name Cos7 -m 512 -cpu qemu64 -smp 2 -drive file=/app/centos-src/CentOS-7-x86_64-GenericCloud-1802.qcow2,if=virtio,media=disk,format=qcow2 -net nic,macaddr=52:54:00:00:00:00,model=virtio -net tap,script=/etc/qemu-ifup -vnc :0

#上面的就是仅主机模式,如果想与互联网通讯,就打开核心转发功能,添加规则即可
[root@L~]echo 1 > /etc/sys/net/ipv4/ip_forward
#虚拟机内部添加默认网关
#route add default gw 192.168.122.1

#添加 IPtables 规则,构建NAT模型,也可以使用-j —to-source
[root@L~]iptables -t net -A PSOTROUTING -s 192.168.122.0/24 -j MASQUERADE
示例1:(硬盘直接启动)
[root@L~]#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:(通过光盘安装)
[root@L~]#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:

                    有两个功能,1、dns forwarder转发器 2、dns server 服务器

                    Dnsmasq是轻量级的,易于配置DNS转发器和DHCP服务器。它旨在为小型网络提供DNS和(可选)DHCP。 它可以提供不在全球DNS中的本地机器的名称。 DHCP服务器与DNS服务器集成,并允许具有DHCP分配地址的计算机出现在DNS中,并在每个主机或中央配置文件中配置名称。 Dnsmasq支持无盘机器的静态和动态DHCP租赁和BOOTP网络引导。

                        

                    listen-address=192.168.1.132,127.0.0.1   #指定的是要绑定的桥的地址段

                    dhcp-range=192.168.1.50,192.168.1.150,48h   #dns地址池及租约期限

                    dhcp-option=3,192.168.0.1     #3是选项,指定网关地址

#试验:完成dns设置,IP地址自动获取

[root@L~]#yum install dnsmasq
[root@L~]#man dnsmasq
[root@L~]#dnsmasq —-listen-address=10.1.0.1,127.0.0.1 —dhcp-range=10.1.0.100,10.1.0.150,24h —-dhcp-option=3,10.1.0.1


#试验:手动创建物理桥

[root@L~]#cd /etc/sysconfig/network-scripts/
[root@L~]#cp ifcfg-ens33 ifcfg-mybr0

[root@L~]#vim ifcfg-ens33     
#把ip地址及网关等信息删除,添加一条
BRIDGE=mybr0

[root@L~]#vim ifcfg-mybr0   
NAME=mybr0
DEVICE=mybr0
TYPE=Bridge
#其余的地址信息保留即可

[root@L~]#service network restart
#后续再启动的虚拟机,把网络关联到物理桥上,即可完成物理桥连接


  作业:使用kvm搭建LNMP,Nginx连接两个桥,一个物理桥与外部通讯,一个内网桥实现内网通讯,php-fpm及mariadb连接内网桥,最好写成脚本,一键搞定(一个虚拟机加两块网卡只需要-net多几次即可实现,脚本先搞定网络实现及虚拟机启动起来,在使用固定的ip地址,使用ansible往上一推)

                        

virsh命令:

           虚拟机的生成需要依赖于预定义的xml格式的配置文件;其生成工具有两个:virt-manager, virt-install; 

                

           virsh [OPTION]... COMMAND [ARG]..

                

           子命令的分类:

                    Domain Management (help keyword 'domain')

                    Domain Monitoring (help keyword 'monitor')

                    Host and Hypervisor (help keyword 'host')

                    Interface (help keyword 'interface')

                    Networking (help keyword 'network')

                    Network Filter (help keyword 'filter')

                    Snapshot (help keyword 'snapshot')

                    Storage Pool (help keyword 'pool')

                    Storage Volume (help keyword 'volume')

                    

                Domain Management (help keyword 'domain')

                    创建虚拟机:

                        create:从xml格式的配置文件创建并启动虚拟机;(基于虚拟机镜像文件创建虚拟机配置的CPU、内存、用什么IO等)

                        define:从xml格式的配置文件创建虚拟机;(可以定义一个模板,用交互式的形式填写,创建但不启动虚拟机)

                    

                    停止:

                        destroy:强行关机;(相当于拔电源)

                        shutdown:关机;   (正常的关机)

[root@Lqemu]#pwd
/etc/libvirt/qemu
[root@Lqemu]#ls                 #xml文件在这个目录下,就是能被直接识别为虚拟机的
C1.xml  Centos7.xml  networks   #可以直接cp相关文件进行修改,就可以创建新的虚拟机
[root@Lqemu]#virsh create —-console c2.xml   #用create创建的,直接启动,并且连接到控制台
Starting dropbear sshd: OK
  ____               ____  ____
/ __/ __ ____ ____ / __ \/ __/
/ /__ / // __// __// /_/ /\ \ 
\___//_//_/  /_/   \____/___/ 
http://launchpad.net/cirros
login as 'mageedu' user. default password: 'mageedu.com'. use 'sudo' for root.
cirros login:


                    启动:

                        start:启动

                    

                        reboot:重启;

                    

                        undefine:删除虚拟机;

                    

                        Suspend(挂起)/resume(继续):暂停于内存中,或继续运行暂停状态的虚拟机;

                                真正实现的效果:pause/unpause

                    

[root@L~]#virsh suspend C2
域 C2 被挂起
[root@L~]#virsh list
Id    名称                         状态
----------------------------------------------------
2     Centos7                        running
3     C1                             running
4     C2                             暂停
[root@L~]#virsh resume C2
域 C2 被重新恢复


                        save/restore:保存虚拟机的当前状态至文件中,或从指定文件恢复虚拟机;    

                    

[root@L~]#virsh save C2 /app/C2.snap
Domain C2 saved to /app/C2.snap
[root@L~]#virsh list
Id    名称                         状态
----------------------------------------------------
2     Centos7                        running
3     C1                             running
[root@L~]#ll /app/C2.snap
-rw-------. 1 root root 40291928 4月  28 14:48 /app/C2.snap
[root@L~]#virsh restore /app/C2.snap --paused
从 /app/C2.snap 恢复域
[root@L~]#virsh list
Id    名称                         状态
----------------------------------------------------
2     Centos7                        running
3     C1                             running
5     C2                             暂停


                        console:连接至指定domain的控制台;

                    

                    域的设备资源管理:

                        cpu-stats

                        vcpuinfo

                        vcpucount

                        setvcpus

                        vcpupin

                        

                        setmaxmem          #修改最大能修改的内存上线

                        setmem                 #修改内存大小,修改后会触发重启服务

                       

                    磁盘设备的热插拔; 

                        attach-disk           #插入新的硬盘

                        detach-disk          #拔出硬盘

                        domblklist            #查看当前硬盘列表

                    试验:磁盘创建及热插拔

Quem-img create [-f fmt] [-o options] filename [size] 创建磁盘
        -f 指定磁盘的格式  -o 指定一些选项  文件路径及大小
支持的格式有下列:
        Supported formats: raw cow qcow vdi vmdk cloop dmg bochs vpc vvfat qcow2 qed vhdx parallels nbd blkdebug null host_cdrom host_floppy host_device file gluster

[root@Lc1]#qemu-img create -f qcow2 -o ? ./second.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)
Preallocation 是指创建完磁盘后,立即创建出那些文件,off就是不创建,metadate就是磁盘的元数据直接以对象格式存到当前磁盘,falloc先预分配文件,full直接分配真实的存储(性能好),一般使用metadata。

[root@Lc1]#qemu-img create -f qcow2 -o size=20G,preallocation=metadata ./second.img
Formatting './second.img', fmt=qcow2 size=21474836480 encryption=off cluster_size=65536 preallocation='metadata' 

[root@Lc1]#qemu-img info second.img 
image: second.img
file format: qcow2
virtual size: 20G (21474836480 bytes)
disk size: 3.3M
cluster_size: 65536

[root@Lc1]#virsh help attach-disk
attach-disk <domain>哪个虚拟机<source>哪个磁盘镜像文件<target>添加为哪个磁盘设备

[root@Lc1]#virsh attach-disk C1 /home/VMs/c1/second.img vdb
成功附加磁盘
[root@Lc1]#virsh domblklist C1
Target     Source
------------------------------------------------
hda        /home/VMs/c1/c1.img
vdb        /home/VMs/c1/second.img
后续直接分区格式化即可使用
拆除的时候一定要注意没有挂载使用,否则容易导致数据损坏

[root@Lc1]#virsh detach-disk C1 vdb
成功分离磁盘


                网络接口设备的热插拔:

                        attach-interface       #插入新的网络接口

                                type:bridge

                                source:BRIDGE_NAME

                        detach-interface      #拔出网络接口,注意拆除的时候,一定要指明MAC,否则将拆除这个接口上的所有的网卡

                        domiflist                   #网络接口列表

                           

                            注意 :无须事先创建网络接口设备;

                        

[root@Lc1]#virsh attach-interface C1 bridge virbr0
成功附加接口
[root@Lc1]#brctl show
bridge name    bridge id        STP enabled    interfaces
pan0        8000.000000000000    no        
virbr0        8000.5254002ebf66    yes        virbr0-nic
                            vnet0
                            vnet1
                            vnet2
                            vnet3

                            [root@Lc1]#virsh detach-interface C1 bridge --mac 52:54:00:F4:C5:84
成功分离接口


                Domain Monitoring (help keyword 'monitor')

                    domiflist

                    domblklist

                    ...

          

          

        图形管理工具:

            kimchi(泡菜):基于H5研发web GUI; virt-king; 

            OpenStack: IaaS

                OpenStack Dashboard 就是一个web GUI

                nova 是核心组件,Horizon接收到用户的情况,转发给nova,nova-compute通过调度群调到某一台物理机上

                cider-api 提供块级别存储的服务,sahara-all 数据处理,swift分布式文件系统对象存储

                OpenStack Database Service 就是DBaas数据库存储服务,glance-api存放镜像文件的系统

                Neutron-server 是管理虚拟网络的,ceilometer-collector 计量服务(各种计量方式及计算方式)

                ironic-api 可以管理虚拟机及物理服务器的服务,heat-api是OpenStack Orchestration的虚拟机编排服务

                keystone-api 认证服务

            oVirt:红帽主推的服务,虚拟化管理工具,也是一个web GUI工具

            proxmox:不单单是个管理工具,就是一个Linux的发行版。

            

            管理工具栈:https://www.linux-kvm.org/page/Management_Tools

    cirros测试镜像

https://download.cirros-cloud.net/     下载地址

qemu-img info cirros-0.3.0-i386-disk.img     查看cirros镜像信息

mkdir -pv /data/VMs/cirros    创建一个存放镜像的目录

    

    说明: CirrOS(测试镜像)是专门从事云计算的Tiny OS,CirrOS是一个最小的Linux发行版,专为在OpenStack Compute之类的云上用作测试映像而设计。 您可以从CirrOS下载页面以各种格式下载CirrOS映像。 如果您的部署使用QEMU或KVM,我们建议使用qcow2格式的图像。

    图形工具安装

vir-manager    打开图形工具

   

[root@L~]#mkdir /home/VMs/c1 -pv
mkdir: 已创建目录 "/home/VMs"
mkdir: 已创建目录 "/home/VMs/c1"

[root@Lc1]#qemu-img info c1.img 
image: c1.img
file format: qcow2
virtual size: 39M (41126400 bytes)
disk size: 11M
cluster_size: 65536
virsh # list
Id    名称                         状态
----------------------------------------------------
2     Centos7                        running
3     C1                             running
virsh # console C1
连接到域 C1
Escape character is ^]
login as 'mageedu' user. default password: 'mageedu.com'. use 'sudo' for root.
cirros login: mageedu
Password: 
Ctrl + 】就可以切换回来
然后如果在console C1  直接切回去,不需要再登录
virsh # domstate C1            #查看虚拟机C1的状态
 
virsh # domstats C1            #查看虚拟机C1使用的资源情况


磁盘设置

Writethrough 同写,写到内存的时候同时写到磁盘上

Writeback 回写,后续由缓存自动同步到磁盘上 ,建议使用的模式

Directsync 直接同步,属于缓存没有用

Unsafe  不安全模式,只要提交就认为写完成了 ,性能最好的