QEMU虛擬機、源碼 【虛擬化與云原生】
時間:2023-06-29 17:24:01 | 來源:網站運營
時間:2023-06-29 17:24:01 來源:網站運營
QEMU虛擬機、源碼 【虛擬化與云原生】:
QEMU 概述
QEMU的幾個特點:
- QEMU可以被當作模擬器,也可以被當作虛擬機。
- 當QEMU被當作模擬器時,我們可以在一臺機器上通過模擬設備,運行針對不同于本機上CPU的程序或者操作系統(tǒng)。(使用了動態(tài)翻譯技術,在我們的虛擬化環(huán)境中并沒有使用,因此不展開敘述)
- 當QEMU被當作虛擬機使用時,QEMU必須基于Xen Hypervisor或者KVM內核模塊才能支持虛擬化。在這種條件下QEMU虛擬機可以通過直接在本機CPU上運行客戶機代碼獲得接近本機的性能。
QEMU與KVM的關系
- 當QEMU在模擬器模式下,運行操作系統(tǒng)時,我們可以認為這是一種軟件實現(xiàn)的虛擬化技術,它的效率比真機差很多,用戶可以明顯地感覺出來。
- 當QEMU在虛擬機模式下,QEMU必須在Linux上運行,并且需要借助KVM或者Xen,利用Intel或者Amd提供的硬件輔助虛擬化技術,才能使虛擬機達到接近真機的性能。
- QEMU與KVM內核模塊協(xié)同工作,在虛擬機進程中,各司其職,又相互配合,最終實現(xiàn)高效的虛擬機應用。
我們我們主要學習的是QEMU與KVM協(xié)同工作實現(xiàn)虛擬化的代碼。
QEMU與KVM的關系如下:
- KVM在物理機啟動時創(chuàng)建/dev/kvm設備文件,當創(chuàng)建虛擬機時,KVM為該虛擬機進程創(chuàng)建一個VM的文件描述符,當創(chuàng)建vCPU時,KVM為每個vCPU創(chuàng)建一個文件描述符。
- 同時,KVM向用戶空間提供了一系列針對特殊設備文件的ioctl系統(tǒng)調用。QEMU主要是通過ioctl系統(tǒng)調用與KVM進行交互的。
QEMU和KVM如何分工協(xié)作呢?
我們用一張圖說明:
- QEMU所實現(xiàn)的功能包括:虛擬機的配置和創(chuàng)建、虛擬機運行依賴的虛擬設備、虛擬機運行時用戶操作環(huán)境和交互(vnc)以及一些針對虛擬機的特殊技術(如動態(tài)遷移),都是QEMU自己實現(xiàn)的。同時QEMU還實現(xiàn)了利用KVM提供的接口實現(xiàn)虛擬機硬件加速。
- KVM的主要功能在于初始化CPU硬件,打開虛擬化模式,然后將虛擬客戶機運行在虛擬機模式下,并對虛擬客戶機的運行提供支持,這些支持主要是以針對相關的特殊設備文件的ioctl系統(tǒng)調用。
外設的模擬一般不會由KVM負責,只有對性能要求較高的虛擬設備,如虛擬中斷控制器和虛擬時鐘,是由KVM模擬的,這樣可以大量減少處理器的模式轉換的開銷。
QEMU的代碼結構
線程事件驅動模型
系結構正如上圖展示的——每個vCPU都是一個線程,這些vCPU線程可以運行客戶機的代碼,以及虛擬中斷控制器、虛擬時鐘的模擬。
而Main loop主線程則是Event-driver的,通過輪詢文件描述符,調用對應的回調函數(shù),處理由Monitor發(fā)出的命令、Timers超時,并且實現(xiàn)VNC、完成IO等功能。
QEMU事件驅動的代碼主要可以查看include/qemu/main-loop.h,以及相關的實現(xiàn)代碼。
QEMU設備模擬
- QEMU為了實現(xiàn)大量設備的模擬,實現(xiàn)了比較完備的面向對象模型——QOM(QEMU Object Model),QEMU對于CPU、內存、總線以及主板的模擬都是依賴于QOM的。
- QEMU中設備相關的數(shù)據(jù)結構的初始化工作都是依賴于QOM的初始化實現(xiàn)機制,對于它的實現(xiàn)主要可以查看include/qom/object.h。
- 對于具體的CPU、內存等設備的模擬,可以查看include/qom/cpu.h、include/exec/memory.h、include/hw/qdev-core.h
QEMU虛擬機管理命令
QEMU中可以使用hmp command對虛擬機進行管理,在虛擬機環(huán)境中同時按住ctrl、Alt、2就可以進入QEMU的命令模式,通過輸入命令,就可以進行虛擬機的管理。
比如savevm命令可以把虛擬機的當前狀態(tài)保存到虛擬機的磁盤中,這些命令的實現(xiàn)函數(shù)都有一個統(tǒng)一的命名方式:hmp_xxx,比如hmp_savevm就是savevm的實現(xiàn)函數(shù)的起始位置,
hmp_migrate就是migrate的實現(xiàn)函數(shù)的起始位置,因此對于QEMU中的每一條命令都可以很快找到相關的實現(xiàn)函數(shù)。
塊操作
- QEMU實現(xiàn)了大量的塊設備驅動,從而支持了包括qcow2、qed、raw等格式的鏡像,這些格式的實現(xiàn)代碼都在block的文件夾下以及主目錄下的block.c中。
- QEMU設計了BlockDriver數(shù)據(jù)結構,其中包含了大量的回調函數(shù)指針,對于每一種磁盤格式,都有一個對應的BlockDriver的對象,并且實現(xiàn)了BlockDriver中的回調函數(shù),然后將這個BlockDriver的對象注冊,即添加到一個全局的BlockDriver的鏈表中。
QEMU源碼編譯
QEMU的編譯過程并不復雜,首先進入QEMU的代碼目錄后,首先運行./configure –help,查看qemu支持的特性。
選擇相關的特性進行編譯,由于我們使用的X86_64的平臺,我們使用下列命令配置:
./configure –enable-debug –enable-kvm –target-list=x86_64-softmmu
上述命令會生成Makefile文件,然后直接make就可以了,為了加速編譯可以使用多線程:make -j number。
./configure命令運行時會檢查物理機的環(huán)境,檢查需要的相關的庫是否已經安裝在宿主機上。
因此可能由于相關庫沒有安裝而中斷,其中一些庫包括:
pkg-config、zlib1g-dev、libglib2.0-dev、libpixman-1-dev、make等,庫都可以通過ubuntu的包管理命令apt-get install直接安裝。
如果需要把QEMU安裝到系統(tǒng)中可以使用make install命令。
后面我會單獨介紹 QEMU+KVM《純命令行方式安裝管理虛擬機》記錄的文章,如感興趣可查閱。
閱讀代碼的工具
閱讀代碼的工具Source Insight 4.0,軟件資料鏈接百度網盤地址:
鏈接:
https://pan.baidu.com/s/1iYhR31FuJTLP1BeXxjKYOQ提取碼:5iqa
此文件夾中有一些常用工具,大家自行下載。
安裝方法簡述:
下載 “SI4安裝及PJ文件.zip” 和 “sourceinssight.rar” 兩個文件,具體安裝方法參考第一個文件夾中說明。
qemu 源碼到官網上自行下載。
https://www.qemu.org/download/此篇只是簡單介紹 qemu 相關特征,以及作為虛擬機使用時,與kvm之間關系;此篇內容相對簡單,但是對與初次接觸 虛擬化的同學來說非常重要。此篇可一窺全貌,后面在接觸virtio、virtio-net、vhost-net、kvm等知識時,不會迷路。筆者親身體驗過迷路的感受 ^=^ ,過程有點疼苦 。
虛擬化相關資料匯總
References
- QEMU Emulator User Documentation: 404 Not Found
- The Linux usage model for device tree data: https://www.kernel.org/doc/Documentation/devicetree/usage-model.txt
- pecification for virtio devices: http://docs.oasis-open.org/virtio/virtio/v1.0/csprd01/virtio-v1.0-csprd01.pdf
KVM
- KVM website: http://www.linux-kvm.org
- Arm VM specification: http://lwn.net/Articles/589122/
- Supporting KVM on Arm architecture: http://lwn.net/Articles/557132/
QEMU
? QEMU website:
http://www.qemu.org/? QEMU WIKI:
https://wiki.qemu.org/Main_PageDevice Trees
devicetree.org website:
http://devicetree.orgDTC, the device tree compiler is available at: The Device Tree Compiler .
DTC also includes a library called libfdt which can be used by software to parse device trees.
Virtio-- a framework for doing virtual I/O using KVM/QEMU
?
http://www.ibm.com/developerworks/linux/library/l-virtio/?
http://ozlabs.org/~rusty/virtio-spec/virtio-paper.pdf?
http://docs.oasis-open.org/virtio/virtio/v1.0/csprd01/virtio-v1.0-csprd01.pdfVirtual Networking with QEMU
?
http://wiki.qemu.org/Documentation/Networking?
http://www.linux-kvm.org/page/Networking轉載自::https://blog.csdn.net/weixin_38387929/article/details/120121636
Dpdk/網絡協(xié)議棧/vpp/OvS/DDos/NFV/虛擬化/高性能專家-學習視頻教程學習資料、教學視頻和學習路線圖有需要的可以自行添加學習交流群973961276