一、虛擬化分類
1、虛擬化,是指通過虛擬化技術將一台計算機虛擬為多台邏輯計算機。在一台計算機上同時運行多個邏輯計算機,每個邏輯計算機可運行不同的操作系統,並且應用程序都可以在相互獨立的空間內運行而互相不影響,從而顯著提高計算機的工作效率。
2、虛擬化層次種類:
(1) 完全虛擬化 --- 最流行的虛擬化方法使用名為 hypervisor(含鵬兒v) 的一種軟件,在虛擬服務器和底層硬件之間建立一個抽象層。 VMware 和微軟的VirtualPC 是代表該方法的兩個商用產品,而基於核心的虛擬機 (KVM) 是面向 Linux 系統的開源產品hypervisor 可以捕獲 CPU 指令,為指令訪問硬件控制器和外設充當中介。因而,完全虛擬化技術幾乎能讓任何一款操作系統不用改動就能安裝到虛擬服務器上,而它們不知道自己運行在虛擬化環境下。主要缺點是, hypervisor 給處理器帶來開銷
(2)准虛擬化 --- 完全虛擬化是處理器密集型技術,因為它要求 hypervisor管理各個虛擬服務器,並讓它們彼此獨立。減輕這種負擔的一種方法就是,改動客戶端操作系統,讓它以為自己運行在虛擬環境下,能夠與hypervisor 協同工作。這種方法就叫准虛擬化 (para-virtualization)Xen 是開源准虛擬化技術的一個例子。操作系統作為虛擬服務器在 Xen hypervisor 上運行之前,它必須在核心層面進行某些改變。因此, Xen 適用於 BSD 、 Linux 、 Solaris 及其他開源操作系統,但不適合對像Windows 這些專有的操作系統進行虛擬化處理,因為它們無法改動。准虛擬化技術的優點是性能高。經過准虛擬化處理的服務器可與hypervisor 協同工作,其響應能力幾乎不亞於未經過虛擬化處理的服務器。准虛擬化與完全虛擬化相比優點明顯,以至於微軟和 VMware 都在開發這項技術,以完善各自的產品。
(3)系統虛擬化 --- 就操作系統層的虛擬化而言,沒有獨立的hypervisor 層。相反,主機操作系統本身就負責在多個虛擬服務器之間分配硬件資源,並且讓這些服務器彼此獨立。一個明顯的區別是,如果使用操作系統層虛擬化,所有虛擬服務器必須運行同一操作系統 ( 不過每個實例有各自的應用程序和用戶。
賬戶 ) 。雖然操作系統層虛擬化的靈活性比較差,但本機速度性能比較高。此外,由於架構在所有虛擬服務器上使用單一、標准的操作系統,管理起來比異構環境要容易。
(4)桌面虛擬化 --- 服務器虛擬化主要針對服務器而言,而虛擬化最接近用戶的還是要算的上桌面虛擬化了,桌面虛擬化主要功能是將分散的桌面環境集中保存並管理起來,包括桌面環境的集中下發,集中更新,集中管理。桌面虛擬化使得桌面管理變得簡單,不用每台終端單獨進行維護,每台終端進行更新。終端數據可以集中存儲在中心機房里,安全性相對傳統桌面應用要高很多。桌面虛擬化可以使得一個人擁有多個桌面環境,也可以把一個桌面環境供多人使用。
3、虛擬化架構分類
(1)1型虛擬化
Hypervisor 直接安裝在物理機上,多個虛擬機在 Hypervisor 上運行。Hypervisor 實現方式一般是一個特殊定制的 Linux 系統。Xen 和 VMWare 的 ESXi 都屬於這個類型。
(2)2型虛擬化
物理機上首先安裝常規的操作系統,比如 Redhat、Ubuntu 和 Windows。Hypervisor 作為 OS 上的一個程序模塊運行,並對管理虛擬機進行管理。KVM、VirtualBox 和 VMWare Workstation 都屬於這個類型。
斯托曼的gun運動把軟件開源化
2 、KVM --- 全稱是基於內核的虛擬機(Kernel-based Virtual Machine)(vm guest ———— 虛擬機)
Host ————宿主機
是一個開源軟件,基於內核的虛擬化技術,實際是嵌入系統的一個虛擬化模塊,通過優化內核來使用虛擬技術,該內核模塊使得 Linux 變成了一個Hypervisor,虛擬機使用 Linux 自身的調度器進行管理。
KVM 是基於虛擬化擴展(Intel VT 或者 AMD-V)的 X86 硬件的開源的 Linux 原生的全虛擬化解決方案。KVM 中,虛擬機被實現為常規的 Linux 進程,由標准 Linux 調度程序進行調度;虛機的每個虛擬 CPU 被實現為一個常規的 Linux 進程。這使得 KMV 能夠使用 Linux 內核的已有功能。但是,KVM 本身不執行任何硬件模擬,需要客戶空間程序通過 /dev/kvm 接口設置一個客戶機虛擬服務器的地址空間,向它提供模擬的 I/O,並將它的視頻顯示映射回宿主的顯示屏。目前這個應用程序是 QEMU。
3、Linux 上的用戶空間、內核空間、虛機:
Guest:客戶機系統,包括CPU(vCPU)、內存、驅動(Console、網卡、I/O 設備驅動等),被 KVM 置於一種受限制的 CPU 模式下運行。
KVM:運行在內核空間,提供CPU 和內存的虛級化,以及客戶機的 I/O 攔截。Guest 的 I/O (硬盤,網卡,主機)被 KVM 攔截后,交給 QEMU 處理。
QEMU:修改過的為 KVM 虛機使用的 QEMU 代碼,運行在用戶空間,提供硬件 I/O 虛擬化,通過IOCTL /dev/kvm 設備和 KVM 交互。
4、KVM有一個內核模塊叫 kvm.ko,只用於管理虛擬 CPU 和內存。IO 的虛擬化,就交給 Linux 內核和qemu來實現。
Libvirt:是 KVM 的管理工具。Libvirt 除了能管理 KVM 這種 Hypervisor,還能管理 Xen,VirtualBox 等。OpenStack 底層也使用 Libvirt。
Libvirt 包含 3 個東西:后台 daemon 程序 libvirtd、API 庫和命令行工具 virsh
(1)libvirtd是服務程序,接收和處理 API 請求;
(2)API 庫使得其他人可以開發基於 Libvirt 的高級工具,比如 virt-manager,這是個圖形化的 KVM 管理工具,后面我們也會介紹;
(3)virsh 是我們經常要用的 KVM 命令行工具,后面會有使用的示例。作為 KVM 和 OpenStack 的實施人員,virsh 和 virt-manager 是一定要會用的。
三、虛擬化VT開啟確認
你當前的 CPU 是否支持 VT 技術?當不確定你當前 CPU 是否支持 VT 技術時
1. 可以在 windows 下使用 cpu-z 軟件來進行測試
2. 可以在 Linux 下查看 CPU 的相信信息來確定
虛擬化技術與多任務超線程的技術的區別?
虛擬化技術與多任務以及超線程技術是完全不同的。多任務是指在一個操作系統中多個程序同時並行運行,而在虛擬化技術中,則可以同時運行多個操作系統,而且每一個操作系統中都有多個程序運行,每一個操作系統都運行在一個虛擬的 CPU 或者是虛擬主機上;而超線程技術只是單 CPU 模擬雙 CPU 來平衡程序運行性能,這兩個模擬出來的 CPU 是不能分離的,只能協同工作
nmtui圖形化配置ip
[root@zxw9 ~]# systemctl status NetworkManager
NetworkManager運行的nmtui
安裝kvm前准備工作
1. 確定處理器有 VT
[root@zxw9 ~]# egrep '(vmx|svm)' /proc/cpuinfo
命令行: grep vmx /proc/cpuinfo (INTEL 芯片 )
grep svm /proc/cpuinfo (AMD 芯片 )
cat /proc/cpuinfo | grep -e vmx -e nx -e svm
開啟vmx|svm
Cpu:egrep '(vmx|svm)' /proc/cpuinfo
內存:free -h
磁盤:lsblk
不知道芯片的生產廠商則輸入:egrep '(vmx|svm)' /proc/cpuinfo
如果 flags: 里有 vmx 或者 svm 就說明支持 VT ;如果沒有任何的輸出,說明你的 cpu 不支持,將無法成功安裝 KVM 虛擬機。
2. 當你硬件本身支持虛擬化,但查詢相應參數無果時,請檢查 BIOS 設定,確認你的 BIOS 中開啟了硬件支持虛擬化的功能!
將如下選項設為Enabled
Intel(R) Virtualization Tech [Enabled]
四、KVM虛擬化安裝
1. 安裝 KVM 要求(本地源)
(1)64bitCPU( 支持虛擬化 VT-x or AMD-V)
(2)2G 以上空閑內存,確認內存大小
grep -e MemTotal /proc/meminfo
free -m
(3)6GB 空閑存儲空間
[root@zxw9 yum.repos.d]# cat bendi.repo
[bendi]
name = my repo
enabled = 1
gpgcheck = 0
baseurl = file:///mnt
[root@zxw6 yum.repos.d]#
檢測
[root@zxw6 yum.repos.d]# yum makecache
2. 安裝 KVM 並檢測
(1)YUM 安裝 KVM
yum install kvm virt-manager libvirt libvirt-python python-virtinst libvirt-client qemu-kvm qemu-img
沒有可用軟件包 kvm。
軟件包 virt-manager-1.4.0-2.el7.noarch 已安裝並且是最新版本
軟件包 libvirt-2.0.0-10.el7.x86_64 已安裝並且是最新版本
軟件包 libvirt-python-2.0.0-2.el7.x86_64 已安裝並且是最新版本
沒有可用軟件包 python-virtinst。
軟件包 libvirt-client-2.0.0-10.el7.x86_64 已安裝並且是最新版本
軟件包 10:qemu-kvm-1.5.3-126.el7.x86_64 已安裝並且是最新版本
軟件包 10:qemu-img-1.5.3-126.el7.x86_64 已安裝並且是最新版本
無須任何處理
第二步:啟動
[root@zxw9 yum.repos.d]# systemctl start libvirtd
查看狀態
【root@zxw9 yum.repos.d]# systemctl status libvirtd
開機自啟
[root@zxw9 yum.repos.d]# systemctl enable libvirtd
(2)YUM 安裝 KVM( 簡單版 )
yum install kvm virt-manager libvirt*
第三步:檢查
[root@zxw9 yum.repos.d]# virsh list --all
Id 名稱 狀態
----------------------------------------------------
第四步:查看
[root@zxw9 yum.repos.d]# yum grouplist
已加載插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
已安裝環境分組:
帶 GUI 的服務器
可用的環境分組:
最小安裝
基礎設施服務器
計算節點
文件及打印服務器
基本網頁服務器
虛擬化主機
GNOME 桌面
KDE Plasma Workspaces
開發及生成工作站
可用組:
傳統 UNIX 兼容性
兼容性程序庫
圖形管理工具
安全性工具
開發工具
控制台互聯網工具
智能卡支持
科學記數法支持
系統管理
系統管理工具
第五步:下載帶 GUI 的服務器
[root@zxw9 yum.repos.d]# yum groupinstall "帶 GUI 的服務器" -y
第六步:切換桌面化
[root@zxw9 yum.repos.d]# startx
1,2,c,c
(4)kvm虛擬化所需組件
介紹
kvm: 核心套件
virt-manager: 圖形化 KVM 管理軟件
libvirt: 提供虛擬機與宿主相互通信的機制
libvirt-python: 允許使用 libvirt API
python-virtinst:CLI 下創建 KVM 的工具
libvirt-client: 提供 client 訪問 kvm 服務器的機制 ,並包含 virsh 命令進行
管理和控制 VMs
qemu-kvm: 提供用戶級 KVM 環境
qemu-img:VMs 磁盤管理
3.啟動 KVM
(1)modprobe kvm 加載 kvm 模塊
(2)lsmod | grep kvm 查看加載成功
(3)systemctl start libvirtd
(4)systemctl status libvirtd
4. 啟動並檢測 KVM
virsh list --all
如出現
Id Name State
-------------------------------------------------------
則安裝成功
5. 在 GUI 模式下安裝虛擬機,啟動虛擬系統管理器
五、KVM網絡模式設置
1. NAT ( 默認上網 ) :虛擬機利用 host 機器的 ip 進行上網 . 對外顯示一個 ip,
virbr0 是 KVM 默認創建的一個 Bridge,其作用是為連接其上的虛機網卡提供 NAT 訪問外網的功能,默認ip為192.168.122.1
brctl show
2. 自帶的Bridge : 將虛擬機橋接到 host 機器的網卡上 ,vm和 host 機器都通過 bridge 上網 . 對外有同網段的不通 ip,此種方式host卻不能和vm聯通
3. Linux Bridge : 基本原理就是創建一個橋接接口 br0 ,在物理網卡和虛擬網絡接口之間傳遞數據。此種方式host卻可以和vm聯通
Linux Bridge 是 Linux 上用來做 TCP/IP 二層協議交換的設備,其功能大家可以簡單的理解為是一個二層交換機或者 Hub。多個網絡設備可以連接到同一個 Linux Bridge,當某個設備收到數據包時,Linux Bridge 會將數據轉發給其他設備
(1)添加 br0 網卡的配置文件
cd /etc/sysconfig/network-scripts
cp ifcfg-eth0 ifcfg-br0
(2)修改網卡配置文件
Vim ifcfg-eth0
TYPE=Ethernet
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=br0
Vim ifcfg-br0
TYPE=Bridge
NAME=br0
DEVICE=br0
ONBOOT=yes
BOOTPROTO=none
IPADDR=192.168.254.20
PREFIX=24(NETMASK=255.255.255.0)
GATEWAY=192.168.254.1
DNS=192.168.254.251
(3)重啟host:reboot
(4)檢查
# ethtool br0
# brctl show
# ifconfig br0
第一步:vim ifcfg-ens33
TYPE="Ethernet"
DEVICE="ens33"
ONBOOT=yes
NAME=ens33
BRIDGE=br0
第二步:
[root@zxw6 network-scripts]# cat ifcfg-br0
第三步:重啟
[root@zxw6 network-scripts]# systemctl restart network
NAME=br0
DEVICE=br0
ONBOOT=yes
BOOTPROTO=none
IPADDR=192.168.126.6
NETMASK=255.255.255.0
GATEWAY=192.168.126.2
DNS=172.16.254.110
DNS2=114.114.114.114
TYPE=Bridge
第四步:查看
[root@zxw6 network-scripts]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP qlen 1000
link/ether 00:0c:29:5c:6c:9e brd ff:ff:ff:ff:ff:ff
3: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
link/ether 52:54:00:05:d2:91 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 1000
link/ether 52:54:00:05:d2:91 brd ff:ff:ff:ff:ff:ff
5: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master virbr0 state UNKNOWN qlen 1000
link/ether fe:54:00:26:f7:95 brd ff:ff:ff:ff:ff:ff
inet6 fe80::fc54:ff:fe26:f795/64 scope link
valid_lft forever preferred_lft forever
6: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
link/ether 00:0c:29:5c:6c:9e brd ff:ff:ff:ff:ff:ff
inet 192.168.126.6/24 brd 192.168.126.255 scope global br0
valid_lft forever preferred_lft forever
inet6 fe80::3023:fdff:feee:f0aa/64 scope link
valid_lft forever preferred_lft forever
[root@zxw6 network-scripts]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000c295c6c9e no ens33
virbr0 8000.52540005d291 yes virbr0-nic
vnet0