跳轉到內容

QEMU/映象

來自華夏公益教科書,開放的書籍,開放的世界

安裝 QEMU 後,它應該可以從磁碟映象執行來賓作業系統。此映象是一個檔案,它表示硬碟上的資料。從來賓作業系統的角度來看,它實際上是一個硬碟,並且可以在虛擬磁碟上建立自己的檔案系統。

您可以從 QEMU 網站 下載一些來賓作業系統映象,包括一個簡單的 8 MB Linux 發行版映象(主要用於測試;請注意,它缺少 e1000 驅動程式,因此無法開箱即用地進行網路連線)。要執行它,請下載並解壓縮資料夾中的映象,然後執行 QEMU 命令。

qemu linux-0.2.img

如果您沒有簡單的命令 qemu,請嘗試執行

qemu-system-i386 linux-0.2.img

linux-0.2.img 替換為您的來賓作業系統映象檔案的檔名。如果它有 GUI 並且您想使用滑鼠,請雙擊視窗,QEMU 將抓取您的滑鼠。要使 QEMU 再次釋放滑鼠,請同時按住 Control 和 Alt 鍵,然後鬆開 - 您的滑鼠將被釋放回 X。

Debian 的 Aurélien Jarno 為多種架構準備了許多預先打包的 Debian QEMU 映象,包括 ARM、Sparc、PowerPC、x86_64 和 i386。它們可以在 http://people.debian.org/~aurel32/qemu/ 找到。

對於您獲得的一些測試核心,例如 Sparc 測試映象,您可能會收到錯誤“沒有可用的 NFS 伺服器,放棄”或其他有關需要插入“根軟盤”甚至指定修復根選項的訊息。如果是這樣,則將“root=/dev/ram”指定為額外的核心命令列選項。這將導致測試系統正常工作。這對從 http://wiki.qemu.org/Testing 可獲得的 Sparc 測試檔案特別適用,但也可能適用於其他一些檔案。如果您使用的是 Windows 的管理器程式,只需在高階選項卡中新增“root=/dev/ram/”。另外關閉影片和聲音,如果使用的是 qemu-system-sparcw.exe,則將檔名更改為 qemu-system-sparc.exe,因為有些人將其重新命名了。

映象型別

[編輯 | 編輯原始碼]

QEMU 支援多種映象型別。最“原生”且最靈活的型別是 qcow2,它支援 寫時複製、加密、壓縮和虛擬機器快照。

QEMU 目前可以使用以下映象型別或格式

raw
(預設) raw 格式是磁碟映象的純二進位制映象,並且非常便攜。在支援 稀疏檔案 的檔案系統上,此格式的映象僅使用實際用於記錄其中的資料的空間。
cloop
壓縮迴圈 格式,主要用於讀取 Knoppix 和類似的即時 CD 映象格式
cow
寫時複製 格式,僅出於歷史原因才支援,並且在 Windows 上的 QEMU 不可使用
qcow
舊的 QEMU 寫時複製格式,出於歷史原因而支援,已被 qcow2 取代
qcow2
QEMU 寫時複製格式,具有多種特殊功能,包括能夠進行多次快照、在不支援稀疏檔案的檔案系統上建立更小的映象、可選的 AES 加密和可選的 zlib 壓縮
vmdk
VMware 3 和 4 或 6 映象格式,用於與該產品交換映象
vdi
VirtualBox 1.1 相容映象格式,用於與 VirtualBox 交換映象。
vhdx
Hyper-V 相容映象格式,用於與 Hyper-V 2012 或更高版本交換映象。
vpc
Hyper-V 遺留映象格式,用於與 Virtual PC / Virtual Server / Hyper-V 2008 交換映象。

建立映象

[編輯 | 編輯原始碼]

要設定您自己的來賓作業系統映象,您首先需要建立一個空白磁碟映象。QEMU 有 qemu-img 命令用於建立和操作磁碟映象,並且支援多種格式。如果您沒有告訴它使用什麼格式,它將使用 raw 檔案。QEMU 的“原生”格式是 qcow2,這種格式提供了一些靈活性。在這裡,我們將建立一個 3 GB 的 qcow2 映象,以便在上面安裝 Windows XP

qemu-img create -f qcow2 winxp.img 3G

安裝來賓作業系統最簡單的方法是建立啟動 CD/DVD 的 ISO 映象,並告訴 QEMU 從它啟動。許多免費作業系統可以從網際網路上下載為可啟動的 ISO 映象,您可以直接使用它們,而無需將它們刻錄到光碟上。

在這裡,我們將從正確授權的 Windows XP 啟動光碟的 ISO 映象啟動。我們還將為它提供 256 MB 的 RAM,但目前不會使用 kqemu 核心模組,因為它會在 Windows XP 安裝過程中造成問題。

qemu -m 256 -hda winxp.img -cdrom winxpsp2.iso -boot d

注意:根據您的發行版,您可能需要使用 qemu-system-x86_64 命令(如果您使用的是 64 位作業系統,也如果您想以後使用 KVM)。

要從真實的 CD 或 DVD 啟動,請告訴 QEMU 在哪裡找到它。在 Linux 系統上,您通常可以使用邏輯裝置名稱,例如 /dev/cdrom/dev/dvd,或者裝置的物理名稱,例如 /dev/sr0

qemu -m 256 -hda winxp.img -cdrom /dev/cdrom -boot d

QEMU 將從 ISO 映象或 CD/DVD 啟動並執行安裝程式。如果您有兩臺顯示器,請將 QEMU 顯示器移到備用顯示器上,以便您可以密切關注安裝程式,但繼續做其他事情 - 這需要一段時間!

來賓作業系統成功安裝後,您可以關閉來賓作業系統(例如,在 Windows XP 中,單擊“開始”,然後單擊“關閉”。關閉後,使用 kqemu 核心模組啟動 QEMU,使其速度更快一些。

qemu -m 256 -hda winxp.img -cdrom winxpsp2.iso -enable-kvm

如果您執行的是 x86-64 Linux(即 64 位),您需要執行 64 位版本的 QEMU 才能利用 kqemu

qemu-system-x86_64 -m 256 -hda winxp.img -cdrom winxpsp2.iso -enable-kvm

qemu-img 程式非常強大。由於您可以進行資料格式之間的轉換,因此可以非常快速地遷移到其他模擬器。它還可以讀取 RAW 格式,這意味著您可以從磁碟進行轉儲並將其轉換為例如 qcow2。當您需要虛擬化損壞的 PC 時,此功能非常方便。

1. 使用 ddrescue(或 dd,如果驅動器正常)建立 raw 映象

ddrescue /dev/diskin diskout.img diskout.map
注意
dev/diskin 是一個佔位符,例如 diskout.img,請在盲目複製行之前閱讀 ddrescue 的說明(man ddrescue),尤其是在損壞的磁碟上,這可能需要一些時間

2. 現在將 RAW 映象轉換為 qcow2

 qemu-img convert -p -f raw -O qcow2 diskout.img target.qcow2
注意
再次使用 man qemu-img 程式會不斷發展

請注意,qemu-img 會進行復制,好處是:如果出現問題,您可以再次執行此操作;缺點是:您需要空間,請先檢查!

生成的 target.qcow2 可以用作 qemu-system-x86_64 的磁碟

使用多個映象

[編輯 | 編輯原始碼]

QEMU 可以利用最多四個映象檔案,為來賓系統提供多個虛擬驅動器。這非常有用,例如在以下示例中

  • 一個 頁面檔案 或交換檔案虛擬磁碟,可以由 QEMU 來賓共享
  • 一個公共資料驅動器,其中儲存所有資料,可從每個 QEMU 來賓訪問,但與主機隔離
  • 為 QEMU 來賓提供額外的空間,而無需重新配置主映象
  • 透過將單獨的 QEMU 映象放置在不同的物理驅動器上,將競爭的 I/O 操作分離到不同的物理驅動器主軸上
  • 模擬多驅動器物理環境,用於測試/學習

請記住,一次只能有一個 QEMU 例項訪問一個映象 - 共享並不意味著同時共享!

要在 QEMU 中使用其他映象,請使用 -hda、-hdb、-hdc、-hdd 選項在命令列中指定它們。

qemu -m 256 -hda winxp.img -hdb pagefile.img -hdc testdata.img -hdd tempfiles.img -enable-kvm

注意:QEMU 不同時支援 -hdc 和 -cdrom,因為它們都代表第二個 IDE 通道上的第一個裝置。

寫時複製

[編輯 | 編輯原始碼]

qcow2 中的“cow”部分是 寫時複製 的縮寫,這是一個巧妙的小技巧,允許您設定一個映象並多次使用它,而無需更改它。這非常適合開發和測試軟體,因為軟體通常需要一個已知的穩定環境來啟動。您可以在一個映象中建立已知的穩定環境,然後建立幾個可丟棄的寫時複製映象來進行工作。

要基於已知的良好映象啟動新的可丟棄環境,請使用backing_file選項呼叫qemu-img命令,並告知它要基於哪個映象進行復制。當您使用可丟棄環境執行 QEMU 時,對虛擬磁碟的所有寫入都將轉到此可丟棄映象,而不是基本副本。

qemu-img create -f qcow2 -o backing_file=winxp.img test01.img 
qemu -m 256 -hda test01.img -enable-kvm &

注意

  1. 在刪除可丟棄環境之前,請務必將所有重要資料從可丟棄環境中複製出來。在基於寫時複製的虛擬環境中開發和測試軟體時,最好在虛擬環境外部的伺服器上使用版本控制軟體,例如SubversionCVS。這樣不僅可以輕鬆地在虛擬環境外部儲存工作副本,還可以輕鬆地從版本控制中設定新的虛擬環境。
  2. 將直接使用backing_file映象的虛擬機器必須將其設定為只讀。否則,如果對backing_file映象進行了任何更改,則基於此backing_file映象的其他映象將被破壞。

在主機上掛載映象

[edit | edit source]

有時能夠在主機系統下掛載驅動器映象會很有幫助。例如,如果客戶機沒有網路支援,則將檔案傳輸進出客戶機的唯一方法將是透過它可以定址的儲存裝置。

Linux 和其他類 Unix 主機可以使用迴環裝置掛載使用raw格式型別建立的映象。從 root 登入(或使用 sudo)掛載帶有偏移量的迴環裝置。

mount -o loop,offset=32256 /path/to/image.img /mnt/mountpoint

要確定正確的偏移量,您可以執行

fdisk -l /path/to/image.img

您需要的偏移量是分割槽起始乘以扇區大小。例如,如果起始為 128 且扇區大小為 512,則偏移量為 65536。


例如,要將一些檔案複製到 FreeDOS 硬碟映象中

mkdir -p /mnt/freedos
mount -o loop,offset=32256 freedos-c.img /mnt/freedos
cp oldgames /mnt/freedos
umount /mnt/freedos

注意:切勿在 QEMU 使用 QEMU 映象時掛載它(除非使用 -snapshot),否則您很可能會損壞映象上的檔案系統。

注意:如果您有一個沒有分割槽的映象,您應該省略,offset=32256部分。例如,如果您想掛載 linux-0.2.img(在撰寫本文時可以在 qemu 網站上找到)。

對於其他型別的 qemu 映象,您可以使用 qemu-nbd

modprobe nbd max_part=16
qemu-nbd -c /dev/nbd0 image.qcow2
partprobe /dev/nbd0
mount /dev/nbd0p1 /mnt/image

使用 fdisk,您可以獲取有關 nbd0 中不同分割槽的的資訊。

$ fdisk /dev/nbd0
 Command (m for help): p
 Disk /dev/nbd0: 4294 MB, 4294967296 bytes
 255 heads, 63 sectors/track, 522 cylinders, total 8388608 sectors
 Units = sectors of 1 * 512 = 512 bytes
 Sector size (logical/physical): 512 bytes / 512 bytes
 I/O size (minimum/optimal): 512 bytes / 512 bytes
 Disk identifier: 0x000183ca
      Device  Boot     Start        End      Blocks   Id  System
 /dev/nbd0p1   *        2048      499711      248832   83  Linux
 /dev/nbd0p2          501758     8386559     3942401    5  Extended
 /dev/nbd0p5          501760     8386559     3942400   8e  Linux LVM

不能使用 'mount' 掛載 LVM 型別的分割槽。在這種情況下,可以使用以下方法掛載映象

$ vgscan
  Reading all physical volumes. This may take a while...
  Found volume group "ub1110server-qemu" using metadata type lvm2
$ vgchange -ay
   2 logical volume(s) in volume group "ub1110server-qemu" now active
$ mount /dev/ub1110server-qemu/<LogicalVolumeName> /mnt/image

用卷組中存在的邏輯卷的名稱替換<LogicalVolumeName>。最後,在使用後,務必解除安裝映象並撤消其他步驟(取決於映象的掛載方式)。

$ umount /mnt/image
$ qemu-nbd -d /dev/nbd0
$ vgchange -an VolGroupName
$ killall qemu-nbd

“nbd”代表“網路塊裝置”。在這裡,我們是在本地使用它們,但也可以將映象匯出供其他主機使用/掛載。有關詳細資訊,請參閱 qemu-nbd(8)、nbd-client(8)。

同樣可以對原始映象執行此操作,但效率遠低於上面描述的迴圈方法。

另一種針對 vmdk 和原始映象的替代方法是使用 vdfuse (http://forums.virtualbox.org/viewtopic.php?f=26&t=33355),它允許訪問 VirtualBox 支援的任何映象。

將映象複製到物理裝置

[edit | edit source]

您可能希望將磁碟映象複製到物理裝置。例如,在構建叢集時,可能更容易在 qemu 中準備好所有內容,然後將最終的磁碟映象寫入所有硬碟驅動器。當然,您的映象需要包含新系統正常啟動所需的所有配置和驅動程式。

磁碟映象需要採用 raw 格式。

$ qemu-img convert -O raw diskimage.qcow2 diskimage.raw

然後,您只需將其 dd 到硬碟驅動器上。

# dd if=diskimage.raw of=/dev/sdX

或者,讓 qemu-img 直接用一個命令寫入驅動器

# qemu-img convert -O raw diskimage.qcow2 /dev/sdX

當然,您需要確保將其寫入正確的驅動器!

獲取資訊

[edit | edit source]

qemu-img 程式可以告訴您有關映象的格式、虛擬大小、物理大小和快照的資訊。

$ qemu-img info test.vmdk 
(VMDK) image open: flags=0x2 filename=test.vmdk
image: test.vmdk
file format: vmdk
virtual size: 20M (20971520 bytes)
disk size: 17M
$ qemu-img info image-qcow.qcow2
image: image-qcow.qcow2
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 136K
cluster_size: 65536

轉換映象格式

[edit | edit source]

qemu-img 程式可用於將映象從一種格式轉換為另一種格式,或向映象新增壓縮或加密。指定映象的原始檔和目標檔案,並從以下選項中選擇

  • -f fmt – 可選,指定輸入檔案的格式(QEMU 通常可以檢測到它)
  • -O fmt – 指定輸出檔案的格式
  • -e – 在輸出檔案中使用加密(系統將提示您輸入密碼)
  • -c – 在輸出檔案中使用壓縮(不能與加密一起使用)
  • -6 – 轉換為 vmdk(VMware)格式時,使其與 VMware 6 相容
qemu-img convert -O qcow2 test.vmdk test.qcow2

與 VirtualBox 交換映象

[edit | edit source]

qemu 還支援vdi格式,因此您可以在兩種方式之間進行轉換

qemu-img convert -O vdi test.qcow2 test.vdi

qemu 可以使用 vdi 格式進行引導以及作為基本映象;由於 VirtualBox 也支援這種型別的映象,在其中被稱為差異映象,因此可以同時共享單個(只讀)基本副本。

無論如何,您都可以使用raw格式(或nbd裝置)

要轉換一個 QEMU 映象以供VirtualBox使用,首先將其轉換為raw格式,然後使用 VirtualBox 的轉換實用程式將其轉換為其本機格式並壓縮。請注意,compact 命令需要 VirtualBox 映象的完整路徑,而不僅僅是檔名。

qemu-img convert -O raw test.qcow2 test.raw
(1) VBoxManage convertdd test.raw test.vdi
VBoxManage modifyvdi /full/path/to/test.vdi compact

(1) 或者嘗試

VBoxManage convertfromraw -format VDI test.raw test.vdi
or
VBoxManage clonehd -format VDI test.raw test.vdi

或者,您可以使用 qemu-nbd 將映象作為 raw 形式的 nbd 裝置提供,然後 VBoxManage 可以將其轉換。

qemu-nbd -c /dev/nbd0 test.qcow2
VBoxManage convertfromraw -format VDI /dev/nbd0 test.vdi

要將 VDI 轉換回 raw,可以使用 VBoxManage 再次

VBoxManage clonehd -format RAW test.vdi test.raw

或者

VBoxManage internalcommands  converttoraw file.vdi file.raw

要從 KVM 使用 VDI 映象而不將其轉換,可以再次使用 vdfuse。

vdfuse -f test.vdi ~/some-dir
kvm -hda ~/some-dir/EntireDisk ...
華夏公益教科書