天天看點

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

機器中的機器

使用 QEMU 進行系統仿真(QEMU介紹)
使用 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 進行系統仿真(QEMU介紹)
使用 QEMU 進行系統仿真(QEMU介紹)
使用 QEMU 進行系統仿真(QEMU介紹)

虛拟化簡介

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

本文中介紹的虛拟化實際上指的是平台虛拟化。在實體硬體上,控制程式可能是主機作業系統或管理程式(見圖 1)。在某些情況下,主機作業系統就是管理程式。來賓作業系統位于管理程式中。在某些情況下,來賓作業系統與控制程式使用相同的 cpu,而在另外一些情況下,則可能不同(比如 powerpc 來賓作業系統在 x86 硬體上運作)。

<b>圖 1. 平台虛拟化的基本架構</b>

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

您可以通過多種方法實作虛拟化,但是最常見的有三種。第一種稱為本地虛拟化(或全虛拟化)。在這種虛拟化中,管理程式實作基本的隔離元素,将實體硬體與來賓作業系統相分離。這種技術首次出現于 1966 年 ibm? cp-40 虛拟機/虛拟記憶體作業系統中,另外 vmware esx server 也使用了此技術。

另一種流行的虛拟化技術稱為半虛拟化。在半虛拟化中,控制程式實作了管理程式的應用程式接口(api),它将由來賓作業系統使用。xen 和 linux kernel-based virtual machine (kvm) 都使用了半虛拟化技術。

第三種有用的技術稱為仿真。仿真,顧名思義,通過模拟完整的硬體環境來虛拟化來賓平台。仿真可通過多種方法實作,即使在同一個解決方案中也是如此。通過仿真實作虛拟化的技術有 qemu 和 bochs。

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

<b></b>

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 &amp; white) 和 sun-4u 平台,都能正常工作。

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

建構和安裝 qemu

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

<b>清單 1. 建構 qemu 仿真器</b>

$ 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)。

<b>清單 2. 建構 qemu 加速器</b>

$ 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

您可以在很多作業系統,包括 microsoft? windows?、freebsd? 和 linux 上編譯和安裝 kqemu。建構 qemu 加速器之後,使用以下指令在 linux 中安裝該加速器:

$ insmod kqemu.ko

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

使用 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)。

<b>圖 2. 準備使用 qemu 将 cflinux 安裝到仿真磁盤上</b>

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

遵循安裝指令,按照 cd-rom 安裝完成在仿真硬碟上的 iso 安裝。安裝程式要求您重新啟動。此時,您可以終止仿真(在 qemu 視窗中按 ctrl-c)。您可以使用以下指令引導最新安裝的作業系統:

$ qemu -hda disk.img

此指令隻是說明使用 disk.img 映像檔案表示的硬碟仿真标準 pc(預設選項)。linux 映像從仿真硬碟開始引導,導緻出現 qemu 視窗,如圖 3 所示。

<b>圖 3. 從仿真硬碟引導最新安裝的 cflinux</b>

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

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

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

其他仿真器

雖然 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 進行系統仿真(QEMU介紹)
使用 QEMU 進行系統仿真(QEMU介紹)

結束語

将 qemu 作為機器仿真器使用讓您能夠試驗各種作業系統,因為您可能沒有多餘的機器直接進行試驗。reactos 就是一個這樣的例子,它是一個開源的 windows xp 相容的作業系統(其仿真如圖 4 所示)。reactos 的目标是與 windows xp 實作二進制相容,是以您可以直接在 reactos 上運作針對 windows xp 建構的應用程式。請參閱 參考資料 一節了解目前應用程式相容性的細節。

<b>圖 4. 為 reactos 仿真标準 pc</b>

您可以在 free operating systems zoo 找到 reactos 和很多其他作業系統的 qemu 映像(請參閱 參考資料 一節了解更多細節)。這些映像包括 live cd 映像、軟碟映像或硬碟映像(qcow 格式)。qemu 是嘗試新作業系統的一種良好方法,而且不用花時間安裝。

參考資料

<b>學習</b>

您可以參閱本文在 developerworks 全球站點上的 英文原文。

檢視 fabrice bellard 的 “qemu, a fast and portable dynamic translator”(pdf),了解 qemu 動态翻譯的内部細節。

在 “虛拟 linux”(developerworks,2006 年 12 月)中,了解其他 linux 虛拟化選項。

“探索 linux 核心虛拟機”(developerworks,2007 年 4 月)介紹了 linux kvm 架構和它與核心緊密內建可以改變使用 linux 的方式的原因。

在 developerworks linux 專區 中,查找更多面向 linux 開發人員的資源,檢視 最受歡迎的文章和教程。

檢視 developerworks 上所有的 linux 技巧 和 linux 教程。

随時關注 developerworks 技術事件和網絡廣播。

<b>獲得産品和技術</b>

從 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 開發項目。

<b>讨論</b>

加入 developerworks 社群,參與 新 developerworks 空間 中的 blog、論壇、podcast 和社群主題。

關于作者

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

tim jones 是一名嵌入式軟體工程師,他是 gnu/linux application programming、ai application programming 以及 bsd sockets programming from a multilanguage perspective 等書的作者。他的工程背景非常廣泛,從同步宇宙飛船的核心開發到嵌入式架構設計,再到網絡協定的開發。tim 是位于美國科羅拉多州 longmont 的 emulex corp. 的一名顧問工程師

繼續閱讀