轉自:http://blog.csdn.net/julykobe/article/details/27571387
注:本文內容均來自網絡,我只是在此做了一些摘抄和整理的工作,來源均有注明。
0、虛擬化
虛擬化簡介
我們首先簡要介紹一下虛擬化,闡述 QEMU 的搭建背景。
本文中介紹的虛擬化實際上指的是平台虛擬化。在物理硬件上,控制程序可能是主機操作系統或管理程序(見圖 1)。在某些情況下,主機操作系統就是管理程序。來賓操作系統位於管理程序中。在某些情況下,來賓操作系統與控制程序使用相同的 CPU,而在另外一些情況下,則可能不同(比如 PowerPC 來賓操作系統在 x86 硬件上運行)。
圖 1. 平台虛擬化的基本架構
您可以通過多種方法實現虛擬化,但是最常見的有三種。第一種稱為本地虛擬化(或全虛擬化)。在這種虛擬化中,管理程序實現基本的隔離元素,將物理硬件與來賓操作系統相分離。這種技術首次出現於 1966 年 IBM® CP-40 虛擬機/虛擬內存操作系統中,另外 VMware ESX Server 也使用了此技術。
另一種流行的虛擬化技術稱為半虛擬化。在半虛擬化中,控制程序實現了管理程序的應用程序接口(API),它將由來賓操作系統使用。Xen 和 Linux Kernel-based Virtual Machine (KVM) 都使用了半虛擬化技術。
第三種有用的技術稱為仿真。仿真,顧名思義,通過模擬完整的硬件環境來虛擬化來賓平台。仿真可通過多種方法實現,即使在同一個解決方案中也是如此。通過仿真實現虛擬化的技術有 QEMU 和 Bochs。
1、KVM
KVM是Kernel-based Virtual Machine的縮寫。從Linux kernel 2.6.20開始就包含在Linux內核代碼之中,使用這個或者更高版本內核的Linux發行版,就直接可以使用KVM。KVM依賴於host CPU的虛擬化功能的支持(Intel-VT & AMD-V),類似於Xen的HVM,對於guest OS的內核沒有任何的要求,可以直接支持創建Linux和Windows的虛擬機。

2、QEMU
- 模擬(emulator)
- 虛擬化(virtualizer)
模擬:就是在一種CPU架構上模擬另一種CPU架構,運行程序。例如:在x86環境上模擬ARM的運行環境,執行ARM程序,或者在PowerPC環境上模擬x86指令集。
虛擬化:就是在host OS上運行guest OS的指令,並為guest OS提供虛擬的CPU、RAM、IO和外圍設備。
ioctl(KVM_RUN)switch (exit_reason) {case KVM_EXIT_IO: /* ... */case KVM_EXIT_HLT: /* ... */}
109 1673 1 1 May04 ? 00:26:24 /usr/bin/qemu-system-x86_64 -name instance-00000002 -S -machine pc-i440fx-trusty,accel=tcg,usb=off -m 2048 -realtime mlock=off -smp 1,sockets=1,cores=1,threads=1 -uuid f3fdf038-ffad-4d66-a1a9-4cd2b83021c8 -smbios type=1,manufacturer=OpenStack Foundation,product=OpenStack Nova,version=2014.2,serial=564d2353-c165-6238-8f82-bfdb977e31fe,uuid=f3fdf038-ffad-4d66-a1a9-4cd2b83021c8 -no-user-config -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/instance-00000002.monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc -no-shutdown -boot strict=on -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 -drive file=/opt/stack/data/nova/instances/f3fdf038-ffad-4d66-a1a9-4cd2b83021c8/disk,if=none,id=drive-virtio-disk0,format=qcow2,cache=none -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1 -drive file=/opt/stack/data/nova/instances/f3fdf038-ffad-4d66-a1a9-4cd2b83021c8/disk.config,if=none,id=drive-ide0-1-1,readonly=on,format=raw,cache=none -device ide-cd,bus=ide.1,unit=1,drive=drive-ide0-1-1,id=ide0-1-1 -netdev tap,fd=26,id=hostnet0 -device virtio-net-pci,netdev=hostnet0,id=net0,mac=fa:16:3e:db:86:d4,bus=pci.0,addr=0x3 -chardev file,id=charserial0,path=/opt/stack/data/nova/instances/f3fdf038-ffad-4d66-a1a9-4cd2b83021c8/console.log -device isa-serial,chardev=charserial0,id=serial0 -chardev pty,id=charserial1 -device isa-serial,chardev=charserial1,id=serial1 -vnc 127.0.0.1:1 -k en-us -device cirrus-vga,id=video0,bus=pci.0,addr=0x2 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x5
QEMU 支持兩種操作模式:用戶模式仿真和系統模式仿真。用戶模式仿真 允許一個 CPU 構建的進程在另一個 CPU 上執行(執行主機 CPU 指令的動態翻譯並相應地轉換 Linux 系統調用)。系統模式仿真 允許對整個系統進行仿真,包括處理器和配套的外圍設備。
在 x86 主機系統上仿真 x86 代碼時,使用 QEMU 加速器 可以實現近似本地的性能。這讓我們能夠直接在主機 CPU 上執行仿真代碼(在 Linux 上通過 kernel 模塊執行)。
但是從技術角度看,QEMU 的有趣之處在於其快速、可移植的動態翻譯程序。動態翻譯程序 允許在運行時將用於目標(來賓)CPU 的指令轉換為用於主機 CPU,從而實現仿真。這可以通過一種強制方法實現(將指令從一個 CPU 映射到另一個 CPU),但是情況並非總是這樣簡單,在某些情況下,根據所翻譯的架構,可能需要使用多個指令或行為更改。
QEMU 實現動態翻譯的方法是,首先將目標指令轉換為微操作。這些微操作是一些編譯成對象的 C 代碼。然后構建核心翻譯程序。它將目標指令映射到微操作以進行動態翻譯。這不僅可產生高效率,而且還可以移植。
QEMU 的動態翻譯程序還緩存了翻譯后的代碼塊,使翻譯程序的內存開銷最小化。當初次使用目標代碼塊時,翻譯該塊並將其存儲為翻譯后的代碼塊。 QEMU 將最近使用的翻譯后的代碼塊緩存在一個 16 MB 的塊中。 QEMU 甚至可以通過在緩存中將翻譯后的代碼塊變為無效來支持代碼的自我修改。
3、libvirt
- The KVM/QEMU Linux hypervisor
- The Xen hypervisor on Linux and Solaris hosts.
- The LXC Linux container system
- The OpenVZ Linux container system
- The User Mode Linux paravirtualized kernel
- The VirtualBox hypervisor
- The VMware ESX and GSX hypervisors
- The VMware Workstation and Player hypervisors
- The Microsoft Hyper-V hypervisor
- The IBM PowerVM hypervisor
- The Parallels hypervisor
- The Bhyve hypervisor
libvirt 比較和用例模型
圖 使用 libvirtd 控制遠程虛擬機監控程序
表 1. libvirt 支持的虛擬機監控程序
| 虛擬機監控程序 | 描述 |
|---|---|
| Xen | 面向 IA-32,IA-64 和 PowerPC 970 架構的虛擬機監控程序 |
| QEMU | 面向各種架構的平台仿真器 |
| Kernel-based Virtual Machine (KVM) | Linux 平台仿真器 |
| Linux Containers(LXC) | 用於操作系統虛擬化的 Linux(輕量級)容器 |
| OpenVZ | 基於 Linux 內核的操作系統級虛擬化 |
| VirtualBox | x86 虛擬化虛擬機監控程序 |
| User Mode Linux | 面向各種架構的 Linux 平台仿真器 |
| Test | 面向偽虛擬機監控程序的測試驅動器 |
| Storage | 存儲池驅動器(本地磁盤,網絡磁盤,iSCSI 卷) |
參考:
- Kvm Qemu Libvirt:http://kiwik.github.io/openstack/2014/05/04/KVM-QEMU-libvirt/#
- KVM虛擬機分析: http://wenku.baidu.com/link?url=1sEgxHLl-pYpSavmRJXwFq3QYHENQPvEX7QMUQ7zf9UL1Qkio1YNUVKhF-697vqk4O7DDjuEPc0NLbHfoiMbOkGo4zdmRjVjftWlkNa1AJy
- 使用QEMU進行系統仿真: https://www.ibm.com/developerworks/cn/linux/l-qemu/
- Libvirt虛擬化庫剖析: https://www.ibm.com/developerworks/cn/linux/l-libvirt/
- Libvirt架構及源碼分析(一) : http://blog.chinaunix.net/uid-20940095-id-3813601.html
