KVM
~~~~~~~~~~主要命令~~~~~~~~~~~
#查看是否支持kvm
grep -o -E ’svm|vmx’ /proc/cpuinfo
#安装kvm
yum grouplist //查看安装组是否有Vitualization / Vitualization Client / Vitualization Platform / Vitualization Tools
yum groupinstall “Vitualization” “Vitualization Client” “Vitualization Platform” “Vitualization Tools” //安装虚拟化的包。因为本机器采用centos,centos是RHEL的社区版,kvm是RHEL开发的虚拟化技术
/usr/libexec/qemu-kvm //qemu并未按在系统变量里,需要全路径查找到,--help查找qemu帮助
yum -y install liabvirt virt-manager virt-viewer python-virtinst //安装virt的几个包
#模式一:使用virt模式创建管理虚拟机
service libvirtd start //virt是可以管理xen、KVM、vxm的通用工具,必需起先启动libvirtd;启动libvirtd以后会产生一个叫virbr0的虚拟网桥,通过ifconfig可以查看
chkconfig libvirtd on
virsh iface-bridge eth0 br0 //创建一个物理网桥
~~~~~~~~~~~~~~详述~~~~~~~~~~~~~~~~~~~
内核态 用户态
虚拟化介绍:CPU\内存\各种IO设备
cpu虚拟化:
Popek,Glodberg关于虚拟化的定义:
1、等价执行
2、性能良好
3、安全隔离
模拟虚拟化:trap(陷阱)>>emulate(模拟,仿真),即通过陷阱来捕获,进而模拟,因性能较低,被弃用
完全虚拟化:可以运行所有的操作系统(含开源和非开源),但性能较低
para半虚拟化:不可以运行非开源操作系统,性能较高
hvm硬件虚拟化:性能比完全虚拟化更好,且可以运行非开源系统
MMU:负责VA(虚拟地址)到PA(物理地址)的转换
内存虚拟化:GVA(guestVA)>>GPA(guestPA)>>HPA>>ShadowMMU>>MMU
TLB技术解决VA到PA的映射关系;tagged TLB
IO虚拟化:IO设备非常多
受限于VMM的实现方式:
type1型:hypervisor运行在硬件上,各操作系统都是虚拟机实例,性能比type2高,然hypervisor需要驱动各种IO设备,XEN实际仅驱动了DOM0特权域来调用硬件
typer2型:某操作系统运行在硬件上,操作系统上运行的软件是VMM
VMM对IO的驱动模式大致分为:
IO虚拟化模式纯模拟实现(由VMM自行提供驱动)、IO半虚拟化、混合模式Hybird(有的利用DOM0,有的利用DOMu):
Hybird:例如VMware EXS
SR-IOV 、 PF->VF 、VT-D;透传
完全虚拟化:VmWare Workstation、Vitural Box
半虚拟化:XEN
KVM笔记:
KVM不是stype1,也不是stype2
qemu: 可以模拟cpu、IO、内存,能创建、管理虚拟机,体积很小
cpu:kqemu(二进制翻译器,加速qemu,但bug多)
模式:用户模式、内核模式、来宾模式
VCPU:用线程模拟实现
modprobe kvm //rh6加载kvm
lsmod | grep kvm
ll /dev/ //查询kvm是否存在
【虚拟化的时钟一致性务必使用ntp服务器,任何一种虚拟设备的时钟机制都不能保证时钟一致性】
virtio技术:IO半虚拟化
kvm基本架构:
kvm的一般情况下的两套管理工具:qemu、virtual
grep -i "kvm" /boot/config-2.6.32-431.el6.x86_64 //查看kvm装载的情况
cat /proc/cpuinfo //查看cpu信息
grep -Ei "vmx|svm" /proc/cpuinfo //查看cpuinfo中是否有vmx(vmx是intel的cpu支持虚拟化的标志,没有就是不支持)或者svm(svm是amd的cpu支持虚拟化的标志,没有就是不支持)
也可以使用命令: grep -o -E ’svm|vmx’ /proc/cpuinfo
yum -y install qemu-kvm qemu-kvm-tools //安装qemu-kvm,允许虚拟化IO
yum grouplist |grep -i "Virtualization" //上面的方法可以使用本方法
yum groupinfo "Virtualization"
然后安装qemu
#查看qemu信息
rpm -ql qemu-kvm
#添加软连接
ln -sv /usr/libexec/qemu-kvm /usr/sbin
#查看qemu信息
qemu-kvm -h
qemu-img resize /images/vm2/test.qcow2 30G //增大或缩减images文件大小,resize只能扩展不能减小
qemu-img info /images/vm2 //查看images文件大小
qemu-img info test.qcow2 //查看文件大小
qemu-kvm -M ? //查看支持哪些操作系统的虚拟化
qemu-kvm -cpu ? //查看支持哪些操作cpu的虚拟化
qemu-kvm -net nic,model=? //查看支持的网络设备的接口类型
numa:非对称性的一致访问技术
#实例化一个kvm虚拟机【以下仅供参考,不熟悉参数操作则不成功】
mkdir /images/vm1 -pv //建立一个vm的镜像存放地址
qemu-img create -f qcow2 -o size=100G /images/vm1/ubuntu.qcow2 //创建虚拟机镜像文件名字、文件大小
qemu-kvm -name "[ubuntu][winxp]" -m 768 -smp 2 -hda /images/vm1/ubuntu.qcow2 [ubuntu-12.04.1-desktop-i386.iso][-cdrom exam-boot-xp.iso] -boot order=dc -net nic //创建[ubuntu系统][winxp系统]的虚拟机,此时会提示启动虚拟机成功在vnc模式下
ps aux|grep kvm //查看启动的虚拟机的进程,若删除虚拟机直接kill进程就行
yum -y install tigervnc-server //在宿主机(hypervisoer)安装连接虚拟机的vnc服务端
vncserver :1 //通过vnc连接虚拟机
yum -y install tigervnc //在宿主机安装vnc客户端
vncviewer :5900 //在宿主机端连接虚拟机
#VNC 客户端连接kvm虚拟机
1\在远端win系统下,使用xshell连接前需要安装xming(xmanager),并配置xshell的隧道xming【如下图】
vncviewer [ip]:[kvm虚拟机的端口号][CTRL]
显示kvm虚拟机界面即为正常
#kvm高级
#创建虚拟网桥脚本
#设置虚拟网网桥,将eth0连至br0【过程略】
vim /etc/qemu-ifup //可以在默认位置创建虚拟网桥的脚本
#/bin/bash
#/etc/qemu-ifup
#
switch=br0
if [-n "$1"];then
ifconfig $1 up
sleep 0.5s
brtcl addif $switch $1
exit 0
else
echo "Error:no specifed interface."
exit 1
fi
bash -n /etc/qemu-ifup //检查bash语法是否错误
chmod +x /etc/qemu-ifup
#启动方案一
qemu-kvm -name "winxp" -m 768 -smp 4 -drive file=/mirros/vm1/winxp.qcow2,if=ide,index=0,media=disk,format=qcow2 -drive file=/root/winxp_ghost.iso,media=cdrom,index=1 -boot order=dc -net tap,ifname=vnet0,script=/etc/qemu-ifup //创建tap设备,使用脚本并桥接到物理桥上
#启动方案二
qemu-kvm -name "winxp" -m 768 -smp 4 -drive file=/mirros/vm1/winxp.qcow2,if=ide,index=0,media=disk,format=qcow2 -drive file=/root/winxp_ghost.iso,media=cdrom,index=1 -boot order=dc -net tap,ifname=vnet0,downscript=no //创建tap设备,不使用脚本并桥接到物理桥上
brctl show //查看网桥情况【 安装brctl命令 yum install bridge-utils】
【ctrl+alt+2 //在启动过程中查看监控接口
info netowrk //查看网络
info cpu //查看CPU信息】
#kvm虚拟使用进程
dnsmasq的几种网络模型:NAT、路由、
dnsmasq:既可以作为dns使用,也可以作为dhcp使用
yum install dnsmasq -y
路由模型:
隔离模型
桥接模型:
多路桥接模型:
启动测试:
#/bin/bash
#/etc/qemu-ifup
#
switch=virbr0
if [-n "$1"];then
ifconfig $1 up
sleep 0.5s
brtcl addif $switch $1
exit 0
else
echo "Error:no specifed interface."
exit 1
fi
SDL:simple directmedia layer 简单的多媒体
VNC: virtual network computing 虚拟网络计算,基于RFB
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:表示在标准输入输出上显示mobitor界面
-nographic :
ctrl-a,c:在console和monitor之间切换
ctrl-a,h:显示帮助信息
镜像文件格式转换:
快照文件命令:
#kvm高级使用
http://launchpad.net/cirros/+download //cirros镜像文件仓库
monitor:
help
info
cpus
migrate //迁移内存命令
-incoming
#libvirt virtual模式:
yum -y install liabvirt virt-manager virt-viewer python-virtinst //安装virt的几个包
virt-install 创立的虚拟机会被保存在硬盘,重启并不影响,且名字唯一;qemu则不行,重启虚拟机就会消失
libvirt实例:
yum -y install python-virtinst libvirt //安装virtins libvirt
service libvirtd start //启动libvirt
virsh help iface-bridge //virsh查看iface-bridge帮助
virsh iface-bridge eth0 br0 //关联eth0和br0
virsh -h //查看virsh的帮助
【注】如果启动libvirtd错误如下解决:yum -y upgrade device-mapper-libs
【注】在vmware workstations情况下,需要开启以下设置,才会有/dev/kvm
virsh命令:
help 打印帮助
attach-device 从一个XML文件附加装置
attach-disk 附加磁盘设备
attach-interface 获得网络界面
autostart 自动开始一个域
capabilities 性能
cd change the current directory
connect 连接(重新连接)到 hypervisor
console 连接到客户会话
cpu-baseline compute baseline CPU
cpu-compare compare host CPU with a CPU described by an XML file
create 从一个 XML 文件创建一个域
start 开始一个(以前定义的)非活跃的域
destroy 删除一个域
detach-device 从一个 XML 文件分离设备
detach-disk 分离磁盘设备
detach-interface 分离网络界面
define 从一个 XML 文件定义(但不开始)一个域
domid 把一个域名或 UUID 转换为域 id
domuuid 把一个域名或 id 转换为域 UUID
dominfo 域信息
domjobinfo domain job information
domjobabort abort active domain job
domname 将域 id 或 UUID 转换为域名
domstate 域状态
domblkstat 获得域设备块状态
domifstat 获得域网络接口状态
dommemstat get memory statistics for a domain
domblkinfo domain block device size information
domxml-from-native Convert native config to domain XML
domxml-to-native Convert domain XML to native config
dumpxml XML 中的域信息
edit 编辑某个域的 XML 配置
find-storage-pool-sources 发现潜在存储池源
find-storage-pool-sources-as 找到潜在存储池源
freecell NUMA可用内存
hostname 打印管理程序主机名
list 列出域
migrate 将域迁移到另一个主机中
migrate-setmaxdowntime set maximum tolerable downtime
net-autostart 自动开始网络
net-create 从一个 XML 文件创建一个网络
net-define 从一个 XML 文件定义(但不开始)一个网络
net-destroy 删除一个网络
net-dumpxml XML 中的网络信息
net-edit 为网络编辑 XML 配置
net-list 列出网络
net-name 把一个网络UUID 转换为网络名
net-start 开始一个(以前定义的)不活跃的网络
net-undefine 取消定义一个非活跃的网络
net-uuid 把一个网络名转换为网络UUID
iface-list list physical host interfaces
iface-name convert an interface MAC address to interface name
iface-mac convert an interface name to interface MAC address
iface-dumpxml interface information in XML
iface-define define (but don’t start) a physical host interface from an XML file
iface-undefine undefine a physical host interface (remove it from configuration)
iface-edit edit XML configuration for a physical host interface
iface-start start a physical host interface (enable it / “if-up”)
iface-destroy destroy a physical host interface (disable it / “if-down”)
managedsave managed save of a domain state
nodeinfo 节点信息
nodedev-list 这台主机中中的枚举设备
nodedev-dumpxml XML 中的节点设备详情
nodedev-dettach dettach node device from its device driver
nodedev-reattach reattach node device to its device driver
nodedev-reset 重置节点设备
nodedev-create create a device defined by an XML file on the node
nodedev-destroy destroy a device on the node
nwfilter-define define or update a network filter from an XML file
nwfilter-undefine undefine a network filter
nwfilter-dumpxml network filter information in XML
nwfilter-list list network filters
nwfilter-edit edit XML configuration for a network filter
pool-autostart 自动启动某个池
pool-build 建立池
pool-create 从一个 XML 文件中创建一个池
pool-create-as 从一组变量中创建一个池
pool-define 在一个 XML 文件中定义(但不启动)一个池
pool-define-as 在一组变量中定义池
pool-destroy 销毁池
pool-delete 删除池
pool-dumpxml XML 中的池信息
pool-edit 为存储池编辑 XML 配置
pool-info 存储池信息
pool-list 列出池
pool-name 将池 UUID 转换为池名称
pool-refresh 刷新池
pool-start 启动一个(以前定义的)非活跃的池
pool-undefine 取消定义一个不活跃的池
pool-uuid 把一个池名称转换为池 UUID
secret-define define or modify a secret from an XML file
secret-dumpxml secret attributes in XML
secret-set-value set a secret value
secret-get-value Output a secret value
secret-undefine undefine a secret
secret-list list secrets
pwd print the current directory
quit 退出这个非交互式终端
exit 退出这个非交互式终端
reboot 重新启动一个域
restore 从一个存在一个文件中的状态恢复一个域
resume 重新恢复一个域
save 把一个域的状态保存到一个文件
schedinfo 显示/设置日程安排变量
dump 把一个域的内核 dump 到一个文件中以方便分析
shutdown 关闭一个域
setmem 改变内存的分配
setmaxmem 改变最大内存限制值
setvcpus 改变虚拟 CPU 的号
suspend 挂起一个域
ttyconsole tty 控制台
undefine 取消定义一个非活跃的域
update-device update device from an XML file
uri 打印管理程序典型的URI
vol-create 从一个 XML 文件创建一个卷
vol-create-from create a vol, using another volume as input
vol-create-as 从一组变量中创建卷
vol-clone clone a volume.
vol-delete 删除卷
vol-wipe wipe a vol
vol-dumpxml XML 中的卷信息
vol-info 存储卷信息
vol-list 列出卷
vol-pool returns the storage pool for a given volume key or path
vol-path returns the volume path for a given volume name or key
vol-name returns the volume name for a given volume key or path
vol-key returns the volume key for a given volume name or path
vcpuinfo 域 vcpu 的信息
vcpupin 控制域 vcpu affinity
version 显示版本
vncdisplay vnc 显示
snapshot-create Create a snapshot
snapshot-current Get the current snapshot
snapshot-delete Delete a domain snapshot
snapshot-dumpxml Dump XML for a domain snapshot
snapshot-list List snapshots for a domain
snapshot-revert Revert a domain to a snapshot
mkdir /images/vm3 //建立虚拟机的运行目录地址
virt-install -n "centos6" --vcpus 2 -r 512 -l http://172.16.0.1/cobbler/ks_mirror/centos-6.5-x86_64 --disk path=/images/vm3/centos6.qcow2,bus=virtio,size=120,sparse --network bridge=br0,model=virtio --force
【注】如果出现以下情况和解决方法