KVM的qemu-kvm使用
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
指定不同的网络接口名称
两个虚机互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
激活这两个网卡设备
ip link set veth0 up ip link set veth1.0 up
将veth1.0设备添加到桥设备上
brctl addif br0 veth1.0
将添加在宿主机上手动添加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'
解决方法:
[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的隧道转发
再次创建
[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客户端
[root@dmsag ~]# yum install tigervnc -y
切换到管理员用户
查看虚机地址
ctl+alt+2 切换到监控视图下 ctl+alt+1切换到命令行视图
info命令
开启一个虚拟机实际是在宿主机上创建了一个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:
domain:vm instances