kvm 虚拟化技术_kvm虚拟化技术之使用qemu-kvm创建和管理虚拟机 - CSDN
  • KVM虚拟化技术

    千次阅读 2017-01-02 20:16:17
    1、KVM发展历史 Kernel Virtual Machine,内核虚拟机。 最初由一个以色列的公司在2006年开发的一个开源项目,这个公司已经于2008年被RedHat所收购。 在RHEL5时代,Xen是RedHat公司集成和支持的虚拟机,而在2010年...
    
    
    1、KVM发展历史
    Kernel Virtual Machine,内核虚拟机。
    最初由一个以色列的公司在2006年开发的一个开源项目,这个公司已经于2008年被RedHat所收购。
    在RHEL5时代,Xen是RedHat公司集成和支持的虚拟机,而在2010年发布RHEL6开始至今,RedHat 公司使用KVM作为默认集成和支持的虚拟机工具。

    目前的虚拟机技术阵营分成两个阵营,一类是以Xen,ESX/ESXi,Hyper-V为代表的微内核架构,系统上电之后首先加载的是虚拟机监控程序,虚拟机监控程序直接负责系统的初始化和物理资源的管理,创建、调度和管理虚拟机;另一类是以KVM,VMware Workstation, VirtualBox为代表,系统上电之后仍然首先加载运行的是一般意义上的操作系统,虚拟机监控程序只是这个操作系统之上的一个应用功能扩展。

    • KVM:是Linux完全原生的全虚拟化解决方案,就是在Linux内核中添加的一个虚拟机模块,直接使用Linux内核中已经完善的进程调度、内存管理与硬件设备交互等部分,使Linux成为一个可以支持运行虚拟机的Hypervisor。因此,KVM并不是一个完善的模拟器,而只是一个提供虚拟化功能的内核插件,它的具体的模拟器工作是借助工具(QEMU)来完成。
    • Xen:同时支持虚拟化与半虚拟化,需要在Linux系统内核之上再运行一个由Xen提供的微内核,由微内核控制虚拟化计算和内存资源的分配与使用 。因为诞生时间很早,那时硬件和系统内核层面根本没有支持虚拟化的,所以Xen被设计为不依赖也不使用硬件的虚拟化支持,通过对操作系统进行显式地修改(“移植”)以使其可以在Xen上作为虚机运行。

    KVM需要CPU中虚拟化功能的支持,只可在具有虚拟化支持的CPU上运行,即具有VT功能的Intel CPU和具有AMD-V功能的AMD CPU。它包含一个为处理器提供底层虚拟化可加载的核心模块KVM.ko(KVM-intel.ko或KVM-AMD.ko)。KVM还需要一个经过修改的QEMU软件(qemu-KVM),作为虚拟机上层控制和界面。

    KVM从Linux 2.6.20开始就已经被集成进入了Linux内核,可以说是与Linux内核一直在共同发展。而另一个明显有内核”不友好、不兼容“特点的Xen虚拟化方案一直无法得到Linux内核维护小组的支持。



    2、KVM的架构原理

    KVM是一个可以按需加载运行的Linux内核模块,仅支持硬件虚拟化,且KVM本身不做任何设备模拟,它是使用QEMU程序通过/dev/kvm接口进行I/O设备模拟。
    KVM虚拟机的创建和运行就是一个用户空间的应用程序(QEMU)和KVM模块相互配合的过程。

    QEMU,是一个独立发展的著名的开源虚拟机软件,并不是KVM的一部分。在QEMU中已经提供了虚拟机所需的整套技术实现,包括处理器虚拟化、内存虚拟化以及各类虚拟设备的模拟。但因为QEMU是一种纯软件解决方案,所以性能低下。

    KVM定制了一个适合自己使用的QEMU版本,将用户空间程序负责的工作,例如虚拟机的创建、配置,虚拟机运行所依赖的虚拟设备,虚拟机运行时的用户操作环境和交互,甚至于虚机的动态迁移技术等,都交给QEMU所实现的。KVM自己仅作硬件虚拟化功能的实现。

    命令方式创建KVM虚拟机
    #virt-install --name centos6-test1 --ram 2048 --vcpus=2 --disk path=/data/images/centos6-test1.img,size=100 --network bridge=br0,model=virtio
     --accelerate --force --graphics vnc --autostart --noautoconsole --os-type=linux --os-variant=rhel6 --cdrom /root/CentOS-6.7-x86_64-minimal.iso
    
    #virt-install -n win2008s -r 4096 --vcpus=2 --os-type=windows --accelerate -c /data/iso/Win2008R2Server_64bit.iso
     --disk path=/data/iso/virtio-win-0.1-100.iso,device=cdrom --disk path=/data/images/win2008x64.img,bus=virtio,size=60
     --network bridge=br0 --vnc --force --autostart

    每个kvm虚拟机都是宿主机上的一个qemu进程
    [bjxtb@MJQ_130_3 ~]$ ps -ef|grep kvm
    root       2692      2  0  2016 ?        00:00:00 [kvm-irqfd-clean]
    qemu      29478      1 99  2016 ?        479-15:25:54 /usr/libexec/qemu-kvm -name vm2 -S -M rhel6.6.0 -enable-kvm -m 48000
     -realtime mlock=off -smp 12,sockets=12,cores=1,threads=1 -uuid 61b7963d-477e-56b4-341a-0b86344cc04f -nodefconfig -nodefaults
     -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/vm2.monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=control
     -rtc base=utc -no-shutdown -device ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x5.0x7 -device ich9-usb-uhci1,masterbus=usb.0,firstport=0,
    bus=pci.0,multifunction=on,addr=0x5 -device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x5.0x1 -device ich9-usb-uhci3
    ,masterbus=usb.0,firstport=4,bus=pci.0,addr=0x5.0x2 -drive file=/var/lib/libvirt/images/vm2.img,if=none,id=drive-ide0-0-0,format=raw
    ,cache=none -device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 -netdev tap,fd=19,id=hostnet0 -device rtl8139,
    netdev=hostnet0,id=net0,mac=52:54:00:24:8a:8c,bus=pci.0,addr=0x3 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,
    id=serial0 -vnc 127.0.0.1:1 -k en-us -vga cirrus -device intel-hda,id=sound0,bus=pci.0,addr=0x4 -device hda-duplex,id=sound0-codec0
    ,bus=sound0.0,cad=0 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x6 -msg timestamp=on
    root      29493      2  0  2016 ?        00:00:00 [kvm-pit-wq]
    qemu      52222      1 14  2016 ?        34-07:57:55 /usr/libexec/qemu-kvm -name s3-vm1 -S -M rhel6.6.0 -enable-kvm -m 8192 -realtime mlock=off -smp 4,
    sockets=4,cores=1,threads=1 -uuid a147b00b-cf4c-45e8-737b-5ad1066dc31b -nodefconfig -nodefaults -chardev socket,id=charmonitor,
    path=/var/lib/libvirt/qemu/s3-vm1.monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc -no-shutdown 
    -device ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x5.0x7 -device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,
    addr=0x5 -device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x5.0x1 -device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,
    addr=0x5.0x2 -drive file=/var/lib/libvirt/images/vm1.img,if=none,id=drive-ide0-0-0,format=raw,cache=none -device ide-drive,bus=ide.0,unit=0,
    drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 -netdev tap,fd=23,id=hostnet0 -device rtl8139,netdev=hostnet0,id=net0,mac=52:54:00:62:f9:71,
    bus=pci.0,addr=0x3 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -vnc 127.0.0.1:0 -k en-us -vga cirrus 
    -device intel-hda,id=sound0,bus=pci.0,addr=0x4 -device hda-duplex,id=sound0-codec0,bus=sound0.0,cad=0 -device virtio-balloon-pci,
    id=balloon0,bus=pci.0,addr=0x6 -msg timestamp=on


    3、KVM的网络配置
    3.1 网桥的使用
    配置:
    virsh iface-bridge eth0 br0
    more ifcfg-br0
    DEVICE=br0
    ONBOOT=yes
    BOOTPROTO=static
    TYPE="Bridge"
    IPADDR="172.17.90.15"
    NETMASK="255.255.255.0"
    GATEWAY="172.17.90.1"
    DNS1="114.114.114.114"
    STP="on"    
    DELAY="0"

    调优:
    STP="on"     #打开生成树协议,避免出现环路
    service NetworkManager stop
    chkconfig NetworkManager off   #在RHEL/CENTOS系统中,NetworkManager服务无法管理网桥的配置,且会网络配置与生效产生干扰。

    查看网桥:
    $ brctl show
    bridge name    bridge id        STP enabled    interfaces
    br0        8000.2047478aa28c    yes             bond0
                                                    vnet0
                                                    vnet1
                                                    vnet2
    virbr0        8000.525400652d4c    yes        virbr0-nic


    网桥virbr0是用于NAT网络模式使用的网桥

    $ ifconfig virbr0
    virbr0    Link encap:Ethernet  HWaddr 52:54:00:65:2D:4C 
              inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0
              RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
    
    $ ps -ef|grep dns
    nobody     2396      1  0  2016 ?        00:00:00 /usr/sbin/dnsmasq --strict-order --pid-file=/var/run/libvirt/network/default.pid 
    --conf-file= --except-interface lo --bind-interfaces --listen-address 192.168.122.1 --dhcp-range 192.168.122.2,192.168.122.254 
    --dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases --dhcp-lease-max=253 --dhcp-no-override 
    --dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile --addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts
    
    # iptables -t nat -L -n
    Chain PREROUTING (policy ACCEPT)
    target     prot opt source               destination         
    Chain POSTROUTING (policy ACCEPT)
    target     prot opt source               destination         
    MASQUERADE  tcp  --  192.168.122.0/24    !192.168.122.0/24    masq ports: 1024-65535
    MASQUERADE  udp  --  192.168.122.0/24    !192.168.122.0/24    masq ports: 1024-65535
    MASQUERADE  all  --  192.168.122.0/24    !192.168.122.0/24   
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination

    3.2 使用virtio-net

    Virtio半虚拟化驱动的方式,可以获得很好的I/O性能,其性能几乎可以达到和native(即:非虚拟化环境中的原生系统)差不多的I/O性能。所以,在使用KVM之时,如果宿主机内核和客户机都支持virtio的情况下,一般推荐使用virtio达到更好的性能。

    其中前端驱动(frondend,如virtio-blk、virtio-net等)是在客户机中存在的驱动程序模块,而后端处理程序(backend)是在QEMU中实现的。在这前后端驱动之间,还定义了两层来支持客户机与QEMU之间的通信。其中,“virtio”这一层是虚拟队列接口,它在概念上将前端驱动程序附加到后端处理程序。一个前端驱动程序可以使用0个或多个队列,具体数量取决于需求。例如,virtio-net网络驱动程序使用两个虚拟队列(一个用于接收,另一个用于发送),而virtio-blk块驱动程序仅使用一个虚拟队列。
    虚拟队列实际上被实现为跨越客户机操作系统和hypervisor的衔接点,但它可以通过任意方式实现,前提是客户机操作系统和virtio后端程序都遵循一定的标准,以相互匹配的方式实现它。而virtio-ring实现了环形缓冲区(ring buffer),用于保存前端驱动和后端处理程序执行的信息。


    3.3 关于vhost_net
    这是宿主机中默认使用的虚拟机网络后端处理程序。在较新的Linux内核中已经集成作为一个驱动模块。当为KVM虚拟机选用virtio网络驱动模式时,后端即默认使用vhost_net。
    $ lsmod|grep vhost _net
    vhost_net              30520  3
    
    $ ps -ef|grep vhost
    bjxtb      3805   3346  0 16:32 pts/3    00:00:00 grep vhost
    qemu       6508      1 99  2015 ?        578-08:41:17 /usr/libexec/qemu-kvm -name gate1-24 -S -M rhel6.6.0 -enable-kvm -m 32768 -realtime mlock=off
     -smp 12,sockets=12,cores=1,threads=1 -uuid bad75b87-6984-adb3-8946-db9f156afd03 -nodefconfig -nodefaults -chardev socket,id=charmonitor
    ,path=/var/lib/libvirt/qemu/gate1-24.monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc -no-shutdown 
    -device ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x5.0x7 -device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x5
     -device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x5.0x1 -device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0
    ,addr=0x5.0x2 -drive file=/var/lib/libvirt/images/gate1-24.img,if=none,id=drive-virtio-disk0,format=raw,cache=none -device virtio-blk-pci,
    scsi=off,bus=pci.0,addr=0x6,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1 -drive file=/var/lib/libvirt/images/gate1-24-1.img,
    if=none,id=drive-ide0-0-0,format=raw,cache=none -device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0
     -drive file=/isotool/CentOS-6.5-x86_64-minimal.iso,if=none,media=cdrom,id=drive-ide0-1-0,readonly=on,format=raw -device ide-drive,bus=ide.1,unit=0,
    drive=drive-ide0-1-0,id=ide0-1-0 -netdev tap,fd=22,id=hostnet0,vhost=on,vhostfd=23 -device virtio-net-pci,netdev=hostnet0,id=net0
    ,mac=52:54:00:e5:02:c3,bus=pci.0,addr=0x3 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -device usb-tablet,
    id=input0 -vnc 127.0.0.1:0 -k en-us -vga cirrus -device intel-hda,id=sound0,bus=pci.0,addr=0x4 -device hda-duplex,id=sound0-codec0,bus=sound0.0,
    cad=0 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x7 -msg timestamp=on
    root       6529      2 99  2015 ?        213557-03:59:26 [vhost-6508]

    3.4 宿主机中的TSO、GSO配置
    TSO,GSO是Linux中结合硬件实现的延迟大数据包拆分的技术,将原来由cpu负责的数据包拆分工作延迟至网卡上去完成,可以提升处理效率。
    在KVM virtio网络虚拟化的实现中,有相关的案例中发现开启TSO,GSO功能后,反而会导致处理性能的下降。所以在这种情况下,可以人为得关闭这两个功能。
    查看相关配置参数:
    ethtool -k eth0
    关闭TSO,GSO:
    ethtool -K em1 gso off
    ethtool -K em1 tso off


    4、KVM性能
    同等资源条件的物理机和KVM虚拟机,虚机的资源利用率相当于物理机的:
    • CPU  97%
    • Memory  95%
    • Network  除非是驱动设置有误,否则几乎相当,但相对于物理网卡会增加0.1ms的延时
    • disk  虚拟机的磁盘读写性能普遍上要低于物理机(数据块较小时差别明显,但当block size>1M时几乎无差别), 其中IDE驱动方式的性能又普遍低于virtio方式。如果采用磁盘的半虚拟化实现技术,则损失灵活性的同时,磁盘I/O性能会与物理机相当。                                                                                                                                                                                                           

    5、centos6的KVM虚拟化安装方法
    宿主机的系统安装要求:最小化安装,并使用yum -y update升级至centos6.8。

    #安装KVM相关的依赖包和工具包
    yum -y groupinstall  "Desktop" "X Window System"  chinese-support 'Virtualization' 'Virtualization Client' 'Virtualization Platform'
    yum -y install kvm virt-viewer virt-manager bridge-utils tunctl libvirt libvirt-python python-virtinst

    #查看和验证安装结果
    service libvirtd status
    lsmod |grep kvm

    #使用xshell登录并验证KVM服务,需要能正常打开图形化的管理窗口
    virt-manager

    创建桥接网卡:
    virsh iface-bridge bond0 br0
    virsh iface-bridge bond1 br1

    6、centos7的KVM虚拟化安装方法
    宿主机的系统安装要求
    centos7系统的KVM宿主机安装的软件包有以下:
    @^gnome-desktop-environment
    @base
    @core
    @directory-client
    @fonts
    @gnome-desktop
    @guest-agents
    @guest-desktop-agents
    请确认在安装的软件包中包含了以上内容。

    #停用系统可能自带和启用的NetworkManager
    systemctl stop NetworkManager
    systemctl disable NetworkManager

    #安装kvm tools相关的工具包
    yum -y groupinstall  'Virtualization' 'Virtualization Client' 'Virtualization Platform'

    #调整centos7上ssh服务端口,设置为仅监听ipv4地址。否则会无法打开virt-manager图形窗口。
    sed -i 's/#AddressFamily any/AddressFamily inet/g' /etc/ssh/sshd_config
    systemctl restart sshd

    #使用xshell登录并验证KVM服务,需要能正常打开图形化的管理窗口
    virt-manager













    展开全文
  • Linux KVM 虚拟化技术

    千次阅读 2018-09-21 18:56:32
    一 、 KVM 介绍 ; KVM 全称是 基于内核的虚拟机(Kernel-based Virtual Machine),它是Linux 的一个内核模块,该内核模块使得 Linux 变成了一个 Hypervisor:  ① 、它由 Quramnet 开发,该公司于 2008年被 Red...

    一  、 KVM 介绍 ;

    KVM 全称是 基于内核的虚拟机(Kernel-based Virtual Machine),它是Linux 的一个内核模块,该内核模块使得 Linux 变成了一个 Hypervisor:
     ① 、它由 Quramnet 开发,该公司于 2008年被 Red Hat 收购。
     ②、它支持 x86 (32 and 64 位), s390, Powerpc 等 CPU。
     ③ 、它从 Linux 2.6.20 起就作为一模块被包含在 Linux 内核中。
     ④ 、它需要支持虚拟化扩展的 CPU。
     ⑥ 、它是完全开源的 

     

    二 、KVM 架构 ;

     KVM 的架构非常简单,KVM 就是一个内核模块,用户空间通过QEMU模拟硬件提供给虚拟机使用,一台虚拟机就是一个普通的Linux 进程,通过对这个进程的管理就可以完成对虚拟机的管理。

    KVM 是基于虚拟化扩展(Intel VT 或者 AMD-V)的 X86 硬件的开源的 Linux 原生的全虚拟化解决方案,KVM 中,虚拟机被实现为常规的 Linux 进程,由标准 Linux 调度程序进行调度;虚机的每个虚拟 CPU 被实现为一个常规的 Linux 线程。这使得 KMV 能够使用 Linux 内核的已有功能。

     但是,KVM 本身不执行任何硬件模拟,需要用户空间程序通过 /dev/kvm 接口设置一个客户机虚拟服务器的地址空间,向它提供模拟 I/O,并将它的视频显示映射回宿主的显示屏。目前这个应用程序是 QEMU。

    Guest:客户机系统,包括CPU(vCPU)、内存、驱动(Console、网卡、I/O 设备驱动等),被 KVM 置于一种受限制的 CPU 模式下运行。
    KVM:运行在内核空间,提供 CPU 和内存的虚级化,以及客户机的 I/O 拦截。Guest 的 I/O 被 KVM 拦截后,交给 QEMU 处理。
    QEMU:修改过的被 KVM 虚机使用的 QEMU 代码,运行在用户空间,提供硬件 I/O 虚拟化,通过 IOCTL /dev/kvm 设备和 KVM 交互。

     

    注意 :KVM  公司使用场景 ;

    一般是底层采用 KVM 上层采用 OpenStack ,通过OpenStack 来管理 KVM 的  ;

     

    三 、 KVM 的功能列表  ;
    KVM 所支持的功能包括:
     ① 、支持 CPU 和 memory 超分(Overcommit)
     ② 、支持半虚拟化 I/O (virtio)
     ③ 、支持热插拔 (cpu,块设备、网络设备等)
     ④ 、支持对称多处理(Symmetric Multi-Processing,缩写为 SMP )
     ⑤ 、支持实时迁移(Live Migration)
     ⑥ 、支持 PCI 设备直接分配和 单根 I/O 虚拟化 (SR-IOV)
     ⑦ 、支持 内核同页合并 (KSM )
     ⑧ 、支持 NUMA (Non-Uniform Memory Access,非一致存储访问结构 )

     

    四 、 安装部署 KVM  ;

    安装之前需要确保开启了  BIOS  此功能 ;

    4.1 、确保把 disable  改成 enable 

    4.2 、  配置内存不要少于3G ,配置虚拟机支持KVM虚拟化  ;

     

    4.3  、  基础环境检查 ;

    [root@kvm ~]# cat /etc/redhat-release 
    CentOS Linux release 7.4.1708 (Core) 
    [root@kvm ~]# uname -r
    3.10.0-693.el7.x86_64
    [root@kvm ~]# getenforce 
    Disabled
    [root@kvm ~]# systemctl status firewalld.service 
    ● firewalld.service - firewalld - dynamic firewall daemon
       Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
       Active: inactive (dead)
         Docs: man:firewalld(1)
    [root@kvm ~]# hostname -I
    10.0.0.200 172.16.1.200 
    [root@kvm ~]# 
     

    4.4 、KVM 检查,其实KVM已经内置到了centos7 的内核中 ;

    [root@kvm ~]# lsmod |grep kvm
    kvm_intel             170086  0 
    kvm                   566340  1 kvm_intel
    irqbypass              13503  1 kvm
    [root@kvm ~]# 
     

    [root@kvm ~]# grep -Eo '(vmx|svm)' /proc/cpuinfo
    vmx                                                  ---->>  这里需要保证 必须要有一个 vmx 一个vmx 表示一个 cpu  也就是一核的 两个表示是两核
    [root@kvm ~]# 

     

    五 、安装管理kvm 的命令 ;

    [root@kvm ~]# yum -y install qemu-kvm qemu-kvm-tools virt-manager libvirt virt-install 

    查看已经安装的软件包 ;

    [root@kvm ~]# rpm -qa|grep -E 'qemu|libvirt|virt'

    virt-what-1.13-6.el7.x86_64

    libvirt-daemon-driver-storage-2.0.0-10.el7_3.9.x86_64

    libvirt-daemon-config-network-2.0.0-10.el7_3.9.x86_64

    libvirt-daemon-driver-nodedev-2.0.0-10.el7_3.9.x86_64

    libvirt-2.0.0-10.el7_3.9.x86_64

    ipxe-roms-qemu-20160127-5.git6366fa7a.el7.noarch

    qemu-kvm-common-1.5.3-126.el7_3.10.x86_64

    libvirt-client-2.0.0-10.el7_3.9.x86_64

    libvirt-daemon-driver-network-2.0.0-10.el7_3.9.x86_64

    libvirt-daemon-driver-nwfilter-2.0.0-10.el7_3.9.x86_64

    libvirt-daemon-driver-qemu-2.0.0-10.el7_3.9.x86_64

    libvirt-daemon-driver-lxc-2.0.0-10.el7_3.9.x86_64

    libvirt-daemon-driver-interface-2.0.0-10.el7_3.9.x86_64

    libvirt-glib-0.2.3-1.el7.x86_64

    virt-manager-common-1.4.0-2.el7.noarch

    qemu-kvm-1.5.3-126.el7_3.10.x86_64

    virt-manager-1.4.0-2.el7.noarch

    qemu-img-1.5.3-126.el7_3.10.x86_64

    libvirt-daemon-2.0.0-10.el7_3.9.x86_64

    libvirt-daemon-config-nwfilter-2.0.0-10.el7_3.9.x86_64

    libvirt-daemon-driver-secret-2.0.0-10.el7_3.9.x86_64

    libvirt-python-2.0.0-2.el7.x86_64

    virt-install-1.4.0-2.el7.noarch

    qemu-kvm-tools-1.5.3-126.el7_3.10.x86_64

    [root@localhost ~]#

     

    ===========================================================

    安装包详解;

    python-virtinst-0.600.0-29.el6.noarch          # 一套Python的虚拟机安装工具

    gpxe-roms-qemu-0.9.7-6.14.el6.noarch       # 虚拟机iPXE的启动固件,支持虚拟机从网络启动

    virt-manager-0.9.0-29.el6.x86_64                # 基于Libvirt的图像化虚拟机管理软件,需要图形界面操作系统

    qemu-img-0.12.1.2-2.479.el6.x86_64           # 用于操作虚拟机硬盘镜像的创建、查看和格式转化

    libvirt-python-0.10.2-54.el6.x86_64              # libvirt为Python提供的API

    qemu-kvm-0.12.1.2-2.479.el6.x86_64          # KVM在用户空间运行的程序

    qemu-kvm-tools-0.12.1.2-2.479.el6.x86_64

    libvirt-0.10.2-54.el6.x86_64                         # 用于管理虚拟机,它提供了一套虚拟机操作API

    libvirt-client-0.10.2-54.el6.x86_64           # Libvirt的客户端,最重要的功能之一就是就在宿主机关机时可以通知虚拟机也关机,使虚拟机系统                                                                      正常关机,而不是被强制关机,造成数据丢失

    virt-top-1.0.4-3.15.el6.x86_64             # 类似于top命令,查看虚拟机的资源使用情况

    virt-what-1.11-1.2.el6.x86_64              # 在虚拟机内部执行,查看虚拟机运行的虚拟化平台

    virt-viewer-0.5.6-8.el6.x86_64             # 显示虚拟机的控制台console

     

    5.1  、 启动  libvirtd 服务  ; 

    [root@kvm ~]# systemctl start libvirtd.service                --->>  启动 libvirtd 服务会出现 3 4 网卡信息 
    [root@kvm ~]# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether 00:0c:29:ed:fb:50 brd ff:ff:ff:ff:ff:ff
        inet 10.0.0.200/24 brd 10.0.0.255 scope global eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::20c:29ff:feed:fb50/64 scope link 
           valid_lft forever preferred_lft forever
    3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN 
        link/ether 52:54:00:86:12:85 brd ff:ff:ff:ff:ff:ff
        inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
           valid_lft forever preferred_lft forever
    4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 500
        link/ether 52:54:00:86:12:85 brd ff:ff:ff:ff:ff:ff

    [root@kvm ~]# 

    [root@kvm ~]# systemctl status libvirtd.service              --->>  查看服务状态   ;
    ● libvirtd.service - Virtualization daemon
       Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
       Active: active (running) since Fri 2018-09-21 21:29:26 CST; 1min 23s ago        -->>  这里是绿色的表示启动成功 ;
         Docs: man:libvirtd(8)
               https://libvirt.org
     Main PID: 18713 (libvirtd)
       CGroup: /system.slice/libvirtd.service
               ├─18713 /usr/sbin/libvirtd
               ├─18834 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dh...
               └─18835 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dh...

     

    六  、  开始创建虚拟机  ;

    6.1 、创建虚拟硬盘,以后的数据放在哪里  ;

    [root@kvm ~]# mkdir -p /application/kvm_data
    [root@kvm ~]# cd /application/kvm_data
    [root@kvm kvm_data]# qemu-img create -f qcow2 /application/kvm_data/moban.qcow2 10G
    [root@kvm kvm_data]# ll -h
    total 196K
    -rw-r--r-- 1 root root 193K Sep 21 21:35 moban.qcow2
     

    create          --->>  创建  ;
    -f                 --->> 指定磁盘格式  ;
    moban.qcow2       --->>  虚拟磁盘文件名称     大小为 10G   ;


    6.2  、查看虚拟磁盘的详细信息 ;

    [root@kvm kvm_data]# qemu-img info moban.qcow2 
    image: moban.qcow2
    file format: qcow2
    virtual size: 10G (10737418240 bytes)            ---->>   实际大小 
    disk size: 196K                                                 ---->>  使用中的大小
    cluster_size: 65536
    Format specific information:
        compat: 1.1
        lazy refcounts: false
    [root@kvm kvm_data]# 

     

    6.3   安装虚拟机( 挂载光盘 ) ;

     

    6.4  、创建 挂目录 ;

    [root@kvm kvm_data]# mkdir -p /application/tools
    [root@kvm kvm_data]# cd /application/tools
    [root@kvm kvm_data]#  dd if=/dev/sr0 of=/application/tools/CentOS7_2.iso        --- >> 挂载镜像
    [root@kvm tools]# ll -h
    total 4.1G
    -rw-r--r-- 1 root root 4.1G Sep 21 22:00 CentOS7_2.iso
    [root@kvm tools]# 
     

    安装 KVM 图形界面 ;(注意 ; 这里需要一个  VNC 的远程连接软件 )

    virt-install --virt-type=kvm --name=c72-moban --vcpus=1 -r 1024 -c /application/tools/CentOS7_2.iso --network network=default --graphics vnc,listen=0.0.0.0--noautoconsole --os-type=linux --os-variant=rhel7 --disk 
    path=/application/kvm_data/moban.qcow2,size=10,format=qcow2

    参数注解 ;

    --virt-type=kvm              --->>  指定 kvm 的虚拟化来安装虚拟机  ;

    --name=c72-moban       --->>  指定虚拟机的名称  ;

    --vcpus=1                      --->>  指定cpu 的核数

    -r 1024                         --->>  指定的是内存 1024  1G 这里最少给1G 少于1G 是看不到图形的 ;

    -c                                  --->> 指定了安装镜像的路径  ;

    network                         --->> 指定了网络类型   

    graphics                        --->> 指定图形化安装 指定了使用 vnc  ; 

    --os-type=linux              --->>  指定linux 系统  ;

    --os-variant=rhel7          --->> 指定系统是红帽 7 

    --disk path                      --->> 指定了磁盘的系统文件 ;

    安装第2台虚拟机需要改动的2 个地方  ;

     

     

    [root@kvm kvm_data]# virt-install --virt-type=kvm --name=c72-moban --vcpus=1 -r 1024 -c /application/tools/CentOS7_2.iso --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole --os-type=linux --os-variant=rhel7 --disk path=/application/kvm_data/moban.qcow2,size=10,format=qcow2

     

    Starting install...                                             ------->>  执行以上命令结束之后,到 vnc 界面点击确认确保是可以看到安装页面的表示成功 ;
    Domain installation still in progress. You can reconnect to 
    the console to complete the installation process.
    [root@kvm kvm_data]# 
     

    之后就是安装系统的界面  。。。。。。。。。。。。。。。。。

     

    VNC  的端口是 5900 

     

     

    七  、  命令行中查看和管理虚拟机的命令 ;

    [root@kvm kvm_data]# virsh list --all               ---->>  查看正在运行的虚拟机,虚拟机列表
     Id    Name                           State
    ----------------------------------------------------
     1     c72-moban                      running
     

    生成kvm虚拟机: virt-install

    查看在运行的虚拟机: virsh list

    查看所有虚拟机: virsh list --all

    查看kvm虚拟机配置文件: virsh dumpxml name

    启动kvm虚拟机: virsh start name

    正常关机:virsh shutdown name

    非正常关机(相当于物理机直接拔掉电源):virsh destroy name

    删除:virsh undefine name(彻底删除,找不回来了,如果想找回来,需要备份/etc/libvirt/qemu的xml文件)

    根据配置文件定义虚拟机:virsh define file-name.xml

    挂起,终止: virsh suspend name

    恢复挂起状态:  virsh resume name

     

    这两个文件最好长备份一下  ;

    KVM  虚拟机在宿主机就是一个进程 

    当启动第一个虚拟机是用的默认的端口 5900 , 第二个是 5901  依次类推,所以在启动第二台的时候需要加上端口号 

    磁盘文件格式 ;

     

    八 、虚拟机克隆  ;

    8.1    确保虚拟机是关闭状态 

    [root@kvm kvm_data]# virsh shutdown c72-moban    --->>  关闭c72-moban 虚拟机

    [root@kvm kvm_data]# virsh list --all
     Id    Name                           State
    ----------------------------------------------------
     -     c72-moban                      shut off

     

    8.2  、 克隆 

    [root@kvm kvm_data]# ls
    moban.qcow2
    [root@kvm kvm_data]# cp moban.qcow2 clone.qcow2
    [root@kvm kvm_data]# ll -h
    total 2.1G
    -rw-r--r-- 1 root root 1.1G Sep 22 02:25 clone.qcow2
    -rw-r--r-- 1 root root 1.1G Sep 22 02:11 moban.qcow2
    [root@kvm kvm_data]# pwd
    /application/kvm_data
    [root@kvm kvm_data]# 

    root@kvm kvm_data]# virsh dumpxml c72-moban >/tmp/moban.xml       --->>  导出模板文件 ;

    [root@kvm kvm_data]# cp /tmp/moban.xml{,.ori}         --->>  备份模板文件 ;

     

    修改配置文件 ;

    uuid  和 mac   随便改几个数字即可,只要保证不一样就行 ;

     

    现在娱有了 虚拟机的新的磁盘文件,需要导入了 ;

    [root@kvm tmp]# virsh define moban.xml           --->>  导入文件 
    Domain c72-clone defined from moban.xml

    [root@kvm tmp]# 

     

    [root@kvm tmp]# virsh list --all
     Id    Name                           State
    ----------------------------------------------------
     -     c72-clone                      shut off
     -     c72-moban                      shut off

     

    [root@kvm tmp]# virsh start c72-clone            --->>   启动这个虚拟机 
    Domain c72-clone started

    [root@kvm tmp]# virsh list --all
     Id    Name                           State
    ----------------------------------------------------
     2     c72-clone                      running
     -     c72-moban                      shut off

    [root@kvm tmp]# 
     

     

    展开全文
  • KVM虚拟化技术实践

    万次阅读 2017-02-01 16:06:45
    今天分享的文章是关于云计算中的kvm虚拟化技术),通过本文你可以知道的是kvm是干什么的,如何使用kvm,如何通过java操作xml从而生成生成虚拟机。KVM 全称是 基于内核的虚拟机(Kernel-based Virtual Machine),...

    [版权申明:本文系作者原创,转载请注明出处]
    文章出处:http://blog.csdn.net/sdksdk0/article/details/54809159
    作者:朱培 ID:sdksdk0

    今天分享的文章是关于云计算中的kvm(虚拟化技术),通过本文你可以知道的是kvm是干什么的,如何使用kvm,如何通过java操作xml从而生成生成虚拟机。

    一、虚拟化简介

    系统虚拟化是将底层物理设备与上层操作系统、软件分离的一
    种去耦合技术,在一台物理机器上逻辑的划分出多台机器。
    • 虚拟化的目标是实现IT资源利用效率和灵活性的最大化

    在一台物理主机上虚拟出多个虚拟计算机(虚拟机,Virtual
    Machine,VM),其上能同时运行多个独立的操作系统,这
    些客户操作系统(Guest OS)通过虚拟机管理器(Virtual
    Machine Monitor,VMM,也称作Hypervisor)访问实际
    的物理资源。

    KVM 全称是 基于内核的虚拟机(Kernel-based
    Virtual Machine),它是一个 Linux 的一个内核模块,该内
    核模块使得 Linux 变成了一个 Hypervisor:
    它由 Quramnet 开发,该公司于 2008年被 Red Hat 收购。
    • 它支持 x86 (32 and 64 位), s390, Powerpc 等 CPU。
    • 它从 Linux 2.6.20 起就作为一模块被包含在 Linux 内核中。
    • 它需要支持虚拟化扩展的 CPU。
    • 它是完全开源的。

    二、使用虚拟化的原因

    为什么我们要使用虚拟化技术。当公司的服务器越来越多,我们需要充分利用资源,也需要统一运维管理。
    主要原因可以总结如下:

    1. 打破“一台服务器对应一套应用”的模
      式,将物理服务器进行整合,提升利用
    2. 服务器和相关IT硬件更少,节省了机房空
      间,也减少了散热和电力需求
    3. 具备灵活数据备份和应用迁移机制,保
      障服务永不中断
    4. 资源动态调配和模板化部署,应用系统
      快速上线,及时响应业务变化。

    这里写图片描述

    虚拟化分为3类

    1. 全虚拟化
    2. 半虚拟化
    3. 硬件辅助的虚拟化

    无虚拟化

    1. – CPU一般设为四个Ring
    2. – Kernel Mode一般跑在Ring 0上
    3. – User Mode一般跑在Ring 3上
    4. – 对于一个普通的传统的Linux系统没有问题

    • 虚拟化

    1. – 在Guest机器和Host机器中间加一层Hypervisor
    2. – Host机器看它像跑在自己上面的程序
    3. – Guest机器看它像自己所运行的硬件
    4. – 如果Host机器和Guest机器都跑相同的Linux,它们的Kernel都想运行在Ring 0。

    三、常见的虚拟化技术

    例如很常见的VMWare、VirtualBox、Citrix Xen、kvm等。桌面虚拟化 将原本在本地电脑安装的桌面系统统一在后端数据中心进
    行部署和管理; 用户可以通过任何设备,在任何地点,任何时间访问属于
    自己的桌面系统环境。还有服务器虚拟化。包括全虚拟化(Full-Virtulization):
    无需修改操作系统,VM ESXi、Linux KVM
    • 半虚拟化(Para-Virtulization):
    集成半虚拟化代码,直接运行特权指令,性能接近物理机,需要修改操作
    系统,
    MS Hyper-V、 Ctrix Xen、IBM PowerVM
    • 操作系统层虚拟化
    开发、测试环境,VM Workstation、VM Server

    四、kvm环境配置

    下面介绍的操作流程是在centos6.6系统中演示。首先把防火墙关掉:

      Service iptables stop
        Chkconfig iptables off

    如果你的是centos7关闭防火墙:

        systemctl stop firewalld.service 
        systemctl disable firewalld.service

    1、进行cpu检测,

        egrep -c '(vmx|svm)' /proc/cpuinfo

    命令结果大于0表示cpu支持虚拟化。如果是等于0,就需要手动勾选虚拟化引擎。

    这里写图片描述

    如果linux的系统是在VMware Workstation上的,需要将cpu设置为支持硬件虚拟化。需要在设置中把处理器核数里面的虚拟化引擎(虚拟化Intel VT-X/EPT…)这个选项勾上。

    这里写图片描述

    2、kvm安装

    安装命令kvm:

        yum  install qemu-kvm

    • 安装虚拟化管理工具:

      yum install virt-manager libvirt libvirt-python python-virtinst  bridge-utils

    • libvirt:操作和管理KVM虚机的虚拟化 API,使用 C 语言编写,可以
    由 Python,Ruby, Perl, PHP, Java 等语言调用。可以操作包括 KVM,
    vmware,XEN,Hyper-v, LXC 等 Hypervisor。
    • Virsh:基于 libvirt 的 命令行工具 (CLI)
    • Virt-Manager:基于 libvirt 的 GUI 工具

    3、kvm内核模块

    将kvm嵌入到内核:

        modprobe kvm
        modprobe kvm-intel

    然后使用命令查看是否已经嵌入成功,

        lsmod | grep kvm

    如果显示下面的结果则代表嵌入成功。

    [root@controller ~]# lsmod | grep kvm
    kvm_intel 55496 0
    kvm 337900 1 kvm_intel
    [root@controller ~]#

    4、启动libvirt

        service libvirtd restart
        chkconfig libvirtd on

    5、资源准备

    新建kvmtest目录。我们就是这个目录下进行kvm测试。

     mkdir  /kvmtest

    然后将已经下载好的 CentOS-6.8-x86_64-minimal.iso上传到这个/kvmtest目录下。这里需要说明一下,我的系统是centos6.6的,然后对于6.6或者6.8的迷你版系统兼容更好,否则我们在后面创建电脑之后可能会发生无法启动的问题。对于其他版本开机时可能会遇到 “no filename or root path specified”的错误。

    6、创建安装盘

      qemu-img create -f qcow2 /kvmtest/centos-6.8.qcow2 
        10G

    7、创建虚拟机

     virt-install --virt-type kvm --name centos-6.8 --ram 1024 \
        --vcpus 1 \
        --cdrom=/kvmtest/CentOS-6.8-x86_64-minimal.iso \
        --disk /kvmtest/centos-6.8.qcow2,format=qcow2 \
        --network network=default \
        --graphics vnc,listen=0.0.0.0 --noautoconsole \
        --os-type=linux --os-variant=rhel6

    以下是各参数代表的意思:

    1. -n NAME
      指定虚拟机的名称
    2. -r MEMORY
      指定虚拟机的内存用量
    3. -u UUID
      指定虚拟机的唯一通用标识符
      (Universally Unique Identifier,UUID)。
      省略这个参数时,virt-install 将会自动产生
    4. –vcpus=VCPUS
      指定虚拟机的虚拟 CPU (Virtual CPU,VCPU) 数量
      -f DISKFILE
      指定虚拟磁盘的文件路径名称
      -s DISKSIZE
      用来指定虚拟磁盘的大小,这个参数需配合-f 使用。
      DISKSIZE为虚拟磁盘的大小,单位是GB
      -m MAC
      指定虚拟机的网络卡之硬件地址。
      这个参数可以省略,省略时virt-install 将自动产生
      -p 以半虚拟化的方式建立虚拟机
      -l LOCATION 指定安装来源

    8、创建完成之后我们就可以使用命令来查看虚拟机了。

        virsh  list --all

    因为我这边创建了3台,所以可以看到有3台虚拟机。

    这里写图片描述

    shut off代表的是关机中的意思。你可以参照下面的命令来查看虚拟机的信息。

    例如我这里需要开启一台,命令就是

    virsh start centos-6.8
    

    virsh list # 显示本地活动虚拟机
    • virsh start openSuse # 启动名字为ubuntu的非活动虚拟机
    • virsh create ubuntu.xml # 创建虚拟机(创建后,虚拟机立即执行,成为活
    动主机)
    • virsh suspend openSuse # 暂停虚拟机
    • virsh resume ubuntu # 启动暂停的虚拟机
    • virsh shutdown ubuntu # 正常关闭虚拟机
    • virsh destroy ubuntu # 强制关闭虚拟机
    • virsh dominfo openSuse # 显示虚拟机的基本信息
    • virsh dumpxml openSuse # 显示虚拟机的当前配置文件
    • virsh setmem ubuntu 51200 # 给不活动虚拟机设置内存大小
    • virsh setvcpus ubuntu 4 # 给不活动虚拟机设置cpu个数
    • virsh edit ubuntu # 编辑配置文件(一般用在刚定义完VM)

    9、客户端连接。
    我们可以使用命令

    netstat -natp
    

    来查看启动的进程。我们可以看到5900端口的进程是/qemu-kvm。

    这里写图片描述

    启动一台是5900,那么启动两台就是5900和5901,依次类推。
    我们可以在window系统中使用vnc-4_1_3-x86_win32_viewer.exe来连接。

    输入ip地址和端口号进行连接,例如的我的是192.168.44.146
    这里写图片描述

    然后就和平常的linux系统的安装流程来操作就行。安装好之后就可以连接进来操作即可。root 123456

    这里写图片描述

    在这里把电源模块安装好。
    电源管理:
    yum install acpid

    yum install tcpdump

    五、kvm的xml文件

    我们需要知其然也要知其所以然。那么我们是怎样做到在VMware Workstation虚拟出来的centos6.6系统中再其中虚拟化出来一台centos6.8系统。
    使用ifconfig命令可以查看IP网络配置。

    我们进入到/etc/libvirt/qemu目录下。我们可以看到有centos-6.8.xml文件。

    这里写图片描述

    在这个xml文件可以看到里面有虚拟机名字配置,磁盘大小配置等。那么这样我们就可以看出来了,原来这样一个centos6.8只需要一个xml文件就可以搞定,是不是我们可以复制一份这个xml文件就可以生成一个虚拟机了呢?答案是肯定了,激动人心的时候到了,那么我们就复制一份珍贵xml文件,然后改改名字呗。

    cp  centos-6.8.xml centos-6.8.01.xml
    

    然后vi新的这个centos-6.8.01.xml文件,将其虚拟机名字改为centos-6.8.01,这样我们就有了一台新的虚拟机了。

    那么我们如何启动我们刚才新的这台机器了。使用下面的命令:

    virsh define 模板文件路径

    例如我的是:

    virsh define  /etc/libvirt/qemu/centos-6.8.02.xml
    

    如果我们不想要了可以使用下面的命令移除虚拟机(virsh undefine 虚拟机名)

    virsh undefine centos-6.8  
    

    六、通过JAVA编程控制KVM

    在上一个章节中我们知道了一个kvm虚拟机我们可以使用xml文件来控制,那么我们自然也可以用java程序来写xml文件,从而生成虚拟机。如果你使用过阿里云或者腾讯云等云服务器的话你就知道,上面可以自定义选择cpu核数内存磁盘什么的,不就类似操作不同的参数,从而生成不同的xml文件,最后生成云服务器了。现在对于阿里腾讯等这些云服务器又增加的想法没,嘿嘿嘿!

    在Libvirt中有使用java操作kvm的API。

    我们知道在我的centos6.6中安装了qume-kvm,那么我们想要从其他地方(例如windos中)想要远程访问怎么办呢?所以我们需要对linux服务器做相应的设置,把端口打开,这样才能让其他的来访问我这个kvm,从而进行操作。

    1、启用tcp的端口。修改配置文件

    vi  /etc/sysconfig/libvirtd
    

    然后打开里面的如下内容,把“#”去掉

    LIBVIRTD_CONFIG=/etc/libvirt/libvirtd.conf
    LIBVIRTD_ARGS="--listen"
    

    然后再下面的文件中修改:

    vi /etc/libvirt/libvirtd.conf

    listen_tls = 0
    listen_tcp = 1
    tcp_port = “16509”
    listen_addr = “0.0.0.0”
    auth_tcp = “none”连接测试:
    在window中安装Libvirt,然后打开virsh-launcher.bat

     virsh -c qemu+tcp://192.168.44.146/system

    在这里我们可以看到在之前linux服务器中的虚拟机。
    这里写图片描述

    3、在eclipse中操作kvm
    新建java工程,导入libvirt-0.5.1.jar和jna-3.5.0.jar。
    然后就可以愉快的进行编码操作了:

    public class Test {
        public static void testVM() { 
            try { 
                Connect conn = new Connect("qemu+tcp://192.168.44.146/system"); 
    
                 conn.domainLookupByName("centos-6.8").shutdown();
            //    conn.domainLookupByName("centos-6.6-02").create();
            //   conn.domainLookupByName("centos-6.6").shutdown();
                 // conn.domainLookupByName("centos-6.6-02").create();
    
    
            } catch (LibvirtException e) { 
                e.printStackTrace(); 
            } 
        } 
        public static void main(String[] args) {
            testVM();
        }
        }

    在这里shutdown是可以关机,然后create是开机,而不是我们传统理解上的start。当然你有强迫症的话可以通过修改源码将create方法改为start。

    4、生成xml文件

    public class Test02 {
    
            public static void main(String[] args) {
                Connect conn = null;
                int flags = 0;
                //jdom dom4j
    
                try {
                      conn = new Connect("qemu+tcp://192.168.44.146/system");
    
    
    
    
                     String dumpxml ="<domain type='kvm'> "+
                             " <name>bjsxtvm03</name> "
                        + "  <memory unit='KiB'>1048576</memory>"
                        + " <currentMemory unit='KiB'>1048576</currentMemory>"
                        + " <vcpu placement='static'>1</vcpu>"
                        + " <os>"
                        + "   <type arch='x86_64' machine='rhel6.6.0'>hvm</type>"
                        + "   <boot dev='hd'/>"
                        + " </os>"
                        + "  <features>"
                        + "   <acpi/>"
                        + "    <apic/>"
                        + "    <pae/>"
                        + "  </features>"
                        + "  <clock offset='utc'/>"
                        + "  <on_poweroff>destroy</on_poweroff>"
                        + " <on_reboot>restart</on_reboot>"
                        + " <on_crash>restart</on_crash>"
                        + " <devices>"
                        + "  <emulator>/usr/libexec/qemu-kvm</emulator>"
                        + " <disk type='file' device='disk'>"
                        + "   <driver name='qemu' type='qcow2' cache='none'/>"
                        + "   <source file='/kvmtest/centos-6.6-04.qcow2'/>"
                        + "   <target dev='vda' bus='virtio'/>"
                        + "    <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>"
                        + "  </disk>"
                        + "  <disk type='block' device='cdrom'>"
                        + "     <driver name='qemu' type='raw'/>"
                        + "    <target dev='hdc' bus='ide'/>"
                        + "    <readonly/>"
                        + "    <address type='drive' controller='0' bus='1' target='0' unit='0'/>"
                        + "  </disk>"
                        + "   <controller type='usb' index='0' model='ich9-ehci1'>"
                        + "    <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>"
                        + "  </controller>"
                        + "  <controller type='usb' index='0' model='ich9-uhci1'>"
                        + "    <master startport='0'/>"
                        + "    <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>"
                        + "  </controller>"
                        + "  <controller type='usb' index='0' model='ich9-uhci2'>"
                        + "    <master startport='2'/>"
                        + "    <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>"
                        + "  </controller>"
                        + "  <controller type='usb' index='0' model='ich9-uhci3'>"
                        + "    <master startport='4'/>"
                        + "    <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>"
                        + "  </controller>"
                        + "  <controller type='ide' index='0'>"
                        + "   <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>"
                        + "  </controller>"
                        + " <interface type='network'>"
                        + "    <source network='default'/>"
                        + "    <model type='virtio'/>"
                        + "    <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>"
                        + "  </interface>"
                        + "  <serial type='pty'>"
                        + "    <target port='0'/>"
                        + "  </serial>"
                        + "  <console type='pty'>"
                        + "    <target type='serial' port='0'/>"
                        + "  </console>"
                        + "  <input type='tablet' bus='usb'/>"
                        + "  <input type='mouse' bus='ps2'/>"
                        + "  <graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'>"
                        + "    <listen type='address' address='0.0.0.0'/>"
                        + "  </graphics>"
                        + "  <video>"
                        + "   <model type='cirrus' vram='9216' heads='1'/>"
                        + "   <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>"
                        + " </video>"
                        + " <memballoon model='virtio'>"
                        + "  <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>"
                        + " </memballoon>" + "</devices>" + "</domain>"; 
    
                    Domain dm = null;
    
                    Domain dm1 = conn.domainDefineXML(dumpxml);
    
                    dm1.create();//start 
    
                    //Domain dm1 = conn.domainDefineXML(dumpxml); //创建一个域,但不启动
                    //dm1.undefine(); //undefind一个域,如果活动,则不停止
                    /****
                    try{
                        Domain dm1 =conn.domainLookupByName("bjsxtvm03");
                    }
                    catch (LibvirtException e) {
                        System.out.println("libvirt 错误" + e);
                        // TODO: handle exception
                    }
                    if(dm!=null)
                    {
    
                        dm.undefine();
    
                    }
                    ****/
    
                    /********
                    Domain dm2 = conn.domainDefineXML(dumpxml);
                    dm2.undefine();
                    *******/
    
                } catch (LibvirtException e) { //LibvirtException 返回错误详细信息
                    System.out.println("exception caught:" + e);
                    System.out.println("获取的错误;" + e.getError());
                }
    
                System.out.println("Clean exit");
    
            }
    
        }

    这里特别提醒一下,在window中操作kvm可能会遇到各种奇奇怪怪的问题,毕竟版本兼容比较麻烦。强烈建议在centos图形版的eclipse中连接kvm操作。

    总结:虚拟化技术为日后的云平台的架设打好基础,如果对于kvm不理解的话,那么对于openstack的学习还是会有一定的影响。平时需要对学习进行总结,找到知识互通的地方。这样对于云计算整体算是基础的认知。对于kvm在本篇文章中没有介绍到的有网络桥接,增加磁盘配置。

    展开全文
  • KVM 虚拟化技术(一)

    千次阅读 2018-06-22 13:36:52
    在计算机技术中,虚拟化技术)或虚拟技术(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等),予以抽象、转换后呈现出来并可供分区、组合为一个或多个...

    1.1 前言

    1.1.1 什么是虚拟化?

    在计算机技术中,虚拟化(技术)或虚拟技术(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等),予以抽象、转换后呈现出来并可供分区、组合为一个或多个电脑配置环境。

     

    图 - 虚拟化示意图

    由此,打破实体结构间的不可切割的障碍,使用户可以比原本的配置更好的方式来应用这些电脑硬件资源。这些资源的新虚拟部分是不受现有资源的架设方式,地域或物理配置所限制。

    一般所指的虚拟化资源包括计算能力和数据存储。

    由于目前信息技术领域的很多企业都曾在宣传中将该企业的某种技术称为虚拟化技术,这些技术涵盖的范围可以从Java虚拟机技术到系统管理软件,这就使得准确的界定虚拟技术变得困难。因此各种相关学术论文在谈到虚拟技术时常常提到的便是如前面所提到的那个不严格的定义。

    1.1.2 为什么要用虚拟化

      

    展开全文
  • 虚拟化技术KVM实战

    千次阅读 2017-05-03 18:18:55
    虚拟化技术KVM实战 一、走进云计算 云计算:云计算是一种按使用量付费的模式,这种模式提供可用的、便捷的、按需的网络访问, 进入可配置的计算资源共享池(资源包括网络,服务器,存储,应用软件,服务),这些...
  • KVM虚拟化技术实战与原理解析 全书一共9章:第1章介绍了云计算和虚拟化的概念,并对KVM等几种流行的虚拟化技术做了比较;第2章介绍了KVM的基本架构、QEMU的作用以及Intel的硬件虚拟化技术;第3章详细讲解了KVM依赖的...
  • KVM虚拟化技术 实战与原理解析.pdf;KVM虚拟化技术 实战与原理解析.pdf
  • 资源共享----《KVM虚拟化技术:实战与原理解析》 资源共享----《KVM虚拟化技术:实战与原理解析》 资源共享----《KVM虚拟化技术:实战与原理解析》 资源共享----《KVM虚拟化技术:实战与原理解析》 资源共享----...
  • KVM虚拟化技术课件
  • KVM虚拟化技术__实战与原理解析 + Linux KVM虚拟化架构实战指南(带书签)
  • 学习KVM虚拟化技术实战技能,利用KVM虚拟化技术创建windows、linux虚拟机。
  • KVM虚拟化技术:实战与原理解析》不仅系统介绍了KVM虚拟机的功能、特性和使用方法,而且还深入地剖析了KVM虚拟机的核心技术和工作原理,对KVM做了全面而透彻的讲解。
  • KVM虚拟化技术实战和原理解析》第一章和第二章读书笔记
  • KVM 虚拟化技术

    2018-12-12 10:15:37
    在计算机技术中,虚拟化技术)或虚拟技术(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等),予以抽象、转换后呈现出来并可供分区、组合为一个或多个...
  • kvm虚拟化技术 实战与原理解析》1、kvm原理简介2、kvm核心基础功能3、kvm管理功能4、kvm性能测试以及参考数据
  • kvm虚拟化技术:实战与原理解析 pdf扫描 图书详细介绍了kvm虚拟化技术的应用场景与原理
  • KVM虚拟化技术__实战与原理解析_带书签,KVM虚拟化技术__实战与原理解析_带书签,KVM虚拟化技术__实战与原理解析_带书签
  • KVM虚拟化技术:实战与原理解析》 书籍,我是从“笑遍世界”的博客处看到的。 博客中包含的内容有: KVM 环境搭建; KVM 使用讲解; KVM 管理工具 libvirt 介绍; KVM 性能测试。 觉得博主很认真,转载...
  • 1、软件虚拟化和硬件虚拟化:实现虚拟化的重要一步在于:虚拟化层必须能够截获计算元件对物理资源的直接访问,并将其重定向到虚拟资源池中。硬件虚拟化,就是物理平台本身提供了对特殊指令的截获和重定向的硬件支持 ...
1 2 3 4 5 ... 20
收藏数 14,891
精华内容 5,956
关键字:

kvm 虚拟化技术