虚拟化是云计算的基础。简单的说,虚拟化使得在一台物理的服务器上可以跑多台虚拟机,虚拟机共享物理机的 CPU、内存、IO 硬件资源,但逻辑上虚拟机之间是相互隔离的。

物理机我们一般称为宿主机(Host),宿主机上面的虚拟机称为客户机(Guest)。

那么 Host 是如何将自己的硬件资源虚拟化,并提供给 Guest 使用的呢? 
这个主要是通过一个叫做 Hypervisor 的程序实现的。

  • 2.虚拟化的分类


①Hypervisor 直接安装在物理机上,多个虚拟机在 Hypervisor 上运行。Hypervisor 实现方式一般是一个特殊定制的 Linux 系统。Xen 和 VMWare 的 ESXi 都属于这个类型。

②物理机上首先安装常规的操作系统,比如 Redhat、Ubuntu 和 Windows。Hypervisor 作为 OS 上的一个程序模块运行,并对管理虚拟机进行管理。KVM、VirtualBox 和 VMWare Workstation 都属于这个类型。

理论上讲: 
①号虚拟化一般对硬件虚拟化功能进行了特别优化,性能上比2型要高; 
②号虚拟化因为基于普通的操作系统,会比较灵活,比如支持虚拟机嵌套。嵌套意味着可以在KVM虚拟机中再运行KVM。

  • 3.KVM的介绍

KVM 全称是 Kernel-Based Virtual Machine。也就是说 KVM 是基于 Linux 内核实现的。 
KVM有一个内核模块叫 kvm.ko,只用于管理虚拟 CPU 和内存。

那 IO 的虚拟化,比如存储和网络设备由谁实现呢? 
这个就交给 Linux 内核和Qemu来实现。

说白了,作为一个 Hypervisor,KVM 本身只关注虚拟机调度和内存管理这两个方面。IO 外设的任务交给 Linux 内核和 Qemu。

  • 4.Libvrit

Libvirt是KVM的管理工具,Libvirt包含3个组成部分:后台daemon程序libvirtd、API库、和命令行工具virsh
①libvirtd是服务程序,接收和处理API请求;
②API库是可以基于libvirt的开发工具,例如vir-manager
③virsh是KVM的命令行工具,比如在实际生产中,图形界面无法使用或无法通过vnc链接云主机时,可以通过virsh命令行进行操作。

  • 5.KVM的安装

(1)查看cpu是否支持虚拟化

[root@linux-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 dts mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf eagerfpu pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm arat pln pts dtherm tpr_shadow vnmi ept vpid fsgsbase smep xsaveopt

(2)安装qemu-kvm(用户态管理工具),libvirt(命令行管理工具),virt-install(安装kvm工具)

[root@linux-node1 ~]#  yum install -y qemu-kvm libvirt
[root@linux-node1 ~]#  yum install -y virt-install

(3)启动libvirtd服务,查看是否创建多出一个虚拟网卡:virbr0

[root@linux-node1 ~]# systemctl enable libvirtd
[root@linux-node1 ~]# systemctl start libvirtd
[root@linux-node1 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.56.11  netmask 255.255.255.0  broadcast 192.168.56.255
        inet6 fe80::20c:29ff:fe03:f3fe  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:03:f3:fe  txqueuelen 1000  (Ethernet)
        RX packets 224847  bytes 330431521 (315.1 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 96423  bytes 9122932 (8.7 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 204  bytes 16460 (16.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 204  bytes 16460 (16.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:67:fb:26  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

(4)创建虚拟机
安装kvm虚拟机的需求:硬盘,光盘镜像。
①创建的虚拟机内存大小不能超过物理机的大小;
②创建的虚拟机不需要每次都安装启动,只需要通过镜像进行启动。

[root@linux-node1 ~]# qemu-img create -f raw /opt/CentOS-7-x86_64.raw 10G
Formatting '/opt/CentOS-7-x86_64.raw', fmt=raw size=10737418240 
[root@linux-node1 ~]# virt-install --virt-type kvm --name CentOS-7-x86_64 --ram 1024 \
> --cdrom=/tmp/CentOS-7-x86_64-DVD-1611.iso --disk path=/opt/CentOS-7-x86_64.raw \
> --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole

Starting install...
Domain installation still in progress. You can reconnect to 
the console to complete the installation process.

然后快速用TightVNS链接192.168.56.11,按"Tab"键,然后输入:net.ifnames=0 biosdevname=0,更改网卡名称为eth0.按"Enter"进入安装。如图:

  • 6.总结思路

1.创建虚拟磁盘
2.通过virt-install安装一台虚拟机
3.通过TightVNC客户端工具连接到192.168.56.11:5900进行安装操作,默认qumu-kvm的端口是5900端口,端口从5900计算.

  • 7.遇到的问题总结

1.如果多次执行安装:
1.删除 rm -f /opt/CentOS-7-x86_64.raw
2.虚拟机的名称,需要指定--name参数进行修改

virt-install --virt-type kvm --name CentOS-dxxxx7-x86_64 --ram 1024 \
 --cdrom=/tmp/CentOS-7-x86_64-DVD-1611.iso --disk path=/opt/CentOS-7-x86_64.raw \
 --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole

2.如何删除KVM创建的桥接网卡:

brctl show
ifconfig br0 down
brctl delbr br0
systemctl restart network

3.如何在Centos 7 系统安装完毕修改网卡名为eth0:
(1)首先,先编辑网卡的配置文件 vi /etc/sysconfig/network-scripts/ifcfg-ens33 将里面的NAME项修改为eth0
继续,重命名该配置文件
(2)然后,禁用该可预测命名规则。对于这一点,你可以在启动时传递“net.ifnames=0 biosdevname=0 ”的内核参数。这是通过编辑/etc/default/grub并加入“net.ifnames=0 biosdevname=0 ”到GRUBCMDLINELINUX变量来实现的。
(3)运行命令grub2-mkconfig -o /boot/grub2/grub.cfg 来重新生成GRUB配置并更新内核参数。
(4)reboot重启系统生效