1. 程式人生 > >Linux虛擬化技術KVM、QEMU與libvirt的關系(轉)

Linux虛擬化技術KVM、QEMU與libvirt的關系(轉)

實例 -c html cef 處理器 虛擬 處理 不足 lan

說明:個人理解,KVM是內核虛擬化技術,而內核是不能使用在界面上使用的,那麽此時QEMU提供了用戶級別的使用界面,相互輔助。當然,單獨使用QEMU也是可以實現一整套虛擬機,不過QEMU+KVM基本是標配Linux虛擬機管理工具。

一、介紹:

主要分為三個部分。第一部分是虛擬化技術介紹;第二部分是KVM、QEMU與libvirt介紹,第三部分是對網卡的虛擬介紹。

第一部分:

這一部分是對當期存在的虛擬機技術進行簡單的總結與講解,很多是一句而過的。其實每一個技術都可以重新寫出一篇內容豐富的博客,但是每個技術不是本篇文章的重點,所以不對每一個技術進行詳細論述。歡迎對每個技術進行評論與糾錯。

虛擬化定義:

虛擬化主要指的是特殊的技術,通過隱藏特定計算平臺的實際物理特性,為用戶提供抽象的、統一的、模擬的計算環境(稱為虛擬機)(IBM定義)。虛擬化為有效利用大型機的資源提供了技術支持。虛擬機技術也是多種多樣,而可以虛擬的層次或者可虛擬的方面也是遍布從硬件到應用層整個計算機系統。如圖片所示:

技術分享圖片

虛擬機分類:

虛擬機的分類也是多種多樣。可以通過是否在裸機上部署來分為面向主機的的虛擬機和面向裸機的虛擬機。面向主機的虛擬機是指的在一臺已經安裝操作系統的主機上安裝虛擬機管理(VMM)程序,而面向裸機的是指在裸機上直接安裝虛擬機管理程序,所有的虛擬機調用都是直接由虛擬機管理程序來負責,沒有了操作系統這一步,所以這種方式在效率上要高於面向主機的。不過,比較流行的技術比如vmware,Xen都是面向主機的。

然後根據上面的圖去分類的話,可以分為對硬件的虛擬和對操作系統或者對軟件的虛擬。在硬件虛擬化這個層面,又有三種不同的技術:

1、Full Virtualization(全虛擬化),幾乎是完整地模擬一套真實的硬件設備。大部分操作系統無須進行任何修改即可直接運行在全虛擬化環境中。像KVM等技術是全虛擬化。

2、Partial Virtualization(部分虛擬化),僅僅提供了對關鍵性計算組件或者指令集的模擬。操作系統可能需要做某些修改才能夠運行在部分虛擬化環境中。

3、Paravirtualization(半虛擬化),不對硬件設備進行模擬,虛擬機擁有獨立的運行環境,通過虛擬機管理程序共享底層的硬件資源。大部分操作系統需要進行修改才能夠運行在半虛擬化環境中。它的性能要稍微高於全虛擬化。像Xen。因為需要改動托管系統的內核,所以Xen是不支持win虛擬機的。

另外還有像硬件輔助虛擬化,就是宿主機的硬件架構在一定程度上提供對虛擬化的支持。像Intel-VT與AMD-V都提供了這等架構支持,請參考給出的參考資料。

軟件層面的虛擬化,往往是指在同一個操作系統實例的基礎上提供多個隔離的虛擬運行環境,也常常被稱為容器技術。LXC(Linux Container)則是采用了這種技術,它主要是采用了Linux本身提供的技術,在一定程度上模擬虛擬化。軟件虛擬化也可以理解成進程級虛擬機,其他虛擬化成為系統級虛擬機。在進程級虛擬機中負責虛擬化的軟件成為運行時軟件,而系統級虛擬機中負責虛擬化的軟件成為VMM(Virtual Machine Monitor)

對於硬件與軟件虛擬化兩種技術,都是存在優點和缺點。對於硬件虛擬化,我們討論全虛擬化和部分虛擬化。因為現在大部分的虛擬化技術Xen、KVM都支持這兩種。硬件虛擬化基本上就是在一臺宿主機上虛擬了整個系統,各臺虛擬機之間相互不可見。這會很明顯導致很多重復的線程和重復的內存頁出現,性能上肯定會有影響。所以采用這種技術,一臺宿主機上虛擬機的個數肯定會有一定限制。

對於軟件虛擬化,我們討論LXC,因為只有這一種我用過。LXC是通過cgroup對線程進行隔離,對資源進行限制;通過Namespace對調用系統提供的系統調用來進行資源隔離。LXC介紹。通過此也可以看出,它所有虛擬化出來的虛擬機都是運行在宿主機本身上的,它的線程和資源對宿主機都是可見的。這就不存在很多重復的線程和內存也的問題,所以一臺宿主機上可以通過此技術虛擬出更多的虛擬機。

最近非常流行的Docker也是軟件虛擬化的一種,它的原理也是使用了Linux提供的namespace對資源進行隔離,不過它提供了比LXC更強大的功能實現。

第二部分:

這一部分就是主要介紹三個組件的不同功能,更多的細節亟待補充,也歡迎評論進行補充,糾錯。

KVM介紹:

對於KVM來說,其是一款支持虛擬機技術,而且是Linux內核中的一個功能模塊。它在Linux2.6.20之後的任何Linux分支中都被支持。它還有一個條件,對硬件要求的條件,必須達到一定標準的硬件架構。對於Intel-VT與AMD-V都是支持的。對於是否支持也可以通過命令行查看:egrep ‘(vmx|svm)‘ --color=always /proc/cpuinfo。如果有任何內容則說明當期硬件架構是支持KVM的,否則就不支持。另外,就算支持,但是在bios中是默認設置不打開該功能的,所以你還要去bios設置其為enable。當設置成功之後,還需要關機一次,註意是關機而不是重啟。否則該設置的更改就不起效。

QEMU

QEMU是什麽。其實它也是一款虛擬化技術,就算不使用KVM,單傳的QEMU也可以完全實現一個虛擬機。那為何還會有QEMU-KVM這個名詞那。是因為雖然KVM的技術已經相當成熟而且可以對很多東西進行隔離,但是在某些方面還是無法虛擬出真實的機器。比如對網卡的虛擬,那這個時候就需要另外的技術來做補充,而QEMU-KVM則是這樣一種技術。它補充了KVM技術的不足,而且在性能上對KVM進行了優化。

libvirt

libvirt又是個什麽東東。它是一系列提供出來的庫函數,用以其他技術調用,來管理機器上的虛擬機。包括各種虛擬機技術,KVM、Xen與lxc等,都可以調用libvirt提供的api對虛擬機進行管理。有這麽多的虛擬機技術,它為何能提供這麽多的管理功能那。是因為它的設計理念,它是面向驅動的架構設計。對任何一種虛擬機技術都開發設計相對於該技術的驅動。這樣不同虛擬機技術就可以使用不同驅動,而且相互直接不會影響,方便擴展。而且libvirt提供了多種語言的編程接口,可以直接通過編程,調用libvirt提供的對外接口實現對虛擬機的操作。如今流行的雲計算中的IaaS是與該庫聯系相當密切的。通過下圖可以看出它的架構設計思想。

從該圖可以看出,在libvirt api之上會有很多個driver,對於每一種虛擬機技術都會有一種driver,用來充當該虛擬機技術與libvirt之間的包裝接口。如此設計就可以避免libvirt需要設計各種針對不同虛擬機技術的接口,它主要關註底層的實現,提供對外接口調用,而不同的虛擬機技術通過調用libvirt提供的接口來完成自己所需要的功能。

技術分享圖片

第三部分:

這一部分主要講解,在虛擬機中如何對網絡進行虛擬,或者說如何連接網絡的。

一般虛擬機虛擬網絡的設置主要包括三種方式。主要如下:

NAT模式

也有人稱此種模式為HOST(宿主)模式。在這種模式下虛擬機可以理解成沒有自己的獨立網卡。所有訪問虛擬機的請求其實是直接發送給宿主機,然後通過訪問宿主機轉發到虛擬機上的。相應的虛擬機訪問其他網絡,也是先轉發到宿主機然後在轉發出去。對於宿主機之外的網絡,是不知道該虛擬機存在的。

Bridge模式

橋接模式是使用比較多的模式,它是虛擬機擁有自己的獨立網卡和IP,然後通過借用宿主機的網卡對外連接網絡。它把宿主機的網卡當作了一種橋,通過這個橋連接外網的世界。在這種模式下,可以簡單的理解成虛擬機和宿主機是兩個不同的機器,有獨立IP可以相互訪問。對於虛擬機的IP獲取,一般可以直接指定也可以通過DHCP獲取得到。

Internal模式

這個是把虛擬機之間的網絡和主機的網絡隔離開來。虛擬機是一片網絡,主機也是一片網絡,彼此之間不能相互訪問。

二、關系:

KVM虛擬機是基於Linux內核虛擬化,自Linux2.6.20之後就集成在Linux的各個主要發行版本中。它使用Linux自身的調度器進行管理,所以相對於Xen,其核心源碼很少。KVM的虛擬化需要硬件的支持(如intel VT技術或者AMD V技術),是基於硬件的完全虛擬化。而Xen早期則是基於軟件模擬的para-virtualization,新版本是基於硬件支持的完全虛擬化。

QEMU是一種模擬處理器,現在運用最多的就是將KVM和QEMU結合起來。

準確來說,KVM是Linux Kernel的一個模塊,可以用命令modprobe去加載KVM模塊。加載了該模塊後,才能進一步通過工具創建虛擬機。但是僅有KVM模塊是不夠的。因為用戶無法直接控制內核去做事情,還必須有一個運行在用戶空間的工具才行。這個用戶空間的工具,KVM開發者選擇了已經成型的開源虛擬化軟件QEMU。說起來QEMU也是一個虛擬化軟件。它的特點是可虛擬不同的CPU。比如說在x86的CPU上可虛擬一個power的CPU,並可利用它編譯出可運行在power上的CPU,並可利用它編譯出可運行在power上的程序。KVM使用了QEMU的一部分,並稍加改造,就成了可控制KVM的用戶空間工具了。所以你會看到,官方提供的KVM下載有兩大部分(QEMU和KVM)三個文件(KVM模塊、QEMU工具以及二者的合集)。也就是說,你可以只升級KVM模塊,也可以只升級QEMU工具。這就是KVM和QEMU 的關系。

如下圖:

技術分享圖片

Linux Kernel-based Virtual Machine (KVM) 是一款 Linux 開放源碼虛擬化軟件,基於硬件虛擬化擴展(Intel VT- X 和 AMD-V)和QEMU的修改版。KVM的實現模塊又兩個,分別是: kvm.ko是提供核心虛擬化的基礎架構;特定於處理器的模塊kvm-intel.ko和kvm-amd.ko 。其設計目標是在需要引導多個未改動的P 操作系統時支持完整的硬件模擬。

一個普通的Linux進程有兩種運行模式:內核和用戶。而KVM增加了第三種模式:客戶模式(有自己的內核和用戶模式)。在KVM模型中,每一個虛擬機都是由Linux調度程序管理的標準進程。

KVM由兩個部分組成:一個是管理虛擬硬件的設備驅動,該驅動使用字符設備/dev/kvm作為管理接口;另一個是模擬PC硬件的用戶空間組件,這是一個稍作修改的QEMU進程。

參考:

VirtManager介紹 : http://virt-manager.org/

波佩克與戈德堡虛擬化需求:wiki波佩克與戈德堡虛擬化需求

Linux namespace介紹 :https://lwn.net/Articles/531114/

Intel-VT介紹:Intel-VT介紹

http://blog.csdn.net/zwan0518/article/details/10613481(以上內容部分轉自此篇文章)

http://blog.chinaunix.net/uid-16361381-id-211999.html

http://blog.csdn.net/chdhust/article/details/7557791

https://www.cnblogs.com/bakari/p/7858029.html

http://blog.csdn.net/chdhust/article/details/7557791(以上內容部分轉自此篇文章)

Linux虛擬化技術KVM、QEMU與libvirt的關系(轉)