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