kvm -- Kernel-based Virtual Machine
Posted wawahan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kvm -- Kernel-based Virtual Machine相关的知识,希望对你有一定的参考价值。
1、虚拟机类型: 类型1 硬件上直接安装hp
类型2 硬件上安装HOST 上面跑VMM
2、kvm概要
kvm 不算类型1也不算类型二。两种特性都有,他是linux的一个内核模块,内核中本身没有hv,当装上kvm时,内核就会变成hv了。此时硬件驱动就不用借助于别人,内核本身就可以使用这些驱动。
当有了hv时,需要一个管理工具,来创建虚拟机,管理虚拟机。
本身linux是运行在环0上,当装上kvm后,kvm就运行在环0捕获特权指令,内核运行在环-1上。
IO设备就需要软件模拟了。但是kvm自己不会模拟,只能借助另一个软件,qemu
3、qemu
qemu是个模拟器,可以管理并创建各种设备
cpu:模拟器,虚拟化
qemu (类型2的虚拟化软件) kqemu相当于qemu的二进制翻译。此时qemu性能更好,但是bug很多
此时kvm出现,取代了kqemu,和qemu配合更好,此时内核变为hv, qemu成为kvm控制台以及管理io设备的工具
4、使用kvm
如果用的是vm虚拟机要注意,硬件必须支持虚拟化
cat /proc/cpuinfo | egrep \'vmx|svm\'
modprobe kvm #装在kvm
modprobe kvm_intel | kvm_amd lsmode | grep kvm #查看
/dev/kvm
为虚拟机分配内存
读写vcpu的寄存器
想vcpu注入终端
运行vcpu
qemu进程,
处理器需求:需要一台可以运行最新Linux内核的Intel处理器(含VT虚拟化技术)或AMD处理器(含SVM安全虚拟机技术的AMD处理器,也叫AMD-V)。可以使用如下命令检查: #egrep "(vmx|svm)" color=always /proc/cpuinfo 或者使用下面的命令: #cat/proc/cpuinfo | egrep \'vmx|svm\' flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid dca sse4_1 sse4_2 popcnt aes lahf_lm ida arat dts tpr_shadow vnmi flexpriority ept vpid flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid dca sse4_1 sse4_2 popcnt aes lahf_lm ida arat dts tpr_shadow vnmi flexpriority ept vpid 会出现一堆这样的 flags 如果输出的结果包含vmx,它是Intel处理器虚拟机技术标志; 如果包含svm,它是AMD处理器虚拟机技术标志;。 如果你甚么都得不到,那应你的系统并没有支持虚拟化的处理,不能使用kvm。 另外Linux发行版本必须在64bit环境中才能使用KVM。 用命令uname-a 查看 x86_64则说明你是64位内核,跑的是64位的系统.
如果不支持硬件虚拟化,是安装不上kvm-intel 或者 kvm-amd的,如果是虚拟机则要在物理cpu支持虚拟化的前提下开启虚拟机cpu的虚拟化
查看内核是否编译了kvm模块
[root@centos6 ~]# grep -i "kvm" /boot/config-2.6.32-642.el6.x86_64 CONFIG_KVM_CLOCK=y CONFIG_KVM_GUEST=y CONFIG_HAVE_KVM=y CONFIG_HAVE_KVM_IRQCHIP=y CONFIG_HAVE_KVM_EVENTFD=y CONFIG_KVM_APIC_ARCHITECTURE=y CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT=y CONFIG_KVM=m CONFIG_KVM_INTEL=m CONFIG_KVM_AMD=m
如果内核编译了kvm模块但是没有加载可以先加载
[root@centos6 ~]# modprobe kvm [root@centos6 ~]# modprobe kvm_intel 或者直接加载kvm_intel,这样kvm会一起依赖加载进来
[root@centos6 ~]# lsmod | grep kvm kvm_intel 55464 0 kvm 345038 1 kvm_intel
virtio 驱动,
kvm管理工具站
1、virsh
virsh调用底层的libvirt库来实现管理虚拟机,
virt-manager,virt-viewer 这两个是virsh的图形化工具
可以管理xen与kvm
2、qemu
qemu也是一个管理虚拟机的管理工具,qemu-kvm就是管理kvm的基础
virsh比较完善 ,qemu目前不太完善
3,查看virt工具
yum list all *virt*
centos6以后xen就不能运行在dome0中了,红帽抛弃了xen专项大力研发kvm,所以这套组件在centos6后仅适用于kvm,但是xen源中的libvirt是支持kvm的
4、kvm只能虚拟cpu以及内存,如果想虚拟io就要装qemu
yum grouplist | grep -i "Virtualization"
如果想省事就把这4个组都装上去
查看包信息
[root@centos6 ~]# yum install qemu-kvm qemu-kvm-tools
安装成功后可以创建虚拟机
但是可以发现没有qemu-kvm的命令,红帽有意为之,因为他想让我们使用virsh
[root@centos6 ~]# rpm -ql qemu-kvm
这个工具在libexec中,但是这个不在我们的环境变量中。可以做个链接
qemu的命令很多,但是功能也就是创建虚拟机 cpu几颗,内存多大,IO ,光驱,硬件设备 ,映像文件位置,等等
命令格式: usage: qemu [options] [disk_image] : qemu 功能 磁盘映像文件
可以指定的一些选项
kvm标准选项
qemu-kvm
-name 设定虚拟机名称
-M 制定要模拟的主机类型 standard PC 标准pc ,ISA-only PC 或 Intel-Mac
[root@centos6 ~]# qemu-kvm -M ? Supported machines are: pc RHEL 6.6.0 PC (alias of rhel6.6.0) rhel6.6.0 RHEL 6.6.0 PC (default) rhel6.5.0 RHEL 6.5.0 PC rhel6.4.0 RHEL 6.4.0 PC rhel6.3.0 RHEL 6.3.0 PC rhel6.2.0 RHEL 6.2.0 PC rhel6.1.0 RHEL 6.1.0 PC rhel6.0.0 RHEL 6.0.0 PC rhel5.5.0 RHEL 5.5.0 PC rhel5.4.4 RHEL 5.4.4 PC rhel5.4.0 RHEL 5.4.0 PC
-m 设定虚拟机的RAM大小
-cpu 设定CPU模型
[root@centos6 ~]# qemu-kvm -cpu ? 【qemu-kvm -cpu -host 和物理机一样的cpu类型】 x86 Opteron_G5 AMD Opteron 63xx class CPU x86 Opteron_G4 AMD Opteron 62xx class CPU x86 Opteron_G3 AMD Opteron 23xx (Gen 3 Class Opteron) x86 Opteron_G2 AMD Opteron 22xx (Gen 2 Class Opteron) x86 Opteron_G1 AMD Opteron 240 (Gen 1 Class Opteron) x86 Broadwell Intel Core Processor (Broadwell) x86 Haswell Intel Core Processor (Haswell) x86 SandyBridge Intel Xeon E312xx (Sandy Bridge) x86 Westmere Westmere E56xx/L56xx/X56xx (Nehalem-C) x86 Nehalem Intel Core i7 9xx (Nehalem Class Core i7) x86 Penryn Intel Core 2 Duo P9xxx (Penryn Class Core 2) x86 Conroe Intel Celeron_4x0 (Conroe/Merom Class Core 2) x86 cpu64-rhel5 QEMU Virtual CPU version (cpu64-rhel5) x86 cpu64-rhel6 QEMU Virtual CPU version (cpu64-rhel6) x86 n270 Intel(R) Atom(TM) CPU N270 @ 1.60GHz x86 athlon QEMU Virtual CPU version 0.12.1 x86 pentium3 x86 pentium2 x86 pentium x86 486 x86 coreduo Genuine Intel(R) CPU T2600 @ 2.16GHz x86 qemu32 QEMU Virtual CPU version 0.12.1 x86 kvm64 Common KVM processor x86 core2duo Intel(R) Core(TM)2 Duo CPU T7700 @ 2.40GHz x86 phenom AMD Phenom(tm) 9550 Quad-Core Processor x86 qemu64 QEMU Virtual CPU version 0.12.1
虚拟cpu颗数:
-smp n [,core=core 每科cpu的核心数 ] 【,threads=threads 每科cpu的线程数】 【,sockets=sockets cpu的插槽数】 【,maxcpu=maxcpus 最大的虚拟cpu个数】
设定模拟SMP架构中CPU的个数,每个CPU的核心数机CPU的socket数目等,PC机上最多可模拟255可CPU maxcpus用于制定热插入的CPU个数上限
-numa opts :指定内存架构, 模拟多节点的numa设备,对称多处理服务器上的非一致性内存访问,让每颗cpu有自己的专用内存
指定为IDE接口的IO设备:
-fda file
-fdb file 使用制定文件作为软盘镜像,file为/dev/fd0表示私用物理软驱
-hda file 把某一文件模拟为ide格式个硬盘
-hdb file
-hdc file 光驱设备,不能和-cdrom同时使用
-hdd file 使用制定file作为硬盘镜像
-cdrom file 指定file作为cd-rom镜像,需要注意的是 -cdrom和-hdc不能同时使用,将file制定为/dev/cdrom可以直接使用物理光驱
指定scsi接口的IO设备
-drive option【,option【,option【,。。。 。。。】】】 制定一个新的硬盘设备:可用子选项很多
file=/path/to/somefile : 硬件影响文件路径
if=interface: 指定硬盘设备所连接的接口类型,及、即控制器类型,如 ide,scsi ,sd,mtd,floppy,pflash即virtio等,这里的scsi不一定性能就比ide好
index=index 设定同一种控制类型中不同设备的索引号,即标识号
media=media 定义介质类型为硬盘dick 还是光驱cdrom
snapshot=snapshot 制定当前硬件设备是否是支持快照功能 on/off
cache=cache 定义如何使用物理机缓存来访问块设备,即可用值有none、writeback(回写)、unsafe和writethrough(通写)四个
format=format 指定映像文件的格式,具体格式课件qemu-img命令
-boot 【order=drives】【,one=drives】【,menu=on|off 】 定义启动设备的引导次序(从哪个磁盘影响文件启动),每个设备使用一个字符表示,不同的结构所支持的设备及其表示字符不同,x86pc架构上
a、b表示软驱,c表示第一块硬盘(index=index中谁的索引小),d表示第一个光驱(index=index中谁的索引小),n-p表示网络适配器(pxe),默认为硬盘设备
-boot order dcn-p once=d menu=on (先光驱,再硬盘,再网络) (once此引导次序只在第一次启动时适用) (menu=on 显示菜单)
指定显示选项:
-nographic :默认情况下,qumu适用SDL来显示VGA 输出, 而此选项用于进制图形接口,此时,qumu类似一个简单的命令行程序,其方针串口设备将被重定向到控制台;
-curses: 禁止图形接口,并使用curese/ncurese作为交互接口
-alt-grab: 只用Ctrl + Alt + Shift 组合键释放鼠标
-sdl: 启用SDL
-spic option [, option[,...]] 启用spice 换成桌面协议,有许多子选项,请看找qemu-kvm手册
-vga type:指定要方针的VGA 接口类型,常见有
cirrus: Cirrus Logic GD5445显卡
std: 带有Bochs VBI 扩展的显示VGA显卡
vmware : Vmware SVGA-II 兼容的显示适配器
qxl: QXL半虚拟化显卡,与VGA兼容, 在Guest 中安装qxl 驱动后能以很好的方式工作,在使用spice协议时推荐侧类选项。
none:禁用VGA卡
-vnc display[, option[,option[,......]]] 默认情况下 ,qumu使用SDL显示VGA输出;使用-vnc选项,可以让qemu坚挺在VNC上,并将VGA输出重定向值VNC会话;使用此选项时,不许使用-k
选项制定键盘布局类型,有许多子选项,参照手册
指定网络属性相关选项
网络属性相关选项用于定义网络设备接口类型及其相关的各类属性等信息这里介绍nic ,tap 与user 三种,其他的参见手册
-net nic [,vlan=n] [,macaddr=mac] [,model=type][,name=name][,addr=addr][,vectors=v]:创建一个新网卡设备并将其连入vlan中;
PC架构上默认的NIC为e1000,
macaddr用于制定mac地址
name用于制定一个在监听时显示的网上设备名称
qemu可以模拟多个类型的网卡设备如:virto,i82551,i82557b,i82559er,ne2k_isa,pcnet,rtl8139,e1000,smc9c111,lance,mcf_fec等,不过不同平台架构上,其支持的类型可能
只包含前束列表的一部分 可以用qemu-kvm -net nic, mode=?来获取 (需要指定一个虚拟机的映像文件)
-net tap [,vlan=n][,name=name][,fd=h][,ifname=name][,script-file][,donscript=dfile]:通过物理机的TAP网络接口连接至vlan n中,使用script=file 制定脚本(默认/etc/qemu-ifup)
来配置当前网络接口,并使用downscript=file制定脚本(默认为/etc/qemu-ifdown)来撤销接口配置,使用 script=no 和downscrip=no 可以分别来禁止执行脚本
-net user[,option][,option][,...] : 在用户模式配置网络栈,其不依赖于管理权限;有效选择有:
vlan=n 联合制vlan n 默认n=0
name=name 指定接口显示名成,常用语架空模式中
net=addr[/mask ]: 设定GuestOS可见的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.x31
dns=addr 制定dns服务器地址,默认为网络中第三个 即 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
tap说明:需要将虚拟桥接设备关联至物理网卡设备,才可以创建出这个桥接设备,所以需要关联一个手动写的文件。关闭时到无所谓,因为会自动销毁
所以创建桥接网卡的时候 -net 要指定两遍 -net nic (指定虚拟机网卡) -net tap(指定临时创建的虚拟接口)通过tap接口敲到eth0上去。 所以刚启动虚拟机时tap的临时网络接口不存在,需要制定脚本来创建。/etc/qemu-ifup 就是做这个用的,但是这个脚本不存在,需要手动编写
例子:
1,先创建一个磁盘影响文件
[root@centos6 ~]# mkdir /images/vm1 -pv mkdir: 已创建目录 "/images" mkdir: 已创建目录 "/images/vm1" [root@centos6 ~]# qemu-img create -f qcow2 -o size=100G /images/vm1/centos.qcow2 Formatting \'/images/vm1/centos.qcow2\', fmt=qcow2 size=107374182400 encryption=off cluster_size=65536
[root@centos6 ~]# ll -h /images/vm1/centos.qcow2
-rw-r--r--. 1 root root 194K 3月 15 23:13 /images/vm1/centos.qcow2
[root@centos6 ~]# qemu-kvm -name "centos01" -m 512 -smp 2 -hda /images/vm1/centos.qcow2 -cdrom centos.iso \\ > -boot order=dc,onec=d
[root@centos6 ~]# qemu-img create -f qcow2 -o ? /images/vm1/centos.qcow2 Supported options: size Virtual disk size 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, 那就更小,metadata会预先分配元数据信息,性能会好,但是额外占用空间。
qemu-img snapshot 快照: qemu-img info /images/vm1/centos.qcow2 查看文件信息
qemu-img convert 转换文件格式的 将dd 生成的文件转换成qcow2格式
然后使用vnc连接器对地址链接
安装vnc 服务器
[root@centos6 ~]# yum install tigervnc-server
执行命令 : vncserver :1
如果这个方法不能自动弹出窗口那么就用下面的方法链接
1、[root@centos6 ~]# yum install tigervnc
2、然后执行上面创建虚拟机的命令
3、再开一个端口链接本机的5900端口
[root@centos6 ~]# vncviewer :5900
这样就能看到安装界面了
使用-drive 指定磁盘类型
[root@centos6 ~]# qemu-kvm -name="centos1" -m=768 -smp 4 -drive file=/images/vm1/centos.qcow2 ,if=ide,index=0,media=disk,format=qcow2\\
-drive file=/root/centos.iso media=cdrom, index=1 -boot order=dc
vim /etc/qemu-ifup
#! /bin/bash switch=br0 #打算自己创建一个接口桥接到br0上去 这个br0 要之前就要创建好了 if [ -n $1 ]; then # $1 这个参数是不是不空 #ip link set $1 up ifconfig $1 up #让需要创建的这个接口启动起来 sleep 0.5s #等待内核加载这个接口 brctl addif $swich $1 #在br0桥上添加 $1 这个要创建的中剑桥 exit 0 else echo "Error no specifed interface." exit 1 fi
bash -n /etc/qemu-ifup 检查语法是否错误
使用cd安装,并制定网络接口,然后创建桥接可以访问外网
[root@centos6 ~]# qemu-kvm -name="centos1" -m=768 -smp 4 -drive file=/images/vm1/centos.qcow2 ,if=ide,index=0,media=disk,format=qcow2 \\
-drive file=/root/centos.iso media=cdrom, index=1 -boot order=dc -net nic -net tap,name=vnet0,script=/etc/qemu-ifup ,downscript=no
使用 pxe模式安装
[root@centos6 ~]# qemu-kvm -name="centos1" -m=768 -smp 4 -drive file=/images/vm1/centos.qcow2 ,if=ide,index=0,media=disk,format=qcow2 \\
-boot order=nc -net nic -net tap,name=vnet0,script=/etc/qemu-ifup ,downscript=no
增加br0 脚本
#! /bin/bash #add bridge brctl addbr br0 #cancel ip ifconfig eth0 0 up #add eth0 to br0 brctl addif br0 eth0 #config br0\'s ip ifconfig br0 10.211.55.4/24 up #up br0 brctl stp br0 on
编写br0网卡信息
DEVICE=br0 #网卡名称 BOOTPROTO=none #手动指定地址 NM_CONTROLLED=no ONBOOT="yes" TYPE=Bridge #类型为桥接 IPADDR=10.211.55.4 #ip NETMASK=255.255.255.0 #mask GATEWAY=10.211.55.1 #网关 USERCTL=no
然后编辑eth0
DEVICE="eth0" BOOTPROTO=none NM_CONTROLLED=no ONBOOT="yes" TYPE="Ethernet" USERCTL=no
重启网络服务:
service network restartw
删除网桥
yao@twomoon:~$ sudo brctl delbr br0 bridge br0 is still up; can\'t delete it sudo ifconfig br0 down sudo brctl delbr br0
修改回网卡设置,将br0网卡设置文件删除
重启网卡
service network resgart 报错: determining ip information for eth0 dhclient is already running. exiting
#ps -aux|grep dhclient 找到dhclient的进程号
然后用#kill -9 进程号 便结束了dhclient进程
对于现在这个问题,这样子做可能没用处,接下来才是重点
首先网络要选择为NAT方式;其次是修改 #vim /etc/sysconfig/network-scripts/ifcfg-eth0 其中:
NM_CONTROLLED="yes"
最后刷新服务 #service network restart 即可
配置好以后的网卡信息类似下面,eth0 没有地址了,跑到了 br0上
[root@centos6 ~]# qemu-kvm -name="centos1" -m=768 -smp 4 -drive file=/images/vm1/centos.qcow2 ,if=ide,index=0,media=disk,format=qcow2 \\ -boot order=nc -net nic -net tap,ifname=vnet0,script=/etc/qemu-ifup ,downscript=no
#ifname=的值会当做第一个参数传给下面 !# /bin/bash switch=br0 if [ -n "$1"]; then ifconfig $1 up sleep 0.5s brctl addif $switch $1 exit 0 else echo "Error: no specifed"
qemu-kvm -name "centos-1" -m 512 -smp 2 -hda /images/vm1/centos.qcow2 -cdrom /media/psf/TOSHIBA EXT/images/CentOS-6.8-x86_64-bin-DVD1.iso -boot order=bc,once=d -net nic -net tap,ifname=br0 -vnc :0
启动以后就可以了
在上面的显示中 按下 control + alt + 2 可以到达监控界面
info network 这里显示的vnet0 则是name=vnet0 指定的参数
以上是关于kvm -- Kernel-based Virtual Machine的主要内容,如果未能解决你的问题,请参考以下文章
论文翻译:HetConv-Heterogeneous Kernel-Based Convolutions for Deep CNNs