虛擬化是雲計算的基礎。簡單的說,虛擬化使得在一台物理的服務器上可以跑多台虛擬機,虛擬機共享物理機的 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重啟系統生效