之前介绍了使用WebVirtMgr或Openstack来部署及管理kvm虚拟机,下面简单介绍centos7.4下使用virt-manager部署及管理kvm虚拟机的做法:
0)KVM是什么
KVM(Kernel-based Virtual Machine, 即内核级虚拟机) 是一个开源的系统虚拟化模块。它使用Linux自身的调度器进行管理,所以相对于Xen,其核心 源码很少。目前KVM已成为学术界的主流VMM之一,它包含一个为处理器提供底层虚拟化 可加载的核心模块kvm.ko(kvm-intel.ko 或 kvm-amd.ko)。kvm 还需要一个经过修改的QEMU 软件(qemu-kvm),作为虚拟机上层控制和界面。KVM的虚拟化需要硬件支持(如 Intel VT技术或者AMD V技术)。是基于硬件的 完全虚拟化。 KVM可以运行多个其本身运行未改动的镜像的虚拟机,例如Windows,Mac OS X ,每个虚拟机都有各自的虚拟硬件,比如网卡、硬盘核图形适配 器等。 KVM和QEMU的关系 QEMU是个独立的虚拟化解决方案,从这个角度它并不依赖KVM。而KVM是另一套虚拟化解决方案,不过因为这个方案实际上只实现了内核中对处理器(Intel VT) , AMD SVM)虚拟化特性的支持,换言之,它缺乏设备虚拟化以及相应的用户空间管理虚拟机的工具,所以它借用了QEMU的代码并加以精简,连同KVM一起构成了 另一个独立的虚拟化解决方案:KVM+QEMU。
1)kvm相关安装包及其作用
qemu-kvm 主要的KVM程序包 python-virtinst 创建虚拟机所需要的命令行工具和程序库 virt-manager GUI虚拟机管理工具 virt-top 虚拟机统计命令 virt-viewer GUI连接程序,连接到已配置好的虚拟机 libvirt C语言工具包,提供libvirt服务 libvirt-client 虚拟客户机提供的C语言工具包 virt-install 基于libvirt服务的虚拟机创建命令 bridge-utils 创建和管理桥接设备的工具
2)centos7安装VNC环境
请参考:http://www.cnblogs.com/kevingrace/p/5821450.html
3)安装kvm
1)检查cpu是否支持虚拟化 [root@kevin ~]# grep vmx /proc/cpuinfo 如果有vmx信息输出,就说明支持VT;如果没有任何的输出,说明你的cpu不支持,将无法使用KVM虚拟机。 2)确保BIOS里开启虚拟化功能,即查看是否加载KVM模块 [root@kevin ~]# lsmod | grep kvm kvm_intel 170086 0 kvm 566340 1 kvm_intel irqbypass 13503 1 kvm ========================================================= 如果没有加载,运行以下命令: [root@kevin ~]# modprobe kvm [root@kevin ~]# modprobe kvm-intel [root@kevin ~]# lsmod | grep kvm kvm_intel 170086 0 kvm 566340 1 kvm_intel irqbypass 13503 1 kvm ========================================================= 内核模块导出了一个名为/dev/kvm的设备,这个设备将虚拟机的的地址空间独立于内核或者任何应用程序的地址空间。 [root@kevin ~]# ll /dev/kvm crw-rw-rw-. 1 root kvm 10, 232 1月 29 11:56 /dev/kvm 3)桥接网络 如果没有brctl命令(用来管理网桥的工具),则需要安装bridge-utils , [root@kevin ~]# yum -y install bridge-utils [root@kevin ~]# systemctl restart network 配置KVM的网桥模式 [root@kevin ~]# cd /etc/sysconfig/network-scripts/ [root@openstack network-scripts]# cp ifcfg-eno1 ifcfg-br0 [root@openstack network-scripts]# cat ifcfg-br0 TYPE="Bridge" //这一行修改为Bridge PROXY_METHOD="none" BROWSER_ONLY="no" BOOTPROTO="none" DEFROUTE="yes" IPV4_FAILURE_FATAL="no" IPV6INIT="no" IPV6_AUTOCONF="yes" IPV6_DEFROUTE="yes" IPV6_FAILURE_FATAL="no" IPV6_ADDR_GEN_MODE="stable-privacy" NAME="br0" //修改设备名称为br0 #UUID="fdbad04f-dae3-440e-8a8b-01d6a7bc9fe0" //这一行注释 DEVICE="br0" //修改设备为br0 ONBOOT="yes" IPADDR="192.168.10.210" PREFIX="24" GATEWAY="192.168.10.1" DNS1="8.8.8.8" [root@openstack network-scripts]# cat ifcfg-eno1 TYPE="Ethernet" BRIDGE=br0 //添加这一行 PROXY_METHOD="none" BROWSER_ONLY="no" BOOTPROTO="none" DEFROUTE="yes" IPV4_FAILURE_FATAL="no" IPV6INIT="no" IPV6_AUTOCONF="yes" IPV6_DEFROUTE="yes" IPV6_FAILURE_FATAL="no" IPV6_ADDR_GEN_MODE="stable-privacy" NAME="eno1" UUID="fdbad04f-dae3-440e-8a8b-01d6a7bc9fe0" DEVICE="eno1" ONBOOT="yes" #IPADDR="192.168.10.210" //注释掉这几行 #PREFIX="24" #GATEWAY="192.168.10.1" #DNS1="8.8.8.8" 重启网卡服务 [root@openstack network-scripts]# systemctl restart network 查看网卡 [root@openstack network-scripts]# brctl show bridge name bridge id STP enabled interfaces br0 8000.0894ef518b22 no eno1 virbr0 8000.52540095d7c2 yes virbr0-nic 查看ip信息 [root@openstack network-scripts]# ifconfig |head -20 br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.10.210 netmask 255.255.255.0 broadcast 192.168.10.255 inet6 fe80::a94:efff:fe51:8b22 prefixlen 64 scopeid 0x20<link> ether 08:94:ef:51:8b:22 txqueuelen 1000 (Ethernet) RX packets 856 bytes 52981 (51.7 KiB) RX errors 0 dropped 2 overruns 0 frame 0 TX packets 120 bytes 23450 (22.9 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eno1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 ether 08:94:ef:51:8b:22 txqueuelen 1000 (Ethernet) RX packets 10077 bytes 793083 (774.4 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 1184 bytes 228415 (223.0 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 device interrupt 16 eno2: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 ether 08:94:ef:51:8b:23 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) [root@openstack network-scripts]# ping www.baidu.com PING www.a.shifen.com (61.135.169.121) 56(84) bytes of data. 64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=1 ttl=55 time=2.08 ms 64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=2 ttl=55 time=1.80 ms ........ 4)安装libvirt及kvm libvirt是管理虚拟机的API库,不仅支持KVM虚拟机,也可以管理Xen等方案下的虚拟机。 [root@kevin ~]# yum -y install libcanberra-gtk2 qemu-kvm.x86_64 qemu-kvm-tools.x86_64 libvirt.x86_64 libvirt-cim.x86_64 libvirt-client.x86_64 libvirt-java.noarch libvirt-python.x86_64 libiscsi-1.7.0-5.el6.x86_64 dbus-devel virt-clone tunctl virt-manager libvirt libvirt-python python-virtinst 由于要用virt-manager图形化安装虚拟机,所以还需要安装X-window(这个在前面部署VNC环境里就已经安装了) [root@kevin ~]# yum groupinstall "X Window System" 安装中文字符,解决界面乱码问题 [root@kevin ~]# yum install -y dejavu-lgc-sans-fonts [root@kevin ~]# yum groupinstall -y "Fonts" 启用libvirt [root@kevin ~]# systemctl enable libvirtd [root@kevin ~]# systemctl start libvirtd
4)使用virt-manager管理kvm(通过VNC连接服务器)
提前将ISO系统镜像存放到服务器的一个目录里,比如/data/iso [root@openstack ~]# mkdir /data/iso [root@openstack ios]# ll 总用量 3356384 -rw-r--r--. 1 qemu qemu 3436937216 1月 29 11:41 win-server2008_R2.iso
5)解决KVM虚拟机在使用vnc连接时鼠标不同步的问题
在VNC界面中感觉virt-manager管理的虚拟机界面总是鼠标跟不上,指到哪儿也看不出来,界面上一直显示press control_l+a/t_l来移动鼠标!十分郁闷! 想要修改鼠标和宿主机界面同步方法如下: [root@openstack ~]# cd /etc/libvirt/qemu [root@openstack qemu]# ls networks test-win2008.xml [root@openstack qemu]# cp test-win2008.xml /opt/ [root@openstack qemu]# vim test-win2008.xml //在<devices>标签中添加下面这段配置 <devices> ...... <input type='tablet' bus='usb'/> //即添加这句话即可! ...... </devices> [root@openstack qemu]# virsh define /etc/libvirt/qemu/test-win2008.xml 定义域 test-win2008(从 /etc/libvirt/qemu/test-win2008.xml) 然后重启虚拟机后,发现虚拟机中的鼠标就会好事了,打开VNC查看虚拟机界面后默认情况下虚拟机中的鼠标指针和实体机的鼠标指针就是重合的,且两者运动速度也是同步的, 这下就彻底解决了鼠标指针漂移/不同步的情况了!
6)重定向USB设备(即将宿主机上的USB设备指定到目标虚拟机上)。适合挂载银行前置机设备!
先将USB设备插到宿主机上,接着在virt-manager界面里打开虚拟机,然后虚拟机界面上栏里打开"虚拟机"->"重定向USB设备(R)"。(特别注意:如下选择将usb设备挂载到虚拟机上后,不要关闭这个挂载界面,否则usb挂载动作就会结束!)
查看虚拟机,发现指定的USB设备已经挂载到该虚拟机上了!
如果要卸载该虚拟机上挂载的这个USB设备,即在"重定向设备usb(R)"里将这个USB设备去掉,然后"确定"即可!