KVM:



kvm,x86支持硬件辅助虚拟化技术(hvm)



grep -E "(vmx|svm)" /proc/cpuinfo
[root@dmsag ~]# ll /dev/kvm
crw-rw-rw- 1 root kvm 10, 232 Dec  4 19:14 /dev/kvm



查看内核模块信息



modinfo kvm
modinfo kvm-intel



装载模块并查看(装载kvm模块就会顺带装载kvm-intel模块)



[root@dmsag ~]# modprobe kvm
[root@dmsag ~]# lsmod |grep kvm
kvm_intel             174841  0
kvm                   578518  1 kvm_intel
irqbypass              13503  1 kvm



    管理工具栈:



        qemu-kvm (只能单机创建虚机不能跨主机创建)



        libvirt (通用工具)



    管理Kvm虚拟的方案:



        qemu::由于这个工具不是红帽推荐使用的支持力度比较小,安装了qemu-kvm后,它的默认路径/usr/libexec/  (使用需要创建链接)



        libvirt::



            安装工具



                virt-install (命令行安装)



                virt-manager(图形安装)



            管理工具:



                virsh



                virt-manager



                virt-viewer 



 



使用qemu管理虚机 更接近底层管理。



 安装qemu-kvm



yum install qemu-kvm qemu-img -y



创建链接指向到默认路径



[root@dmsag ~]# ln -sv /usr/libexec/qemu-kvm /usr/bin/
‘/usr/bin/qemu-kvm’ -> ‘/usr/libexec/qemu-kvm’



查看qemu的使用帮助



qemu-kvm -h



qemu-kvm :



qemu-kvm 【options】 【disk_image】



 



qemu-kvm使用文档



 



1.使用qemu-kvm管理kvm虚拟机



qemu是一个广泛使用的开源计算机仿真器和虚拟机,当作为仿真器时,可以再一种架构(如PC机)下运行另一种架构(如RAM)下的



操作系统和程序,而通过动态转换,其可以获得很高的运行效率,当作为一个虚拟机时,qemu可以通过直接使用真机的系统资源,



让虚拟系统能够获得物理机的性能表现,qemu支持xen或者kvm模式下的虚拟化,当用kvm时,qemu可以虚拟x86,服务器和嵌入式



powerpc,以及s390的系统。



 



qemu当运行于主机架构相同的目标架构时可以使用kvm,例如,当在一个x86兼容处理器上运行qemu-system-x86时,



可以利用KVM加速为宿主机和客户机提供更好的性能。



 



2.qemu有如下几个部分组成

  • 处理器模拟器(x86,PowerPC和Sparac)
  • 仿真设备(显卡,网卡,硬盘,鼠标等)
  • 用于将仿真设备连接至主机设备(真实设备)的通用设备
  • 模拟机的描述信息
  • 调试器
  • 与模拟器交互的用户接口

 



3.使用qemu-kvm安装guest



基于libvirt的工具如virt-manager和virt-install 提供了非常便捷的虚拟机管理接口,但他们事实上经二次开发后又封装了qemu-kvm的工具,因此,直接使用qemu-kvm命令也能够完成此前的任务。



 



Standard options: 标准选项(虚拟机自身,名字 cpu 内存)



  • -name 设定虚拟机的名称
  • -M machine: 指定要模拟的主机类型,如standard PC,ISA-only,PC或Intel-Mac等  可以使用 qemu-kvm -M ? 查看支持的类型
  • -cpu  指定的不是cpu的颗数,而是指定cpu的类型,可以使用qemu-kvm -cpu ? 查看支持的cpu类型
  • -smp  设定模拟器的SMP架构中CPU的个数等,每个cou的核心数及cpu的socket数目等,pc机上最多可以模拟255颗cpu,maxcpus用于指定热插入的cpu个数上限
  •  -numa opts: 指定模拟多结点的numa设备
  •  -fda file
  •  -fdb file  使用指定文件(file)作为软盘镜像,file为/dev/fd0 表示使用物理软驱:
  •  -hda file
  •  -hdb file
  •  -hdc file
  •  -hdd file
  •  -cdrom file : 使用指定file作为CD-ROM镜像,需要注意的是-cdrom和-hdc不能同时使用:将file指定为/dev/cdrom可以直接使用物理光驱
  •  -drive option[,option[,option[....]]]:定义一个硬盘设备:可用子选项有很多。

            file=/path/to/somefile :硬盘映像文件路径



            if=interface: 指定硬盘设备所连接的接口类型,即控制器类型,如ide,scsi,sd,mtd,floppy,pflash及virtio等:



            index=index:设定同一种控制器类型中不通设备的索引号,即标识号:



            media=media:定义介质类型为硬盘(disk)还是光盘(cdrom)



            snapshot=snapshot:指定当前硬盘设备是否支持快照功能:on或off



            cache=cache:定义如何使用物理机缓存来访问块数据,其可用值有none,writeback,unsafe和writethrough(通写)



            format=format:指定映像文件的格式,具体格式可参见qemu-img命令



  •  -boot [order=drivers][,once=drives][,menu=on|off] :定义设备的引导次序,每种设备使用一个字符表示,不通的架构所支持的设备及其表示字符不尽相同,在x86PC架构上,a、b表示软驱,c表示第一块硬盘,d表示第一个罐区设备,n-p表示网络适配器,默认为硬盘设备。

 



Block device options: 块设备选项  (磁盘)



USB options:  USB选项



Display options:  显示选项  



  • -nographic:默认情况下,qemu使用SDL来显示VGA输出,而此选项用于禁止图形接口,此时qemu类似一个简单的命令行程序,其仿真串口设备将被重定向到控制台。
  • -curses:禁止图形接口,并使用curses/ncurses作为交互接口
  • -alt-grab:使用ctrl+alt+shift组合键释放鼠标键
  • -sdl: 启用SDL  sdl:Simple DriectMeadia Layer: c语言开发,跨平台且开源多媒体程序库文件:在qemu 中使用 -sdl 即可
  • -spice option[,option[...]]:启用spice远程桌面协议:其有许多子选项,具体请参照qemu-kvm手册
  • -vga type:指定要仿真的VGA接口类型常见的类型有:

                cirrus: cirrus logic GD5446显示卡



                    std: 带有bochs VBI扩展的标准VGA显示卡:



                vmware: VMware SVGA-II 兼容的显示适配器:



                qxl:QXL半虚拟化显示卡:与VGA兼容,在GUEST中安装qxl驱动后能以很好的方式工作,在使用spice协议时推荐使用此类型



                none: 禁用VGA卡;



  • -vnc display[,option[,....]]:默认情况下,qemu使用SDL显示VGA输出:使用-vnc选线,可以让qemu监听在vnc上,并将VGA输出重定向到VNC会话,使用此选项时,必须使用-k选项指定键盘布局类型,其有许多子选项,具体参考qemu-kvm的手册

        display:



            1)host:N



                172.16.100.7:1,监听于172.16.100.7主机的5900+N的端口上



            2)unix:/path/to/socket_file



            3)none



        options:



            password:连接时需要验证密码:设定密码通过monitor接口使用change



            reverse:“反向”连接至某处于监听状态的vncview上:



        -monitor stdio:表示在表输入输出上显示monitor界面



        -nographic



            ctrl-a,c:在console和monitor之间切换



            ctrl-a,h:显示帮助信息



i386 target only:    x86平台上的专用选项



  • -no-acpi:禁用ACPI功能GuestOS与ACPI出现兼容问题时使用此选项
  • -balloon none:禁用balloon设备
  • -balloon virtio[,addr=addr]:启用virtio balloon设备

Network options:    网络选项



网络属性相关选项用于定义网络设备接口类型及其相关的各属性等信息,这里只介绍nic,tap和user三种类型网络接口的属性,其他类型参考kvm-qemu手册



  • -net nic[,vlan=n][,macaddr=mac][,model=type][,name=name][,addr=addr][,vectors=v]:

创建一个新的网卡设备并连接至vlan n中,pc架构上默认的NIC为e1000,macaddr用于为其制定MAC地址,name用于指定一个在监控时显示的网上设备名称:emu可以模拟多个类型的网卡设备,如virtio,i82551,i82557b,i82559er,ne2k_isa,pcnet,rtl18139,e1000,smc91c111,lance及macf_fec等:不过,不同平台架构上,其支持的类型可能只包含前述列表的一部分,可以使用“qemu-kvm -net nic,model=?”来获取当前平台支持的类型:



  • -net tap[,vlan=n][,name=name][,fd=h][,ifname=name][,script=file][,downscript=dfile]:通过物理机的TAP网络接口连接至vlan n中,使用script=file指定的脚本(默认为/etc/qemu-ifup)来配置当前网络接口,并使用downscript=file指定的脚本(默认为/etc/qemu-ifdown)来撤销接口配置:使用script=no和downscript=no可分别用来禁止执行脚本:
  • -net user[,option][,option][,...]:在用户模式配置网络栈:其不依赖于管理权限:有效选项有:

            vlan=n:连接至vlan n,默认n=0



            name=name:指定接口的显示名称,常用语监控模式中:



            net=addr[/mask]:设定GusetOS可见的IP网络,掩码可选,默认为10.0.2.0/8;



            host=addr:指定GuestOS中看到的物理机的IP地址,默认为网络中的第二个,即x.x.x.2



            dhcpstart=addr:指定DHCP服务地址池中16个地址的起始IP,默认为第16个第31个,即x.x.x.16-x.x.x.31



            dns=addr:指定GuestOS可见的dns服务器地址,默认为GuestOS网络中的第三个地址,即x.x.x.3



            tftp=dir:激活内置的tftp服务器,并使用指定的dir作为tftp服务器的默认根目录



            bootfile=file  BOOTP文件名称,用于实现网络引导GuestOS,如:qemu -hda linux.img -boot n -net user,tftp=/tftpserver/pub,bootfile=/pxelinux.0



#定义前半段后半段开启一个虚机



qemu-kvm -m 128 -cpu host -smp 2 -name "test" -drive file=/images/kvm/cirros-0.3.4-x86_64-disk.img,if=virtio,media=disk,format=qcow2,cache=writeback -nographic -net nic -net tap,name=vif0.0,script=no



 



/etc/qemu-ifup



#!/bin/bash
bridge=br0
 
if [ -n "$1" ];then
    ip link set $1 up
    sleep 1
    brctl addif $bridge $1
if [ $? -eq 0 ] && exit 0 || exit 1
    else
    echo "Error: no interface specified"
exit 1
fi



qemu-kvm -m 128 -cpu host -smp 2 -name "test" -drive file=/images/kvm/cirros-0.3.4-x86_64-disk.img,if=virtio,media=disk,format=qcow2,cache=writeback -nographic -net nic -net tap,name=vif0.0,script=/etc/qemu-ifup
qemu-kvm -m 128 -cpu host -smp 2 -name "test1" -drive file=/images/kvm/cirros-0.3.4-x86_64-disk.img,if=virtio,media=disk,format=qcow2,cache=writeback -nographic -net nic -net tap,name=vif1.0,script=/etc/qemu-ifup



指定不同的网络接口名称



 

kvm 绑定 usb kvm怎么使用_kvm 绑定 usb

两个虚机互ping不通,因为通过上面的命令创建的虚机mac地址是一样的(不指定macaddr默认都是一样的)



test1虚机指定一下macaddr 就可以互通了。



qemu-kvm -m 128 -cpu host -smp 2 -name "test1" -drive file=/images/kvm/cirros-0.3.4-x86_64-disk.img,if=virtio,media=disk,form
at=qcow2,cache=writeback -nographic -net nic,macaddr=52:54:00:12:34:57 -net tap,name=vif1.0,script=/etc/qemu-ifup



 



添加2个网卡设备 veth0 和veth1



ip link add veth1.0 type veth peer veth1.1




kvm 绑定 usb kvm怎么使用_kvm 绑定 usb_02


激活这两个网卡设备


ip link set veth0 up
ip link set veth1.0 up


kvm 绑定 usb kvm怎么使用_kvm 绑定 usb_03


将veth1.0设备添加到桥设备上


brctl addif br0 veth1.0


kvm 绑定 usb kvm怎么使用_网络_04


将添加在宿主机上手动添加veth0的ip


ifconfig veth0 192.168.2.254/24


在两个虚机分别手动添加1个地址


ifconfig eth0 192.168.2.1/24  #test虚机
ifconfig eth0 192.168.2.2/24  #test1虚机


验证结果:在两台虚机上都是可以ping通veth0 的地址


/etc/qemu-ifdown


#!/bin/bash
bridge=br0
 
if [ -n "$1" ];then
    brctl delif $bridge $1
    ip link set $1 down
    exit0
else
    echo "Error: no interface specified"
    exit 1
fi


 


nat模型网络脚本实例:


/etc/qemu-natup


#!/bin/bash
bridge="isbr"
net="10.0.0.0/8"
ifaddr=10.0.10.1
 
checkbr(){
if brctl show |grep -i "$1";then
    return 0
else
    retun 1
fi
}
 
initbr(){
    brctl addr $bridge
    ip link set $bridge up
    ip addr add $ifaddr dev $bridge
}
 
enable_ip_forward(){
sysctl -w net.ipv4.ip_forward=1
}
 
setup_nat(){
    checkbr $bridge
    if [ $? -eq 1 ];then
    initbr
    enable_ip_forward
    iptables -t nat -A POSTROUTING -s $net ! -d $net -j MASQUERADE
    fi
}
 
if [ -n "$1" ];then
    setup_nat
    ip link set $1 up
    brctl addif $bridge $1
    exit 0
else
    echo "Error: no interface specified"
    exit 1
fi


 


/etc/qemu-natdown


#!/bin/bash
bridge="isbr"
remove_rule(){
    iptables -t nat -F
}
 
isalone_bridge(){
    if ! brctl show |awk "/^$bridge/{print \$4}" | grep "[^[:space:]]" &>/dev/null;then
        ip link set $bridge down
        brctl delbr $bridge
        remove_rule
    fi
}
 
if [ -n "$i"];then
    ip link set $i down
    brctl delif $bridge $i
    isalone_bridge
exit 0
else
    echo "Error: no interface specified."
    exit 1
fi


 


 


 


4.总结:


    kvm的网络模型:


    1.隔离模型:在host创建一个vswitch(bridge device),每个虚拟机的tap设备直接添加至vswitch上; 


    2.路由模型:


    3.NAT模型


    4.桥接模型


 


Character device options: 字符设备选项(鼠标键盘)


Device URL Syntax:     基于iscsi的方式加载一个iscsi设备如何使用url指明


Bluetooth(R) options:    蓝牙设备选项(桌面虚拟化可能用到,服务器虚拟化用不到)


Linux/Multiboot boot specific: linux多启动特殊设备选项


Debug/Expert options:    专家模式专用选项


 


5.快捷键


ctrl-alt-f      toggle full screen   


ctrl-alt-n      switch to virtual console 'n'


ctrl-alt        toggle mouse and keyboard grab


 


cirros project:为cloud换将测试vm提供的微缩版Linux:


 启动一个虚拟机:


qemu-kvm -m 128 -smp 2 -name test -hda /images/kvm/cirros-0.3.4-x86_64-disk.img


用-driver指定磁盘映像文件


qemu-kvm -m 128 -smp 2 -name "test" -drive file=cirros-0.3.4-x86_64-disk.img,if=virtio,media=disk,format=qcow2,cache=writeback


通过cdrom启动winxp的 安装


qemu-kvm -name winxp -smp 4,sockets=1,croes=2,threads=2 -m 512 -drive file=/images/kvm/winxp.img,if=ide,media=disk,cache=writeback,format=qcow2 -drive file=/root/winxp_ghost.iso,media=cdrom


qemu-kvm -m 128 -name test -smp 2 -drive file=/images/kvm/cirros-0.3.4-i386-disk.img,if=virtio,media=disk,cache=writeback,format=qcow2 -net nic -net tap,script=/etc/if-up,downscript=no -nographic


qemu-kvm -m 512 -smp 2 -name centos -drive file=/images/centos/centos6.img,media=disk,if=virtio -net nic,model=virtio,macaddr=52:54:00:55:32:19 -net tap,ifname=centos6.0,script=/etc/qemu-ifup -boot order=nc,once=n


qemu-img create -o ? -f qcow2 /images/window/winxp.qcow2
qemu-img create -o size=20G,preallocation=metadata -f qcow2 /images/window/win10.qcow2


 


-daemonize 该选项可以将虚机放后台运行


 


选项说明:


    -smp 对称多处理器


    if   块设备的虚拟化方式,virtio 为半虚拟化


    media 介质设备类型


    cache 指定缓存类型


    format 磁盘映像的格式


    


查看镜像信息


[root@dmsag kvm]# qemu-img info cirros-0.3.4-x86_64-disk.img
image: cirros-0.3.4-x86_64-disk.img
file format: qcow2
virtual size: 39M (41126400 bytes)
disk size: 13M
cluster_size: 65536
Format specific information:
    compat: 0.10


 


kvm创建虚机报错


[root@dmsag kvm]# qemu-kvm -m 128 -smp 2 -name "test" -hda cirros-0.3.4-x86_64-disk.img
qemu: could not load PC BIOS 'bios-256k.bin'


kvm 绑定 usb kvm怎么使用_网络_05


解决方法:


[root@dmsag kvm]# cd /usr/share/seabios
[root@dmsag seabios]# ls
bios.bin
[root@dmsag seabios]# cp bios.bin bios-256k.bin
[root@dmsag seabios]# ls
bios-256k.bin  bios.bin


设置一下xshell的隧道转发


kvm 绑定 usb kvm怎么使用_网络_06


再次创建


[root@dmsag kvm]# qemu-kvm -m 128 -smp 2 -name "test" -hda cirros-0.3.4-x86_64-disk.img
VNC server running on `::1:5900'
::1 表示只能监听本机的连接


 


安装vnc客户端


kvm 绑定 usb kvm怎么使用_kvm 绑定 usb_07


[root@dmsag ~]# yum install tigervnc -y


kvm 绑定 usb kvm怎么使用_网络_08


切换到管理员用户


kvm 绑定 usb kvm怎么使用_网络接口_09


查看虚机地址


kvm 绑定 usb kvm怎么使用_运维_10


 


ctl+alt+2 切换到监控视图下 ctl+alt+1切换到命令行视图


info命令


kvm 绑定 usb kvm怎么使用_运维_11


 


开启一个虚拟机实际是在宿主机上创建了一个qemu-kvm进程 ,关闭虚机只需要杀死对应的进程


 


使用 -hda指定的磁盘太垃圾,所以出现 -driver file=磁盘镜像  用逗号隔开可以指定一堆选项


 


 


使用示例


下面的命令创建了一个名为rhel5.8的虚拟机,其ram大小为512MB,有两颗CPU的SMP架构,默认引导设备为硬盘,有一个硬盘


设备和一个光驱设备,网络接口类型为virtio,VGA模式为cirrus,并启动了balloon功能。


 


qemu-kvm -name "rehl5.8" -m 512 \
-smp 2 -boot d \
-drive file=/VM/images/rhel5.8/hda,if=virtio,index=0,media=disk,format=qcow2 \
-drive file=/isos/rhel-5.8.iso,index=1,meidia=cdrom \
-net nic,model=virtio,macaddr=52:54:00:A5:41:1E \
-vga cirrus


需要注意的是,上述命令中使用的硬盘映像文件/VM/images/rhel5.8/hda需要事先使用qemu-img命令创建


 


在虚机创建并安装GuestOS完成之后,可以免去光驱设备直接启动之,命令如下所示。


qemu-kvm -name "rehl5.8" -m 512 \
-smp 2 -boot d \
-drive file=/VM/images/rhel5.8/hda,if=virtio,index=0,media=disk,format=qcow2 \
-net nic,model=virtio,macaddr=52:54:00:A5:41:1E \
-vga cirrus -balloon virtio


 


pxe方式创建虚机


qemu-kvm -hda linux.img -boot n -net user,tftp=/path/to/tftp/files,bootfile=/pxelinux.0


 


6.virtio半虚拟化:


  • HVM:虚拟化CPU
  • I/O半虚拟化分为两段:

            前端驱动(virtio前半段),virtio-blk,virtio-net,virtio-pci,virtio-balloon,virtio-console


            linux:centos 4.8+,5.3+,6.0+,7.0+


            windows:


            virtio:虚拟队列,virt-ring


            transports


            后端处理程序(virt backend drivers)在QEMU中实现:


  • virtio-balloon:

            ballooning:让VM中运行的GuestOS中运行调整其内存大小


            # qemu-kvm -balloon virtio


            手动查看GuestOS的内存用量:


            info balloon


            balloon N


  • virtio-net:

            其依赖于GuestOS中的驱动,及Qemu中的后端驱动


            GuestOS:virtio_net.ko


            Qemu:  qemu-kvm -net nic,model=?


            qemu-kvm -net nic,model=virtio


  • Host中的GSO,T5O

                关掉可能会提升性能:


                ethtool -K $IF gso off


                ethtool -K $IF gso off


                ethtool -K $IF


  • vhost-net: 用于取代工作于用户空间的qemu中为virtio-net实现的后端驱动以实现性能提升的驱动

                -net tap[,vnet_hdr=on][off][,vhost=on|off]


                qemu-kvm -net tap,vnet_hdr=on,vhost=on


 


  • virtio-blk:

                其依赖于GuestOS中的驱动,及Qemu中的后端驱动


                -drive file=/path/to/some_image_file,if=virtio


 


  • kvm_clock:半虚拟化的时钟

            # grep -i "paravirt" /boot/config-3.10.0-862.el7.x86_64


            CONFIG_PARAVIRT_SPINLOCKS=y


            CONFIG_PARAVIRT_TIME_ACCOUNTING=y


            CONFIG_PARAVIRT_CLOCK=y


    


  • VM Migration

             static migration


            live migration


                    整体迁移时间


                    服务器停机时间


                    对服务的性能的影响


 


        在待迁入主机使用


            # qemu-kvm -vnc :N -incoming tcp:0:7777


            # vncviewer :590N


 


        在源主机使用:


            monitor接口:


                migrate tcp: DEST_IP:DEST:PORT


 


  • libvirt工具栈:

            支持的虚拟化技术:KVM,XEN,LXC,VMWare,Qemu,OpenVZ


            


            libvirt中的术语:


                node: 指物理节点


                hypervisor: