跳转到内容

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 ...
华夏公益教科书