2018年第13周-虛擬化技術理解(內含Centos7上安裝KVM)

虛擬化技術簡介

說道KVM,那必須先提虛擬化技術,我網上查的資料,貌似你們對虛擬化的一些術語沒有達成統一的標準,如:仿真、徹底虛擬化、超虛擬化、操做系統級虛擬化。
其實我以爲這些術語沒有統一,也僅僅是由於角度的問題。也或許是理解不深,因此我這說的也僅僅是我的理解,可能也是理解不夠深,僅供參考。
而單單連虛擬化這詞,在不一樣人,不一樣層面上理解,都不同。html

神級別的虛擬化(虛擬化的起源)

先站住計算機科學的層面來看,也就是站在神級別的角度去看(僅僅爲了說得生動而已,並不是神化科學),站在神級別的角度來看什麼是虛擬化,準確來講是虛擬化的起源:前端

它的存在已經超過 50多年了。虛擬化技術最先用在包括 IBM的704四、麻省理工學院(MIT)的 CTSS(Compatible Time Sharing System)以及曼徹斯特大學的 Atlas 項目(世界上最先的超級計算機之一),這些都是請求頁面調度和監管進程調用的先驅。

硬件虛擬化

IBM 早在 20 世紀 60 年代開發 System/360™ Model 67 大型機時就認識到了虛擬化的重要性。Model 67 經過 VMM(Virtual Machine Monitor)對全部的硬件接口都進行了虛擬化。在早期計算中,操做系統被稱爲supervisor。可以在運行其餘操做系統的操做系統被稱爲 hypervisor(這個術語是在 20 世紀 70 年代出現的)。
VMM 能夠直接在底層硬件上運行,容許運行多個虛擬機(VM)。每一個 VM 均可以運行一個本身私有操做系統的實例 —— 在早些時候,這稱爲 CMS(或 Conversational Monitor System)。以後 VM 繼續發展,如今您能夠在 System z9™ 大型機上發現 VM。這提供了很好的向後兼容性,甚至是對 System/360 產品線的兼容性。

這裏,這個hypervisor術語有點重要,要考的。在早期計算中,操做系統被稱爲supervisor。可以在運行其餘操做系統的操做系統被稱爲 hypervisor。python

處理器虛擬化

虛擬化早期的另一種用法(在本例中是對處理器的仿真)是 P-code(或僞碼)機。P-code 是一種機器語言,運行於虛擬機而不是實際硬件。P-code 早在 20 世紀 70 年代就已在加州大學聖地亞哥分校(UCSD)Pascal 系統上很有名氣了,它將 Pascal 程序編譯成 P-code,而後在一個 P-code 虛擬機上運行。這就使 P-code 程序具備了高度的可移植性,並且,只要有可用的 P-code 虛擬機,P-code 程序就能夠運行。
20 世紀 60 年代對 BCPL(Basic Combined Programming Language)的設計中也採用了相同的概念,C 語言即由 BCPL 發展而來。在這種用法中,編譯器會將 BCPL 代碼編譯成稱爲 O-code 的中間機器代碼。接下來的第二個步驟是將 O-code 編譯成目標機器的原始語言。現代編譯器所使用的這種模型爲將編譯器移植到新目標體系結構上提供了很大的靈活性(經過一種中間語言將前端和後端分隔開來)。

soga,原來C的設計也是有這麼一方面的考慮。-0-這虛擬化概念牽涉真深。linux

指令集虛擬化

虛擬化最新的發展稱爲指令集虛擬化,或者二進制轉換。在這種模型中,虛擬指令集被轉換成底層硬件的物理指令集,這個過程一般都是動態的。當代碼執行時,就會對代碼的某個段進行轉換。若是出現分支狀況,就會導入新代碼集並進行轉換。這使它與緩存操做很是相似,後者是將指令塊從內存移動到本地快速緩存中執行。
這種模型最近在 Transmeta 設計的 Crusoe 中央處理單元(CPU)中獲得了使用。二進制轉換由 Code Morphing 的專利技術實現。相似的一個例子是徹底虛擬化解決方案經過運行時代碼掃描來查找和重定向特權指令(用來解決特定處理器指令集的一些問題)。

這麼一說,好像是Java的JIT(just-in-time) 即時編譯vim

當虛擬機發現某個方法或代碼塊運行特別頻繁時,就會把這些代碼認定爲「Hot Spot Code」(熱點代碼),爲了提升熱點代碼的執行效率,在運行時,虛擬機將會把這些代碼編譯成與本地平臺相關的機器碼,並進行各層次的優化,完成這項任務的正是 JIT 編譯器。

人級別的虛擬化(你們常說的虛擬化)

而這個層面,虛擬化是:後端

虛擬化是指在同一臺物理服務器上模擬多臺虛擬機的能力,且每臺虛擬機在邏輯上擁有獨立的CPU、內存、硬盤和網絡接口等。虛擬化能夠提升硬件資源的利用率,使多個應用能隔離的運行在同一臺物理機上。

站在廣義的虛擬化來看(知道我爲何上面用神級別虛擬化來代替吧,我真不知道比廣義還廣的應該叫啥,知道的同窗能夠幫忙科普下):
虛擬化分爲硬件層面的虛擬化軟件層面的虛擬化centos

硬件層面的虛擬化

硬件層面的虛擬化,我發現好像不少人是站在這個角度去看的,因此才把這裏面的虛擬化技術分爲:仿真、徹底虛擬化、超虛擬化、超虛擬化、操做系統級虛擬化(這個應該屬於軟件層面的虛擬化,放在這裏方便統一記憶)。api

在硬件虛擬化的層面,現代虛擬化技術一般是全虛擬和半虛擬的混合體。常見的硬件虛擬化技術例如VMWare、Xen和KVM都同時支持全虛擬化和半虛擬化。硬件虛擬化方式提供的虛擬機,都獨立的運行着一個完整的操做系統,這樣在同一臺物理宿主機上存在大量相同或者類似的進程和內存頁,從而致使較大的性能損耗(好比:宿主機操做系統是Centos,使用KVM生成的多個虛擬機,且在每一個虛擬機中都運行Windows操做系統和相同的QQ程序,這樣宿主機的性能必然產生較大損耗)。所以,硬件虛擬化也被稱爲重量級虛擬化,在同一宿主機上可以同時運行的虛擬機數量至關有限。

這層面虛擬化項目有:緩存

項目 類型 許可證
Bochs 仿真 LGPL
QEMU 仿真 LGPL/GPL
VMware 徹底虛擬化 私有
z/VM 徹底虛擬化 私有
Xen 超虛擬化 GPL
UML 超虛擬化 GPL
Linux-VServer 操做系統級虛擬化 GPL
OpenVZ 操做系統級虛擬化 GPL

一句話:硬件層面的虛擬化,就是在硬件上面模擬出N套硬件出來,N套硬件上能夠裝不一樣的系統,而後不一樣的虛擬化技術就是層次不同,從而形成性能、便利等有所區別。服務器

軟件層面的虛擬化

而站在這個角度裏看,有些人都把上述的硬件層面的虛擬機化統稱爲徹底虛擬化(這個概念跟上面的硬件層面的虛擬化中的「徹底虛擬化」衝突了,可能會有困惑,理解角度不同看到就不同,這或許就沒那麼困惑)。

指在同物理服務器上提供多個隔離的虛擬運行環境,也被稱爲容器技術。在軟件虛擬化的層面,同一宿主機上的全部虛擬機(又稱Container)共享宿主機的操做系統實例,不存在因爲運行多個操做系統實例所形成的性能損耗(好比:宿主機的操做系統爲Centos,經過軟件虛擬化技術生成多個Container,且每一個Container都運行着QQ程序,因爲它們共享同一個宿主機Centos操做系統,全部Container中QQ程序的進程在Centos中只有一個)。所以,軟件虛擬化也被稱爲輕量級虛擬化,在同一宿主機上可以同時運行的虛擬運行環境數量比較寬鬆。以Solaris操做系統上的Container爲例,一個Solaris操做系統的實例理論上能夠支持多達8000個Container(實際可以運行的Container數量取決於系統資源和負載)。與此相似,Linux操做系統上的LXC也能夠輕鬆地在同一宿主機上同時支持數量可觀的虛擬運行環境。

LXC技術就是屬於這層次上面,對應的項目有:Linux-VServer、OpenVZ和另一個鼎鼎大名的Docker

虛擬化性能分析(XEN/KVM/LXC)

參考 http://blog.chinaunix.net/uid...
三種虛擬化性能比較 LXC>>KVM>>XEN

因爲LXC使用cgroup機制,其性能損壞基本爲0。

三種虛擬化隔離比較 XEN>>KVM>>LXC

LXC只能虛擬化linux。

三種虛擬化內存利用率 LXC>>KVM>>XEN

因爲LXC共用內核,內存利用率最高;其餘兩種方案每一個虛機都須要單獨的操做系統佔用一部份內存空間。

虛擬化的演變和發展

到了這個層次,虛擬化應該誕生出行業的區別。誕生出的行業有:雲計算、大數據

雲計算

比較有表明性就是亞馬遜AWS和開源項目Openstack

大數據

比較有表明性的是Hadoop

這裏就不展開的說,再展開或許就有點跑偏題。
另外,虛擬化也能夠將多臺計算機組合成一臺計算機的形式呈現出來。這一般稱爲服務器聚合網格計算

安裝步驟

準備工做

1.裝centos7時,SOFTWARE SELECTION這選項選擇Virtualization Host
2.進入系統後,修改host

hostnamectl --static set-hostname cdh-host.c7.jevoncode.com

3.關閉SELinux

vim /etc/selinux/config
將第一個enable改成disable

4.關閉防火牆

systemctl stop firewalld.service
systemctl mask firewalld.service

5.新建橋接的網卡,假設現有以太網的網卡是eth0,則改成如下

進入目錄: cd /etc/sysconfig/network-scripts/
TYPE="Ethernet"
BOOTPROTO="none"
DEFROUTE="yes"
PEERDNS="yes"
PEERROUTES="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="eth0"
UUID="0cd981cd-8d6c-4802-a185-c64770110711"
DEVICE="eth0"
ONBOOT="yes"
BRIDGE="br0"

其中BOOTPROTO、BRIDGE、ONBOOT是須要改以外,其餘都是系統安裝時的樣子便可
6.在當前目錄新建配置ifcfg-br0(複製ifcfg-eth0更名爲ifcfg-br0),內容以下:

TYPE="Bridge"
BOOTPROTO="static"
DEFROUTE="yes"
PEERDNS="yes"
PEERROUTES="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="br0"
UUID="0cd981cd-8d6c-4802-a185-c64770110711"
DEVICE="br0"
ONBOOT="yes"
IPADDR=192.168.1.108
PREFIX=16
GATEWAY=192.16.1.1
DNS1=192.168.1.1

其中TYPE、BOOTPROTO、BRIDGE、ONBOOT、NAME、DEVICE、IPADDR、PREFIX、GATEWAY、DNS1是須要改以外,其餘都是複製ifcfg-eth0的便可

  1. 上述兩個網卡我需說一下,此時只能啓動br0,若是ifup eth0,它會提示
device p4p1 is already a member of a bridge; can't enslave it to bridge br0

也就只能ifup br0,因此br0的IPADDR最好就是設置以前eth0獲取的ip,另外gateway的查詢是: netstat -rn 或 route -n

netstat -rn 
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         192.168.1.1      0.0.0.0         UG        0 0          0 br0
192.168.0.0      0.0.0.0         255.255.0.0     U         0 0          0 br0
192.168.122.0   0.0.0.0         255.255.255.0   U         0 0          0 virbr0

(以0.0.0.0開始的行的Gateway是默認網關)
DNS的查詢則是

cat /etc/resolv.conf

注,需查看本身CPU支不支持虛擬化:

egrep '(vmx|svm)' /proc/cpuinfo

有vmx(Intel)或svm(AMD)字樣,就說明CPU的支持的。

安裝kvm

當上面準備工做都作好,就能夠安裝kvm了
1.安裝KVM程序包及其依賴

yum install qemu-kvm libvirt virt-install bridge-utils -y

kvm相關程序包及其做用:

安裝包 做用
qumu-kvm KVM核心模塊
libvirt 虛擬機管理工具,對虛擬機進行操做的集成各類接口庫函數的中間件
python-virtinst 記錄建立VM的xml文件
bridge-utils 網橋支持工具
virt-viewer 圖形查看功能
virt-manager 安裝圖形界面管理虛擬機,virt-manager經過libvirt實現對虛擬機的操做
  1. 驗證安裝結果,此命令有輸出說明KVM模塊被正確加載
lsmod | grep kvm

3.開啓kvm服務,而且設置其開機自動啓動

systemctl start libvirtd
systemctl enable libvirtd

4.兩個方式查看kvm服務運行情況

systemctl status libvirtd
systemctl is-enabled libvirtd

新建虛擬機

1.新建虛擬機命令:

virt-install \
--virt-type=kvm \
--name=centos7A \
--vcpus=2 \
--memory=4096 \
--location=/root/CentOS-7-x86_64-DVD-1708.iso \
--disk path=/home/vms/centos7A.qcow2,size=40,format=qcow2 \
--network bridge=br0 \
--graphics none \
--extra-args='console=ttyS0' \
--force

2.安裝可過程是命令式安裝centos的,此過程跟圖像界面很相似,這就略過了

虛擬機經常使用命令

1.退出連接虛擬機:ctrl+]
2.查看虛擬機列表

virsh list --all

3.連接虛擬機

virsh console centos7A

4.啓動虛擬機

virsh start centos7C

5.刪除虛擬機

virsh undefine centos7A
rm -rf /home/vms/centos7A.qcow2

虛擬機複製

KVM的虛擬機複製分兩種狀況:

本機複製

1.關閉虛擬機

virsh shutdown centos7A

2.查看虛擬機鏡像文件在哪

virsh edit centos7A

如下標籤就是文件的路徑

<source file='/home/vms/centos7A.qcow2'/>

``
3.將centos7A複製爲centos7B

virt-clone -o  centos7A -n centos7B -f /home/vms/centos7B.qcow2

4.便可連接虛擬機centos7B了

非本機複製

這目的就是完成相似用VirtualBox的導出功能,導出來給其餘機子上使用
1.建立新虛擬機centos7B的配置文件

virsh dumpxml centos7A > /etc/libvirt/qemu/centos7B.xml

2.進入centos7A鏡像的目錄/home/vms/,複製鏡像

cp centos7A.qcow2 centos7B.qcow2

3.用vim修改配置文件centos7B.xml,修改name,uuid,disk文件位置,mac地址
4.經過新虛擬機的配置文件,定義一個虛擬機:

virsh define /etc/libvirt/qemu/centos7B.xml

注:uuid能夠網上找個工具生成,但mac地址必定是新物理機有的mac地址,若是是本機複製,那就不用改mac地址

TroubleShoot

1.非本機複製時,define一個虛擬機時報:

錯誤:從 /etc/libvirt/qemu/centos7C.xml 定義域失敗
錯誤:XML error: expected unicast mac address, found multicast '23:F6:7F:2B:67:5D'

那是由於所造的mac地址是組播地址,要非組播的mac地址才行,開頭大於24便可

2.

錯誤:開始域 centos7C 失敗
錯誤:unsupported configuration: guest and host CPU are not compatible: Host CPU does not provide required features: x2apic, hypervisor, rdseed, adx, smap, 3dnowprefetch; try using 'Broadwell-noTSX' CPU model
相關文章
相關標籤/搜索