使用 QEMU 進行系統仿真(QEMU介紹)

 

機器中的機器


級別: 初級

M. Tim Jones ([email protected]), 諮詢工程師, Emulex

2007 年 10 月 22 日

QEMU 是一個面向完整 PC 系統的開源仿真器。除了仿真處理器外,QEMU 還允許仿真所有必要的子系統,如連網硬件和視頻硬件。它還允許實現高級概念上的仿真(如對稱多處理系統(多達 255 個 CPU)和其他處理器架構(如 ARM 和 PowerPC)。本文將研究 QEMU 及其架構,並展示瞭如何在 Linux? 主機上仿真來賓操作系統。

QEMU 是什麼?

目前,簡單地將虛擬化稱爲一種熱點技術似乎有些保守。 在 google 搜索 virtualization 一詞可得到大約 2200 萬條記錄。例如,在短短的一個月內,EMC 公司宣佈爲 VMware 首次公開募股,Citrix Systems 宣佈購買 XenSource 的計劃,而新起的虛擬化創業公司隨處涌現。在虛擬化產品的巨大市場上,不斷出現各種新興的小型市場。但是時下在熱議有關虛擬化的首次公開募股和收購時,容易忽略一些其他的現有虛擬化技術。

本文所介紹的一種有趣的虛擬化應用程序 QEMU 並非目前的熱門技術。QEMU 應用程序適用於各種設置。可用於來賓操作系統的虛擬化,或作爲完整的機器仿真器使用,運行使用主機 CPU 或其他 CPU 架構的操作系統。


虛擬化簡介

我們首先簡要介紹一下虛擬化,闡述 QEMU 的搭建背景。

本文中介紹的虛擬化實際上指的是平臺虛擬化。在物理硬件上,控制程序可能是主機操作系統或管理程序(見圖 1)。在某些情況下,主機操作系統就是管理程序。來賓操作系統位於管理程序中。在某些情況下,來賓操作系統與控制程序使用相同的 CPU,而在另外一些情況下,則可能不同(比如 PowerPC 來賓操作系統在 x86 硬件上運行)。

圖 1. 平臺虛擬化的基本架構
figure1

您可以通過多種方法實現虛擬化,但是最常見的有三種。第一種稱爲本地虛擬化(或全虛擬化。在這種虛擬化中,管理程序實現基本的隔離元素,將物理硬件與來賓操作系統相分離。這種技術首次出現於 1966 年 IBM? CP-40 虛擬機/虛擬內存操作系統中,另外 VMware ESX Server 也使用了此技術。

另一種流行的虛擬化技術稱爲半虛擬化。在半虛擬化中,控制程序實現了管理程序的應用程序接口(API),它將由來賓操作系統使用。Xen 和 Linux Kernel-based Virtual Machine (KVM) 都使用了半虛擬化技術

第三種有用的技術稱爲仿真。仿真,顧名思義,通過模擬完整的硬件環境來虛擬化來賓平臺。仿真可通過多種方法實現,即使在同一個解決方案中也是如此。通過仿真實現虛擬化的技術有 QEMU 和 Bochs


QEMU 架構

我們首先了解一下 QEMU 如何實現仿真。本節將介紹 QEMU 的兩種操作模式,以及 QEMU 動態翻譯程序的一些有趣特點。

QEMU 基本操作

QEMU 支持兩種操作模式:用戶模式仿真和系統模式仿真。用戶模式仿真 允許一個 CPU 構建的進程在另一個 CPU 上執行(執行主機 CPU 指令的動態翻譯並相應地轉換 Linux 系統調用)。系統模式仿真 允許對整個系統進行仿真,包括處理器和配套的外圍設備。

在 x86 主機系統上仿真 x86 代碼時,使用 QEMU 加速器 可以實現近似本地的性能。這讓我們能夠直接在主機 CPU 上執行仿真代碼(在 Linux 上通過 kernel 模塊執行)。

但是從技術角度看,QEMU 的有趣之處在於其快速、可移植的動態翻譯程序。動態翻譯程序 允許在運行時將用於目標(來賓)CPU 的指令轉換爲用於主機 CPU,從而實現仿真。這可以通過一種強制方法實現(將指令從一個 CPU 映射到另一個 CPU),但是情況並非總是這樣簡單,在某些情況下,根據所翻譯的架構,可能需要使用多個指令或行爲更改。

QEMU 實現動態翻譯的方法是,首先將目標指令轉換爲微操作。這些微操作是一些編譯成對象的 C 代碼。然後構建核心翻譯程序。它將目標指令映射到微操作以進行動態翻譯。這不僅可產生高效率,而且還可以移植。

QEMU 的動態翻譯程序還緩存了翻譯後的代碼塊,使翻譯程序的內存開銷最小化。當初次使用目標代碼塊時,翻譯該塊並將其存儲爲翻譯後的代碼塊。 QEMU 將最近使用的翻譯後的代碼塊緩存在一個 16 MB 的塊中。 QEMU 甚至可以通過在緩存中將翻譯後的代碼塊變爲無效來支持代碼的自我修改。

要了解 QEMU 及其動態翻譯程序的更多內部細節,請參閱 參考資料 一節中 Fabrice Bellard(QEMU 的作者)所撰寫的有趣文章。

受支持的外圍設備

將 QEMU 作爲 PC 系統仿真器使用可提供各種外圍設備。需要的標準外圍設備包括硬件 Video Graphics Array (VGA) 仿真器、PS/2 鼠標和鍵盤、集成開發環境(IDE)硬盤和 CD-ROM 接口,以及軟盤仿真。另外,QEMU 包括對 NE2000 Peripheral Controller Interconnect (PCI) 網絡適配器、串行端口、大量的聲卡和 PCI Universal Host Controller Interface (UHCI) Universal Serial Bus (USB) 控制器(帶虛擬 USB 集線器)的仿真。Processor symmetric multiprocessing (SMP) 支持也得到了對 255 個 CPU 的支持。

除了仿真標準 PC 或 ISA PC(不帶 PCI 總線)外,QEMU 還可以仿真其他非 PC 硬件,如 ARM Versatile 基線板(使用 926E)和 Malta million instructions per second (MIPS) 板。對於各種其他平臺,包括 Power Macintosh G3 (Blue & White) 和 Sun-4u 平臺,都能正常工作。


構建和安裝 QEMU

構建和安裝 QEMU 與使用標準的 GNU 工具一樣簡單。下載並打開 QEMU 發行版之後,configure、make,然後 make install,任務就完成了(見清單 1)。

清單 1. 構建 QEMU 仿真器

$ wget http://fabrice.bellard.free.fr/qemu/qemu-0.9.0.tar.gz $ tar xfvz qemu-0.9.0.tar.gz $ cd qemu-0.9.0 $ ./configure $ make $ make install $

此過程不僅可以爲當前的目標架構創建可執行的 qemu 映像,而且可以爲其他架構(包括 ARM、MIPS、PowerPC、68k 和 SPARC)創建一組映像。 這樣,您就可以引導爲不同目標架構構建的 Linux 內核。

如果主機操作系統和來賓操作系統運行於相同的處理器架構之上,那麼您可以使用 QEMU 加速器(KQEMU)實現近似本地的性能。KQEMU 是一個驅動程序(Linux 的內核模塊),允許用戶模式的代碼和內核代碼直接在主機 CPU 上執行。構建 QEMU 加速器與構建 QEMU 本身相同(見清單 2)。

清單 2. 構建 QEMU 加速器

$ http://fabrice.bellard.free.fr/qemu/kqemu-1.3.0pre11.tar.gz $ tar xvfz kqemu-1.3.0pre11.tar.gz $ cd kqemu-1.3.0pre11 $ ./configure $ make $ make install

您可以在很多操作系統,包括 Microsoft? Windows?、FreeBSD? 和 Linux 上編譯和安裝 KQEMU。構建 QEMU 加速器之後,使用以下命令在 Linux 中安裝該加速器:

$ insmod kqemu.ko $


使用 QEMU

現在考察一下使用 QEMU 虛擬化另一臺帶典型的桌面 GNU/Linux 環境的機器的情況。仿真另一臺機器與處理新計算機類似。 第一步是安裝操作系統。新計算機必須要有安裝操作系統的空間,因此需要一個硬盤。

QEMU 提供了一條特殊的命令創建硬盤,此命令稱爲 qemu-img。此工具可以創建各種格式的映像,但最佳的格式(對於 qemu)稱爲 qcow(或 qemu 寫時複製)。這種格式的優點在於磁盤映像的大小與表示映像的物理文件的大小不同。換言之,該格式允許實現更緊湊的磁盤映像。例如,一個空的 4GB 磁盤映像只需要 16KB 的空間。

對於 qemu-img,您需要提供操作類型(create 創建新磁盤映像)、格式(qcow 用於 qemu 映像格式)、大小和磁盤映像的名稱。本例中仿真的機器用於一個在 Flash 中使用的微型 Linux 發行版。因此,將 128MB 的磁盤映像創建爲:

$ qemu-img create -f qcow disk.img 128M Formating 'disk.img', fmt=qcow, size=131072 kB $

注意,如果您計劃安裝通用操作系統,如 Windows、Linux 或 FreeBSD,則需要更大的磁盤空間。此操作的結果是仿真時出現一個 disk.img 文件,其形式是一個 128MB 的磁盤。

現在已經創建好硬盤,可以在上面安裝新操作系統。出於演示的目的,我將使用一個較小的 Linux 發行版 cfLinux。cfLinux 的標準用法是作爲基於 Linux 的小型嵌入式系統使用,此係統應適用網關、無線入口點、防火牆或路由器。您可以使用 wget 下載 ISO 格式的發行版:

wget ftp://ftp.cflinux.fu/pub/cflinux/iso/cflinux-1.0.iso

ISO 映像是常見的 CD-ROM 格式(在其他地方稱爲 ISO 9660 文件系統)。

現在,您已經仿真了硬盤(disk.img)和 CD-ROM,您可以在上面安裝操作系統。下一步是在硬盤上安裝操作系統。簡單地使用 qemu 即可完成此任務:

$ qemu -hda disk.img -cdrom /root/cflinux-1.0.iso -boot d $

使用 qemu 時,您使用 hda 選項指定硬盤映像,使用 cdrom 選項指定 cdrom(ISO 映像所在的文件)。boot 選項指定從哪裏引導;參數 d 指定從 CD-ROM 引導,其中 a 指定從軟盤引導,c 指定從硬盤引導(默認),而 n 指定從網絡引導。發出此命令後,出現一個表示已仿真機器的新 QEMU 窗口(見圖 2)。

圖 2. 準備使用 QEMU 將 cfLinux 安裝到仿真磁盤上
figure2

遵循安裝指令,按照 CD-ROM 安裝完成在仿真硬盤上的 ISO 安裝。安裝程序要求您重新啓動。此時,您可以終止仿真(在 qemu 窗口中按 Ctrl-C)。您可以使用以下命令引導最新安裝的操作系統:

$ qemu -hda disk.img $

此命令只是說明使用 disk.img 映像文件表示的硬盤仿真標準 PC(默認選項)。Linux 映像從仿真硬盤開始引導,導致出現 QEMU 窗口,如圖 3 所示。

圖 3. 從仿真硬盤引導最新安裝的 cfLinux
 figure3

這再簡單不過了。實際上,您可以按照同樣的順序安裝和引導任何種類的操作系統(Linux 產品發行版、Windows 或其他)。


 

其他仿真器

雖然 QEMU 是一種極好的仿真環境,但是其他環境也值得研究一下。 Wine 是 Windows API 的一個開源實現,允許您在沒有 Windows 操作系統的情況下運行 Windows 程序。但是如 Wine 縮略詞所表示的那樣,Wine 不是仿真器。相反,Wine 實現了一組 API,這些 API 允許執行 x86 架構的應用程序。因此,運行在 Wine 上的應用程序可以很好地執行。

與 QEMU 類似的仿真器是 Bochs。Bochs 是一種機器仿真器,它不僅可以仿真 Intel? 的 i386?、i486?、Pentium?、Pentium Pro 和 Advanced Micro Devices 的 AMD64 CPU,還可以仿真常見 PC 外圍設備,如磁盤、內存、顯示器和網絡設備。Bochs 已被用於仿真 Linux、DOS 和 Windows 95/98/XP/2000/NT? 操作系統。


結束語

將 QEMU 作爲機器仿真器使用讓您能夠試驗各種操作系統,因爲您可能沒有多餘的機器直接進行試驗。ReactOS 就是一個這樣的例子,它是一個開源的 Windows XP 兼容的操作系統(其仿真如圖 4 所示)。ReactOS 的目標是與 Windows XP 實現二進制兼容,因此您可以直接在 ReactOS 上運行鍼對 Windows XP 構建的應用程序。請參閱 參考資料 一節瞭解當前應用程序兼容性的細節。

圖 4. 爲 ReactOS 仿真標準 PC

您可以在 Free Operating Systems Zoo 找到 ReactOS 和很多其他操作系統的 QEMU 映像(請參閱 參考資料 一節瞭解更多細節)。這些映像包括 live CD 映像、軟盤映像或硬盤映像(qcow 格式)。QEMU 是嘗試新操作系統的一種良好方法,而且不用花時間安裝。

參考資料

學習


獲得產品和技術
  • 從 Fabrice Bellard 的 Web 站點下載 QEMU 開源處理器仿真器和 QEMU 加速器。在該站點中,您還可以找到文檔、API 和 QEMU 的當前狀態。
  • 瞭解更多關於 cfLinux 的信息;作者使用這個小型的發行版展示了在 QEMU 機器中安裝操作系統。
  • Free Operating Systems Zoo 獲取預包裝的映像,爲自己節省時間。在此站點上,您將找到很多操作系統映像,從標準的 Linux 發行版到其他更稀有的操作系統(Plan 9、OpenSolaris、MINUX、ReactOS、Darwin、MenuetOS 等等)都有。下載某個磁盤映像之後,您將擁有可以開始引導的磁盤映像。
  • ReactOS 是一種開源的 Windows 二進制兼容的操作系統,允許執行多個 Windows 應用程序。
  • Wine 允許在非原生 Windows 操作系統(如 Linux)上執行 Windows 應用程序。
  • Bochs 與 QEMU 類似,因爲它提供了完全的系統仿真。
  • 訂購 SEK for Linux,這是兩張 DVD,其中包含了 IBM 在 Linux 平臺上的最新試用軟件,包括 DB2?、Lotus?、Rational?、Tivoli? 和 WebSphere?。
  • 使用可從 developerWorks 直接下載的 IBM 試用軟件 構建您的下一個 Linux 開發項目。

討論

關於作者

M. Tim Jones

Tim Jones 是一名嵌入式軟件工程師,他是 GNU/Linux Application ProgrammingAI Application Programming 以及 BSD Sockets Programming from a Multilanguage Perspective 等書的作者。他的工程背景非常廣泛,從同步宇宙飛船的內核開發到嵌入式架構設計,再到網絡協議的開發。Tim 是位於美國科羅拉多州 Longmont 的 Emulex Corp. 的一名顧問工程師

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章