一、简介
虚拟化是指计算机组件在虚拟的基础上而不是在真实的基础上运行,虚拟化技术可以扩大硬件的容量,简化软件的重新配置过程,允许一个平台同时运行多个操作系统,并且应用程序都可在相互独立的空间运行而相互不影响彼此,从而提高计算机的运行效率。KVM是一个开源的虚拟化软件,英文名为kernel-base virtual machine,基于内核的虚拟机,KVM在2007年2月被导入Linux 2.6.20核心中,以可加载核心模块的方式被移植到FreeBSD上。
虚拟化技术分类:
主机虚拟化:完全虚拟化(KVM)、半虚拟化(XEN)
用户空间虚拟化:LXC,OPENVZ
应用程序虚拟化:JVM
KVM相关简介:
KVM是开源软件,全称是kernel-based virtual machine(基于内核的虚拟机)。
是x86架构且硬件支持虚拟化技术(如 intel VT 或 AMD-V)的Linux全虚拟化解决方案。
它包含一个为处理器提供底层虚拟化 可加载的核心模块kvm.ko(kvm-intel.ko或kvm-AMD.ko)。
KVM还需要一个经过修改的QEMU软件(qemu-kvm),作为虚拟机上层控制和界面。
KVM能在不改变linux或windows镜像的情况下同时运行多个虚拟机,(它的意思是多个虚拟机使用同一镜像)并为每一个虚拟机配置个性化硬件环境(网卡、磁盘、图形适配器……)。
在主流的Linux内核,如2.6.20以上的内核均已包含了KVM核心。
KVM 内存管理:
KVM 继承了 Linux 系统管理内存的诸多特性,比如,分配给虚拟使用的内存可以被交换至交换空间、能够使用大内存页以实现更好的性能,以及对 NUMA 的支持能够让虚拟机高效访问更大的内存空间等。
KVM 基于 Intel 的 EPT ( ExtendedPage Table )或 AMD 的 RVI ( Rapid Virtualization Indexing )技术可以支持更新的内存虚拟功能,这可以降低 CPU 的占用率,并提供较好的吞吐量。
此外,KVM 还借助于 KSM ( Kernel Same-pageMerging )这个内核特性实现了内存页面共享 。 KSM 通过扫描每个虚拟机的内存查找各虚拟机间相同的内存页,并将这些内存页合并为一个被各相关虚拟机共享的单独页面。在某虚拟机试图修改此页面中的数据时, KSM 会重新为其提供一个新的页面副本。实践中,运行于同一台物理主机上的具有相同 GuestOS 的虚拟机之间出现相同内存页面的概率是很的,比如共享库、内核或其它内存对象等都有可能表现为相同的内存页,因此, KSM 技术可以降低内存占用进而提高整体性能。
KVM组件:
/dev/kvm:管理虚拟机的设备节点,用户空间的程序可通过其ioctl()系统调用集来完成虚拟机的创建启动等管理工作;它是一个字符设备;其主要完成的操作包括:
qemu进程:工作于用户空间的组件,用于仿真PC机的I/O类硬件设备;
qemu全称Quick Emulator。是独立虚拟软件,能独立运行虚拟机(根本不需要kvm)。kqemu是该软件的加速软件。kvm并不需要qemu进行虚拟处理,只是需要它的上层管理界面进行虚拟机控制。虚拟机依旧是由kvm驱动。
二、KVM虚拟化安装
前提:
①确保cpu执行HVM
grep -E "(svm|vmx)" /proc/cpuinfo
②内核编译提供了KVM模块
modinfo kvm
[root@node1 ~]# grep -E "(vmx|svm)" /proc/cpuinfo #确保支持使用虚拟化 flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic popcnt aes xsave avx f16c hypervisor lahf_lm svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw xop fma4 tbm arat npt svm_lock nrip_save vmcb_clean flushbyasid decodeassists bmi1 flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic popcnt aes xsave avx f16c hypervisor lahf_lm svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw xop fma4 tbm arat npt svm_lock nrip_save vmcb_clean flushbyasid decodeassists bmi1 [root@node1 ~]# [root@node1 ~]# modinfo kvm #确保存在此模块 filename: /lib/modules/3.10.0-327.el7.x86_64/kernel/arch/x86/kvm/kvm.ko license: GPL author: Qumranet rhelversion: 7.2 srcversion: 13ED0467630AC8D418AB2C8 depends: intree: Y vermagic: 3.10.0-327.el7.x86_64 SMP mod_unload modversions signer: CentOS Linux kernel signing key sig_key: 79:AD:88:6A:11:3C:A0:22:35:26:33:6C:0F:82:5B:8A:94:29:6A:B3 sig_hashalgo: sha256 parm: ignore_msrs:bool parm: min_timer_period_us:uint parm: kvmclock_periodic_sync:bool parm: tsc_tolerance_ppm:uint parm: lapic_timer_advance_ns:uint parm: halt_poll_ns:uint [root@node1 ~]# ll /dev/kvm #虚拟主机节点管理 crw-rw-rw-+ 1 root kvm 10, 232 Dec 11 15:11 /dev/kvm
安装:
yum -y install libvirt virt-manager virt-viewer virt-install qemu-kvm #其中libvirt提供虚拟化服务,其配置文件为/etc/libvirt/libvirt.conf,unit file:libvirtd.service #以下为用户空降管理工具 virt-manager virt-viewer virt-install #配置好后启动服务 systemctl start libvirtd.service
三、项目部署kvm虚拟化
在部署之前需准备配置环境:关闭网络管理,创建桥接接口,虚拟机网卡充当交换机的作用。
[root@node1 ~]# systemctl stop NetworkManager [root@node1 ~]# virsh iface-bridge eno16777736 br0 -no-stp #配置成桥接接口 [root@node1 ~]# ifconfig br0: flags=4163mtu 1500 inet 10.1.10.65 netmask 255.255.0.0 broadcast 10.1.255.255 inet6 fe80::20c:29ff:fe2e:3557 prefixlen 64 scopeid 0x20 ether 00:0c:29:2e:35:57 txqueuelen 0 (Ethernet) RX packets 694 bytes 57740 (56.3 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 101 bytes 13261 (12.9 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 #此时物理机接口就类似于交换机使用 eno16777736: flags=4163 mtu 1500 ether 00:0c:29:2e:35:57 txqueuelen 1000 (Ethernet) RX packets 270458 bytes 37652584 (35.9 MiB) RX errors 0 dropped 85 overruns 0 frame 0 TX packets 5761 bytes 826732 (807.3 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@node1 ~]#virt-manager #启动图形化界面创建虚拟机
图形化安装图示:
使用virsh-manager命令后将出现此图形界面,注意如未此命令需安装virt-manager程序包,需选择安装源。
配置其内存大小及其cpu核心个数
设置主机名存储空间大小等配置
本过程使用已搭建好的cobbler自动化安装
如下为在虚拟机中虚拟出一个虚拟机:
四、virsh命令使用及其实现虚拟磁盘扩容
virsh命令使用:
create:创建并启动域 domuuid:获取域的uuid domid:获取域的id dominfo:域的信息 reboot:重启域 destroy:关闭域 shutdown:关闭域 save:保存状态至某文件中 pause:暂停域 resume:恢复暂停的域 管理域的资源: setmem:改变内存大小,不能超过装机时的最大值 setvcpus:修改域的vcpu数量 setmaxmem:设置内存最大值 vcpuinfo:显示vcpu的信息 实时修改内存大小: [root@node1 ~]# virsh list #显示已创建的虚拟机,此处在虚拟机中运行着两台使用kvm虚拟化出来的虚拟机 Id Name State ---------------------------------------------------- 3 centos6s running 4 centos6.6 running [root@node1 ~]# [root@node1 ~]# virsh vcpuinfo centos6.6 #查看其虚拟cup的状态信息 VCPU: 0 CPU: 0 State: running CPU time: 0.2s CPU Affinity: yy VCPU: 1 CPU: 1 State: running CPU time: 0.1s CPU Affinity: yy [root@node1 ~]# virsh dominfo error: command 'dominfo' requiresoption [root@node1 ~]# virsh dominfo centos6.6 Id: 4 Name: centos6.6 UUID: 9f12e96f-7bf4-469d-b3e8-79f7e1cf4eee OS Type: hvm State: running CPU(s): 2 CPU time: 6.8s Max memory: 524288 KiB Used memory: 524288 KiB Persistent: yes Autostart: disable Managed save: no Security model: none Security DOI: 0 #指定域的xml格式配置文件,使用此配置文件可快速创建kvm虚拟机 #将此配置文件作出相应的修改提供镜像模板,及其xml配置文件即可快速生成大批量虚拟机 #如下标签需修改: / /
虚拟磁盘扩容:
[root@node1 ~]# qemu-img create -f qcow2 -o ? Supported options: size Virtual disk size compat Compatibility level (0.10 or 1.1) backing_file File name of a base p_w_picpath backing_fmt Image format of the base p_w_picpath encryption Encrypt the p_w_picpath cluster_size qcow2 cluster size preallocation Preallocation mode (allowed values: off, metadata, falloc, full) lazy_refcounts Postpone refcount updates #创建磁盘映像文件大小为20G [root@node1 ~]# qemu-img create -f qcow2 -o preallocation=metadata /tmp/test.qcow2 20G Formatting '/tmp/test.qcow2', fmt=qcow2 size=21474836480 encryption=off cluster_size=65536 preallocation='metadata' lazy_refcounts=off [root@node1 ~]# ls -lh /tmp/test.qcow2 -rw-r--r-- 1 root root 21G Dec 11 17:12 /tmp/test.qcow2 #将磁盘映像文件添加至kvm虚拟机中 [root@node1 ~]# virsh attach-disk centos6.6 /tmp/test.qcow2 vdb Disk attached successfully #表示添加成功 [root@node1 ~]# #在创建的kvm虚拟机中查看是否存在此虚拟磁盘 [root@localhost ~]# fdisk -l Disk /dev/vda: 85.9 GB, 85899345920 bytes 16 heads, 63 sectors/track, 166440 cylinders Units = cylinders of 1008 * 512 = 516096 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x000ab84c Device Boot Start End Blocks Id System /dev/vda1 * 3 409 204800 83 Linux Partition 1 does not end on cylinder boundary. /dev/vda2 409 125239 62914560 8e Linux LVM Partition 2 does not end on cylinder boundary. Disk /dev/mapper/vg0-root: 21.5 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Disk /dev/mapper/vg0-swap: 2147 MB, 2147483648 bytes 255 heads, 63 sectors/track, 261 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Disk /dev/mapper/vg0-usr: 10.7 GB, 10737418240 bytes 255 heads, 63 sectors/track, 1305 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Disk /dev/mapper/vg0-var: 21.5 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 #查看到此vdb时则说明添加至此的虚拟磁盘生效,可对其进行分区格式化使用 Disk /dev/vdb: 21.5 GB, 21478375424 bytes 16 heads, 63 sectors/track, 41617 cylinders Units = cylinders of 1008 * 512 = 516096 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 [root@localhost ~]# fdisk -cu /dev/vdb Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel with disk identifier 0x67288332. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable. Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) Command (m for help): Disk /dev/vdb: 21.5 GB, 21478375424 bytes 16 heads, 63 sectors/track, 41617 cylinders, total 41949952 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x35c26476 Device Boot Start End Blocks Id System /dev/vdb1 2048 20480 9216+ 83 Linux /dev/vdb2 20481 41949951 20964735+ 83 Linux Command (m for help): #后续即格式化挂载使用即可
总结:kvm虚拟化技术有着隔离的功能,应用程序都可在相互独立的空间运行而相互不影响彼此,在大型公司运用广泛,上诉所写的内容只是一个入门级别,知道相应的原理之后可结合使用脚本完成自动化的部署,通过脚本自动完成创建虚拟机。