分类: 服务器与存储
2014-11-10 12:12:34
KVM 是最近非常火热的技术,是云计算的基础,个人在工作上接触比较多,的确是非常好的一个东西。今天的主要目的就是在自己的家用电脑上将KVM跑起来。
理论上来将,虚拟化可以大致分为全虚拟化与半虚拟化两种类型,全虚拟化即纯的软件虚拟化,可以不依赖硬件,完全在OS内部(大部分是用户空间)实现,由OS来模拟所有的关键指令,这类虚拟化技术通用性好,但是性能通常很差,尤其是通信性能或者某些类型的计算性能,不能做大大规模的部署;半虚拟化也就是硬件辅助虚拟化,通常需要CPU的支持才能实现,其性能通常较高,可以接近RAW OS的性能,适合在云计算的环境中大量部署,不过其对CPU有要求,好在现在几乎所有主流的X86系列CPU都提供了对虚拟化的支持,所以,一般来说,这都不是事儿!
KVM是一种硬件辅助虚拟化的虚拟机实现技术,其核心是kvm.ko,运行与linux内核中,负责处理guest os的特权指令与硬件辅助系统的交互。KVM一开始就将性能作为一个非常关键的因素加以考虑,所以它它压根儿就没有考虑全虚拟化的解决方案,也就是说,要跑KVM,你的CPU必须支持硬件虚拟化。
你可以用下面的命令来看你的机器是否支持硬件虚拟化 :
[ cat /proc/cpuinfo | grep 'vmx' --color=always ]
下面是在我的机器上运行的结果 :
[root@jianzhao jianzhao]#
[root@jianzhao jianzhao]# cat /etc/redhat-release
CentOS release 6.5 (Final)
[root@jianzhao jianzhao]#
[root@jianzhao jianzhao]# cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 58
model name : Intel(R) Xeon(R) CPU E3-1225 V2 @ 3.20GHz
stepping : 9
cpu MHz : 1600.000
cache size : 8192 KB
physical id : 0
siblings : 4
core id : 0
cpu cores : 4
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
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 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 sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm ida arat epb xsaveopt pln pts dts tpr_shadow vnmi flexpriority ept vpid fsgsbase smep erms
bogomips : 6385.26
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual
power management:
。。。。。。。。。。。。。
[root@jianzhao jianzhao]# cat /proc/cpuinfo | grep 'vmx' --color=always
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 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 sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm ida arat epb xsaveopt pln pts dts tpr_shadow vnmi flexpriority ept vpid fsgsbase smep erms
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 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 sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm ida arat epb xsaveopt pln pts dts tpr_shadow vnmi flexpriority ept vpid fsgsbase smep erms
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 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 sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm ida arat epb xsaveopt pln pts dts tpr_shadow vnmi flexpriority ept vpid fsgsbase smep erms
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 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 sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm ida arat epb xsaveopt pln pts dts tpr_shadow vnmi flexpriority ept vpid fsgsbase smep erms
[root@jianzhao jianzhao]#
【 yum install qemu-kvm libvirt libvirt-client python-virtinst virt-manager virt-viewer bridge-utils 】
[root@jianzhao jianzhao]# lsmod | grep kvm
kvm_intel 54285 0
kvm 333172 1 kvm_intel
[root@jianzhao jianzhao]#
[root@jianzhao jianzhao]#
[root@jianzhao jianzhao]# ls /dev/kvm
/dev/kvm
[root@jianzhao jianzhao]#
[root@jianzhao jianzhao]#
[root@jianzhao jianzhao]# /etc/init.d/libvirtd restart
Stopping libvirtd daemon: [ OK ]
Starting libvirtd daemon: [ OK ]
[root@jianzhao jianzhao]#
[root@jianzhao jianzhao]# ps awx | grep libvirtd
4471 ? Sl 0:00 libvirtd --daemon
4564 pts/1 S+ 0:00 grep libvirtd
[root@jianzhao jianzhao]#
[root@jianzhao jianzhao]#
注意,如果有需要的话要更改 /etc/libvirtd/qemu.conf 配置文件,更改完成后需要restart libvirtd : service libvirtd restart
具体更改内容请自行google :)
Done!!!
Bridge 在虚拟化中非常重要,因为它是guest OS与外部通信的桥梁。网桥在host OS中定义,它是一个虚拟设备,负责与guest OS通信,将guest OS的数据包转发出去,所以host OS必须要能够转发数据包,也就是你必须要吧host OS的 ip_forward 设置为1。其实linux 中的网桥比传统的物理网桥设备功能更宽泛一点,我们还可以在这个linux网桥上ip配置,从而我们的host OS仍然可以使用,因为原来的host OS的网卡已经成为了混杂模式。而且,linux 的网桥其实也是一个简单的软件交换机, 多个guest OS可以通过网桥互相通信, 继续讲的话,这里面水就深了。。。。。
我自己机器的网桥配置如下 :
[root@jianzhao jianzhao]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=F0:92:1C:DF:90:D4
TYPE=Ethernet
UUID=b51bf9ae-5e71-4c1f-a60f-05ad1aa399f9
ONBOOT=yes
BRIDGE=br0
NM_CONTROLLED=yes
#BOOTPROTO=dhcp
[root@jianzhao jianzhao]#
[root@jianzhao jianzhao]# cat /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
#HWADDR=F0:92:1C:DF:90:D4
TYPE=Bridge
#UUID=b51bf9ae-5e71-4c1f-a60f-05ad1aa399f9
BOOTPROTO=static
BROADCAST=192.168.1.255
IPADDR=192.168.1.181
NETMASK=255.255.255.0
NETWORK=192.168.1.0
GATEWAY=192.168.1.2
ONBOOT=yes
#NM_CONTROLLED=yes
#BOOTPROTO=dhcp
[root@jianzhao jianzhao]#
然后重新启动网络 : service network restart 就可以了。
需要注意的一点是,你必须吧NetworkManager服务关闭,否则你的网桥有可能配置布成功。
看我的网络重新启动后的网络设置 :
[root@jianzhao jianzhao]# ifconfig
br0 Link encap:Ethernet HWaddr F0:92:1C:DF:90:D4
inet addr:192.168.1.181 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::f292:1cff:fedf:90d4/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:23032 errors:0 dropped:0 overruns:0 frame:0
TX packets:27926 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:16231492 (15.4 MiB) TX bytes:5844412 (5.5 MiB)
eth0 Link encap:Ethernet HWaddr F0:92:1C:DF:90:D4
inet6 addr: fe80::f292:1cff:fedf:90d4/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3186176 errors:0 dropped:0 overruns:0 frame:0
TX packets:1680551 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:4722364181 (4.3 GiB) TX bytes:120774447 (115.1 MiB)
Interrupt:20 Memory:f7c00000-f7c20000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:26517 errors:0 dropped:0 overruns:0 frame:0
TX packets:26517 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:30134171 (28.7 MiB) TX bytes:30134171 (28.7 MiB)
virbr0 Link encap:Ethernet HWaddr 52:54:00:0D:F9:05
inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
[root@jianzhao jianzhao]#
[root@jianzhao jianzhao]#
br0是网桥,我为其配置了静态地址,这个需要手工配置(配置文件), eth为running状态,但是没有IP地址,因为现在br0已经取代eth0作为host OS的通信网卡, lo为本地环回口, virbr0是libvirtd服务创建的网口。
终于到了最后一步了,安装虚拟客户机操作系统,我选择的是和host OS一样的 CentOS 6.5, 我使用的工具是virt-install, 本来我想使用virt-manager,可是启动不了,只好放弃,virt-manager是一个图形化的虚拟机管理工具,按说还是不错的。
以前,virt 工具组还不成熟时,我们需要手工调用qemu-kvm命令来创建和管理虚拟机,现在使用virt-XXXX 会方便许多, virt-XXXX 基于libvirt 库, 现在很多做云计算的公司,尤其是公有云的提供商,都是自己基于virt-XXX,或者直接基于libvirt库做一些管理层面的开发,其最终的目的其实和virt-manager一样,提供便利的虚拟化操作工具而已,只不过他们的工具可能比virt-manager更方便,功能更多,能管理的虚拟机规模更大而已。
我使用的命令行是 :
【 virt-install -v -n kvm_centos65_1 -r 1024 -vcpus=2 --disk path=/root/work/kvm/images/kvm_centos65_1.img,size=10 --graphics vnc --cdrom=/root/work/kvm/isos/CentOS-6.5-x86_64-bin-DVD1.iso --virt-type=kvm --accelerate 】
注意,kvm_centos65_1.img 与 CentOS-6.5-x86_64-bin-DVD1.iso 不能放到 ‘/home’ 目录下,这个原因我目前还不清楚 :(
这条命令运行后,就是普通的linux安装过程了, 和你在一台普通物理机器上安装linux没什么区别。
安装完成后可以用 virsh 命令来查看虚拟机的运行情况 :
[root@jianzhao jianzhao]#
[root@jianzhao jianzhao]# virsh list
Id Name State
----------------------------------------------------
4 kvm_centos65_1 running
[root@jianzhao jianzhao]#
virsh是一个非常强大的管理工具, 需要大家仔细研究一番。