zoukankan      html  css  js  c++  java
  • 虚拟化KVM应用

    虚拟化的发展历史

    谈虚拟化,不得不从冯诺伊曼体系说起,计算机由CPU(运算器,控制器),主存(RAM),IO(磁盘,网络)级成,现有的各种技术都依托与此体系。
    CPU处理的两种指令:
        特权指令集,只有内核有权限调用
        普通指令集
    CPU操作环:
        环-1:新的CPU用于硬件支持虚拟化,把环0让给虚拟机
        环0:级别最高,内核运行在此级别
        环1:没有用
        环2:没有用
        环3:普通指令,程序运行使用。如果程序需要分配内存,必须通过内核调用环0
    

    虚拟化技术的分类:

    (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, ...
    

    KVM安装和使用

    1. 判断CPU是否支持硬件虚拟化:
    # grep -i -E '(vmx|svm|lm)' /proc/cpuinfo
    	vmx:Intel VT-x
    	svm:AMD AMD-v
    2. 安装
        # yum install libvirt-daemon-kvm qemu-kvm virt-manager libvirt
        # modprobe kvm 
        # systemctl start libvirtd.service
        # virsh iface-bridge INTERFACE BRIDGE_NAME: virsh iface-bridge eth1 br0 || systemctl restart network
        # virt-manager &
    3. 安装虚拟机
        使用cirros-no_cloud-0.3.0-x86_64-disk.img
        # mkdir /data/VMs/c2
        # cp cirros-no_cloud-0.3.0-x86_64-disk.img /data/VMs/c2/c2.img
        # 使用virt-manager图形界面导入上述文件
    4. 启动虚拟机
        # virsh start centos6.9
        # virsh console centos6.9
    

    KVM的管理工具栈:

    qemu:
    	qemu-kvm
    	qemu-img 
    libvirt:
    	GUI:virt-manager
    	CLI:virsh, virt-install
    

    qemu-kvm管理:

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

    qemu-kvm管理实例:

      1. 创建虚拟机
    

      # ln -sv /usr/libexec/qemu-kvm /usr/bin/
    生成第一个VM:
    # qemu-kvm -name c1 -drive file=/data/VMs/c1/c1.img,if=virtio -net nic,macaddr=52:54:00:00:00:01,model=virtio -net tap,script=/root/qemu-ifup -nographic
    生成第二个VM:(注意MAC地址一定要区别于第一个VM)
    # qemu-kvm -name c2 -drive file=/data/VMs/c2/c2.img,if=virtio -net nic,macaddr=52:54:00:00:00:02,model=virtio -net tap,script=/root/qemu-ifup -nographic
    可以看到两个运行的虚拟机:

        同时,在宿主机上,可以看到两个进程,停止虚拟机可以在宿主机里直接kill
    


    2. 结合DHCP,为生成的VM自动分配IP:
    # yum install dnsmasq
    # 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
    # 编辑qemu-ifup-br0
    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
    # qemu-kvm -name c2 -drive file=/data/VMs/c2/c2.img,if=virtio -net nic,macaddr=52:54:00:00:00:02,model=virtio -net tap,script=/root/qemu-ifup -nographic
    # 此时,c2虚拟机的IP自动分配为10.1.0.101
    

    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格式的配置文件创建并启动虚拟机;
          define:从xml格式的配置文件创建虚拟机;
    				
        停止:
                destroy:强行关机;
                shutdown:关机;
    				
        启动:
               start:启动
      reboot:重启;
     undefine:删除虚拟机;
        suspend/resume:暂停于内存中,或继续运行暂停状态的虚拟机;
            真正实现的效果:pause/unpause
            save/restore:保存虚拟机的当前状态至文件中,或从指定文件恢复虚拟机;
    				
    console:连接至指定domain的控制台;
    				
    域的设备资源管理:
         cpu-stats
         vcpuinfo
         vcpucount
         setvcpus
         vcpupin
         setmaxmem
         setmem
    attach-disk/detach-disk/domblklist:磁盘设备的热插拔;
    attach-interface/detach-interface/domiflist:网络接口设备的热插拔;
        type:bridge
        source:BRIDGE_NAME
        注意 :无须事先创建网络接口设备;
    

    管理实例(两者结合)

        1.设备热管理硬盘
         # qemu-img create -f qcow2 -o ? ./second.img
         # qemu-img create -f qcow2 -o size=5G,preallocation=metadata second.img
         # qemu-img info second.img
         # virsh attach-disk centos6.9 /root/c1/second.img vdb
        2. 设备热管理加网卡:
         # virsh help attach-interface
         # virsh attach-interface centos6.9 bridge virbr0
         # virsh  detach-interface centos6,9 brideg virbr0 --mac 52:54:00:91:23:C9(如果不指定网卡,会把桥全部删除)
    

    网络虚拟化:

    二层的虚拟网络设备:
    kernel net bridge/brctl:实现软交换机管理  TCP/IP四层以下都在内核实现
    openvswitch:功能强大,实现软交换机:支持VLAN, 支持VxLAN,支持GRE,支持流控flow control,(OpenStack和K8s都支持)
    		
    CentOS 7创建物理桥,使用内核自带的桥接模块实现:
    桥接口配置文件保留地址信息;
    	TYPE=Bridge
    	Device=BRIDGE_NAME
    
    物理网卡配置文件:
        删除地址、掩码和网关等相关的配置,添加
        BRIDGE=BRIDGE_NAME				
        重启网络服务即可:
    

    网络虚拟化实例1

    # yum install bridge-utils
    # brctl addbr mybr0
    # ip link set mybr0 up
    # ip addr add 10.1.0.1/16 dev mybr0(关联到物理eth网卡,此时,物理网卡角色为交换机)
    

    网络虚拟话实例2(配置NAT,实现虚拟机可以和宿主机之外的主机通信)

    1. 如果mybr0没有配置IP 10.1.0.1,两台VM可以通信,但ping不通10.1.0.1,隔离网络
    2. 在两台VM上配置网关: route add default gw 10.1.0.1
    3. 同时启动宿主机的IP转发echo 1 >/proc/sys/net/ipv4/ip_forward
    4. 在宿主机上加IPTABLE:
        iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -j MASQUERADE
    5. 此时,VM可以ping通宿主机之外的主机
    

    KVM图形化管理工具:

    KVM支持的图莆化管理工具:https://www.linux-kvm.org/page/Management_Tools
    实际工作中用来管理多个虚拟机,用如下的工具来实现:
    1. 轻量级:kimchi
    2. 重量级:OpenStack: IaaS 百台主机上再使用。核心是nova-api
    3. ovirt 红帽提供,跨主机with web-GUI
    4. proxmox不仅是图形管理,还是linux发形版。
  • 相关阅读:
    JS和Jquery获取this
    写SQL经验积累2
    转载学习
    java开发3个月总结
    学习规划
    Spring Boot详解
    webSocketDemo
    spring boot中 redis配置类(4.0)
    c语言操作字符串
    聊聊面试常问的HashMap中红黑树
  • 原文地址:https://www.cnblogs.com/liangjindong/p/9378443.html
Copyright © 2011-2022 走看看