34 Guest 安装 #
virt-manager
和 virt-install
等基于 libvirt
的工具提供了方便的界面用于设置和管理虚拟机。这些工具充当 qemu-system-ARCH
命令的某种封装程序。不过,您也可以直接使用 qemu-system-ARCH
,而无需使用基于 libvirt
的工具。
qemu-system-ARCH
和 libvirt
使用 qemu-system-ARCH
创建的 虚拟机 对于基于 libvirt
的工具不可见。
34.1 使用 qemu-system-ARCH
进行基本安装 #
在下面的示例中,将为 SUSE Linux Enterprise Server 11 安装创建一个虚拟机。有关命令的详细信息,请参见相关的手册页。
如果您尚未创建要在虚拟化环境中运行的系统的映像,需要从安装媒体创建一个映像。在这种情况下,您需要准备一个硬盘映像,并获取安装媒体的映像或该媒体本身。
使用 qemu-img
创建硬盘。
>
qemu-img create1 -f raw2 /images/sles/hda3 8G4
| |
使用 | |
映像文件的完整路径。 | |
映像大小,在本例中为 8 GB。该映像创建为稀疏映像文件文件,会随着数据填充到磁盘中而增长。指定的大小定义映像文件可增长到的最大大小。 |
至少创建了一个硬盘映像后,您可以使用 qemu-system-ARCH
设置一个将引导到安装系统的虚拟机:
#
qemu-system-x86_64 -name "sles"1-machine accel=kvm -M pc2 -m 7683 \
-smp 24 -boot d5 \
-drive file=/images/sles/hda,if=virtio,index=0,media=disk,format=raw6 \
-drive file=/isos/SLE-15-SP5-Online-ARCH-GM-media1.iso,index=1,media=cdrom7 \
-net nic,model=virtio,macaddr=52:54:00:05:11:118 -net user \
-vga cirrus9 -balloon virtio10
虚拟机的名称,将在窗口标题中显示,并用于 VNC 服务器。此名称必须是唯一的。 | |
指定计算机类型。使用 | |
虚拟机的最大内存量。 | |
定义包含两个处理器的 SMP 系统。 | |
指定引导顺序。有效值为 | |
定义第一个 ( | |
第二个 ( | |
定义 MAC 地址为 | |
指定显卡。如果指定 | |
定义允许动态更改内存量(最大为使用参数 |
安装完 Guest 操作系统后,您无需指定 CD-ROM 设备即可启动相关的虚拟机:
#
qemu-system-x86_64 -name "sles" -machine type=pc,accel=kvm -m 768 \
-smp 2 -boot c \
-drive file=/images/sles/hda,if=virtio,index=0,media=disk,format=raw \
-net nic,model=virtio,macaddr=52:54:00:05:11:11 \
-vga cirrus -balloon virtio
34.2 使用 qemu-img
管理磁盘映像 #
在上一节中(请参见第 34.1 节 “使用 qemu-system-ARCH
进行基本安装”),我们使用 qemu-img
命令创建了硬盘的映像。另一方面,您可以使用 qemu-img
来执行一般的磁盘映像操作。本节介绍可帮助您灵活管理磁盘映像的 qemu-img
子命令。
34.2.1 有关 qemu-img 调用的一般信息 #
qemu-img
(像 zypper
那样)使用子命令来执行特定的任务。每个子命令会识别一组不同的选项。有些选项是通用的,其中的多数子命令都可使用,而有些选项则专用于相关的子命令。有关所有受支持选项的列表,请参见 qemu-img 手册页 (man 1
qemu-img
)。qemu-img
使用以下一般语法:
>
qemu-img subcommand [options]
支持以下子命令:
create
在文件系统上创建新磁盘映像。
check
检查现有磁盘映像是否有错误。
compare
检查两个映像的内容是否相同。
map
转储映像文件名的元数据及其后备文件链。
amend
修正映像文件名的映像格式特定选项。
convert
将现有磁盘映像转换为其他格式的新映像。
info
显示相关磁盘映像的信息。
snapshot
管理现有磁盘映像的快照。
commit
应用对现有磁盘映像进行的更改。
rebase
基于现有映像创建新的基本映像。
resize
增大或减小现有映像的大小。
34.2.2 创建、转换和检查磁盘映像 #
本节介绍如何创建磁盘映像、检查其状态、转换磁盘映像的格式,以及获取有关特定磁盘映像的详细信息。
34.2.2.1 qemu-img create #
使用 qemu-img create
可为 VM Guest 操作系统创建新磁盘映像。该命令使用以下语法:
>
qemu-img create -f fmt1 -o options2 fname3 size4
目标映像的格式。支持的格式为 | |
某些映像格式支持在命令行上传递其他选项。可在此处使用 | |
要创建的目标磁盘映像的路径。 | |
目标磁盘映像的大小(如果尚未使用 |
要在 /images
目录中创建最大可增长至 4 GB 的新磁盘映像 sles.raw
,请运行以下命令:
>
qemu-img create -f raw -o size=4G /images/sles.raw Formatting '/images/sles.raw', fmt=raw size=4294967296>
ls -l /images/sles.raw -rw-r--r-- 1 tux users 4294967296 Nov 15 15:56 /images/sles.raw>
qemu-img info /images/sles.raw image: /images/sles11.raw file format: raw virtual size: 4.0G (4294967296 bytes) disk size: 0
可以看到,新创建的映像的虚拟大小为 4 GB,但报告的实际磁盘大小为 0,因为尚未将任何数据写入该映像。
如果您需要在 Btrfs 文件系统上创建磁盘映像,可以使用 nocow=on
来减少 Btrfs 的写入时复制功能产生的性能开销。
>
qemu-img create -o nocow=on test.img 8G
但是,如果您想使用写入时复制(例如,要使用此功能来创建快照或者在虚拟机之间共享快照),请在命令行中省略 nocow
选项。
34.2.2.2 qemu-img convert #
使用 qemu-img convert
可将磁盘映像转换为另一种格式。要获取 QEMU 支持的映像格式的完整列表,请运行 qemu-img
-h
并查看输出的最后一行。该命令使用以下语法:
>
qemu-img convert -c1 -f fmt2 -O out_fmt3 -o options4 fname5 out_fname6
对目标磁盘映像应用压缩。只有 | |
源磁盘映像的格式。系统通常会自动检测格式,因此可以省略此参数。 | |
目标磁盘映像的格式。 | |
指定目标映像格式相关的其他选项。使用 | |
要转换的源磁盘映像的路径。 | |
转换后的目标磁盘映像的路径。 |
>
qemu-img convert -O vmdk /images/sles.raw \ /images/sles.vmdk>
ls -l /images/ -rw-r--r-- 1 tux users 4294967296 16. lis 10.50 sles.raw -rw-r--r-- 1 tux users 2574450688 16. lis 14.18 sles.vmdk
要查看选定目标映像格式相关的选项列表,请运行以下命令(请将 vmdk
替换为您的映像格式):
>
qemu-img convert -O vmdk /images/sles.raw \
/images/sles.vmdk -o ?
Supported options:
size Virtual disk size
backing_file File name of a base image
compat6 VMDK version 6 image
subformat VMDK flat extent format, can be one of {monolithicSparse \
(default) | monolithicFlat | twoGbMaxExtentSparse | twoGbMaxExtentFlat}
scsi SCSI image
34.2.2.3 qemu-img check #
使用 qemu-img check
可检查现有磁盘映像是否有错误。并非所有磁盘映像格式都支持此功能。该命令使用以下语法:
>
qemu-img check -f fmt1 fname2
如果未发现错误,该命令不返回任何输出,否则会显示所发现的错误的类型和数量。
>
qemu-img check -f qcow2 /images/sles.qcow2
ERROR: invalid cluster offset=0x2af0000
[...]
ERROR: invalid cluster offset=0x34ab0000
378 errors were found on the image.
34.2.2.4 增大现有磁盘映像的大小 #
创建新映像时,必须在创建映像之前指定其最大大小(请参见第 34.2.2.1 节 “qemu-img create”)。安装 VM Guest 并使用一段时间后,映像的初始大小可能不再够用。在这种情况下,可向映像增加空间。
要将现有磁盘映像的大小增大 2 GB,请使用:
>
qemu-img resize /images/sles.raw +2GB
您可以调整 raw
和 qcow2
格式的磁盘映像的大小。要调整其他格式的映像的大小,请先使用 qemu-img convert
将其转换为支持的格式。
现在,该映像的最后一个分区后面包含 2 GB 可用空间。您可以调整现有分区的大小,或添加新分区。
34.2.2.5 qcow2 文件格式的高级选项 #
qcow2 是 QEMU 使用的主要磁盘映像格式。其大小可按需增长,仅当虚拟机需要磁盘空间时才分配磁盘空间。
qcow2 格式的文件以恒定大小的单元进行组织。这些单元称为簇。从 Guest 的角度而言,虚拟磁盘也可划分为相同大小的簇。QEMU 默认为 64 kB 簇,但您可以在创建新映像时指定不同的值:
>
qemu-img create -f qcow2 -o cluster_size=128K virt_disk.qcow2 4G
qcow2 映像包含一组表,这些表划分为两个级别,分别称为 L1 表和 L2 表。每个磁盘映像只有一个 L1 表,而根据映像的大小,L2 表可能有很多。
要在虚拟磁盘中读取或写入数据,QEMU 需要读取其对应的 L2 表,以确定相关数据位置。由于为每个 I/O 操作读取该表会消耗系统资源,QEMU 会在内存中缓存 L2 表,以提高磁盘访问速度。
34.2.2.5.1 选择适当的缓存大小 #
缓存大小与分配的空间量相关。L2 缓存可以映射以下虚拟磁盘空间量:
disk_size = l2_cache_size * cluster_size / 8
使用默认 64 kB 簇大小,即
disk_size = l2_cache_size * 8192
因此,要使缓存在使用默认簇大小的情况下映射 n
GB 磁盘空间,需要
l2_cache_size = disk_size_GB * 131072
QEMU 默认使用 1 MB(1048576 字节)的 L2 缓存。根据上面的公式,1 MB 的 L2 缓存涵盖了 8 GB (1048576 / 131072) 的虚拟磁盘空间。这意味着,如果您的虚拟磁盘大小不超过 8 GB,则使用默认 L2 缓存大小可使性能保持正常。如果磁盘更大,则可以通过增大 L2 缓存大小来提高磁盘访问速度。
34.2.2.5.2 配置缓存大小 #
可以在 QEMU 命令行上使用 -drive
选项来指定缓存大小。或者,可以在通过 QMP 通讯时使用 blockdev-add
命令。有关 QMP 的详细信息,请参见第 36.11 节 “QMP - QEMU 计算机协议”。
以下选项配置虚拟 Guest 的缓存大小:
- l2-cache-size
L2 表缓存的最大大小。
- refcount-cache-size
refcount 块缓存的最大大小。有关 refcount 的详细信息,请参见 https://raw.githubusercontent.com/qemu/qemu/master/docs/qcow2-cache.txt。
- cache-size
上述两个缓存的合计最大大小。
指定上述选项的值时,请注意以下几点:
L2 缓存和 refcount 块缓存的大小需是簇大小的倍数。
如果您仅设置其中一个选项,QEMU 将自动调整其他选项,使 L2 缓存比 refcount 缓存大 4 倍。
refcount 缓存的使用频率比 L2 缓存要低得多,因此您可以将 refcount 缓存设置得小一些:
#
qemu-system-ARCH [...] \
-drive file=disk_image.qcow2,l2-cache-size=4194304,refcount-cache-size=262144
34.2.2.5.3 减少内存使用量 #
缓存越大,消耗的内存就越多。每个 qcow2 文件都有一个单独的 L2 缓存。使用大量较大的磁盘映像时,您可能需要相当大的内存量。如果您将后备文件(第 34.2.4 节 “有效操作磁盘映像”)和快照(请参见第 34.2.3 节 “使用 qemu-img 管理虚拟机的快照”)添加到 Guest 的设置链,则内存的消耗甚至更严重。
正因如此,QEMU 引入了 cache-clean-interval
设置。此设置定义一个以秒为单位的间隔,在此间隔过后,将从内存中去除未访问过的所有缓存项。
下面的示例每 10 分钟去除一次所有未使用的缓存项:
#
qemu-system-ARCH [...] -drive file=hd.qcow2,cache-clean-interval=600
如果未设置此选项,则默认值为 0,这会禁用此功能。
34.2.3 使用 qemu-img 管理虚拟机的快照 #
虚拟机快照是运行 VM Guest 的整个环境的快照。该快照包含处理器 (CPU)、内存 (RAM)、设备和所有可写磁盘的状态。
当您需要保存特定状态的虚拟机时,快照非常有用。例如,在虚拟化服务器上配置网络服务后,您可以从上次保存的虚拟机状态快速启动虚拟机。或者,您可以在关闭虚拟机之后创建快照,以便在尝试执行某种会导致 VM Guest 不稳定的试验性操作之前创建备份状态。本节介绍后一种做法,前一种做法会在第 36 章 “使用 QEMU 监视器管理虚拟机”中介绍。
要使用快照,您的 VM Guest 必须至少包含一个 qcow2
格式的可写硬盘映像。此设备通常是第一个虚拟硬盘。
虚拟机快照是在交互式 QEMU 监视器中使用 savevm
命令创建的。为了更方便地识别特定的快照,可为其指派一个标记。有关 QEMU 监视器的详细信息,请参见第 36 章 “使用 QEMU 监视器管理虚拟机”。
qcow2
磁盘映像包含保存的快照后,您可以使用 qemu-img snapshot
命令检查这些快照。
请不要在虚拟机正在运行时使用 qemu-img snapshot
命令创建或删除虚拟机快照。否则,可能会损坏包含保存的虚拟机状态的磁盘映像。
34.2.3.1 列出现有快照 #
使用 qemu-img snapshot -l
DISK_IMAGE 可查看 disk_image
映像中保存的所有现有快照的列表。即使 VM Guest 正在运行,您也可以获取该列表。
>
qemu-img snapshot -l /images/sles.qcow2
Snapshot list:
ID1 TAG2 VM SIZE3 DATE4 VM CLOCK5
1 booting 4.4M 2013-11-22 10:51:10 00:00:20.476
2 booted 184M 2013-11-22 10:53:03 00:02:05.394
3 logged_in 273M 2013-11-22 11:00:25 00:04:34.843
4 ff_and_term_running 372M 2013-11-22 11:12:27 00:08:44.965
34.2.3.2 创建已关闭虚拟机的快照 #
使用 qemu-img snapshot -c
SNAPSHOT_TITLE
DISK_IMAGE 可创建事先已关闭的虚拟机的当前状态快照。
>
qemu-img snapshot -c backup_snapshot /images/sles.qcow2
>
qemu-img snapshot -l /images/sles.qcow2
Snapshot list:
ID TAG VM SIZE DATE VM CLOCK
1 booting 4.4M 2013-11-22 10:51:10 00:00:20.476
2 booted 184M 2013-11-22 10:53:03 00:02:05.394
3 logged_in 273M 2013-11-22 11:00:25 00:04:34.843
4 ff_and_term_running 372M 2013-11-22 11:12:27 00:08:44.965
5 backup_snapshot 0 2013-11-22 14:14:00 00:00:00.000
如果某种情况干扰了 VM Guest 的运行,而您需要恢复到所保存快照(在本示例中为 ID 5)的状态,请关闭 VM Guest 并执行以下命令:
>
qemu-img snapshot -a 5 /images/sles.qcow2
下一次您使用 qemu-system-ARCH
运行虚拟机时,它将处于编号为 5 的快照的状态。
qemu-img snapshot -c
命令与 QEMU 监视器的 savevm
命令(请参见第 36 章 “使用 QEMU 监视器管理虚拟机”)无关。例如,对于使用 savevm
在 QEMU 监视器中创建的快照,无法使用 qemu-img snapshot -a
应用快照。
34.2.3.3 删除快照 #
使用 qemu-img snapshot -d
SNAPSHOT_ID
DISK_IMAGE 可删除虚拟机的旧快照或不需要的快照。这可以节省 qcow2
磁盘映像中的磁盘空间,因为快照数据占用的空间将会恢复:
>
qemu-img snapshot -d 2 /images/sles.qcow2
34.2.4 有效操作磁盘映像 #
假设存在以下真实情况:您是一名运行和管理多个虚拟化操作系统的服务器管理员。其中一组系统基于一个特定的发行套件,而另一组(或多个组)基于不同版本的发行套件,甚至不同的平台(也许不是 Unix)。使情况变得更复杂的是,基于同一发行套件的虚拟 Guest 系统会因部门和部署而各不相同。文件服务器使用的设置和服务通常与 Web 服务器不同,不过,两者可能都仍然基于 SUSE® Linux Enterprise Server。
使用 QEMU 可以创建“基本”磁盘映像。您可以将这些映像作为模板虚拟机使用。这些基本映像将为您节省大量时间,因为您无需多次安装同一个操作系统。
34.2.4.1 基本映像和派生映像 #
首先,照常构建一个磁盘映像,并在其中安装目标系统。有关详细信息,请参见第 34.1 节 “使用 qemu-system-ARCH
进行基本安装”和第 34.2.2 节 “创建、转换和检查磁盘映像”。然后使用第一个映像作为基本映像来构建新映像。基本映像也称为后备文件。构建新的派生映像后,切勿再次引导基本映像,而是引导派生映像。多个派生映像可以同时依赖于一个基本映像。因此,更改基本映像可能会损坏依赖性。使用派生映像时,QEMU 会将更改写入其中,并仅使用基本映像进行读取操作。
比较好的做法是基于一个全新安装(并已根据需要注册)并且未应用任何补丁且未在其中安装或去除其他应用程序的操作系统创建基本映像。以后,您可以在应用最新补丁后基于原始基本映像创建另一个基本映像。
34.2.4.2 创建派生映像 #
尽管您可以对基本映像使用 raw
格式,但不能对派生映像使用该格式,因为 raw
格式不支持 backing_file
选项。可对派生映像使用 qcow2
等格式。
例如,/images/sles_base.raw
是包含全新安装的系统的基本映像。
>
qemu-img info /images/sles_base.raw
image: /images/sles_base.raw
file format: raw
virtual size: 4.0G (4294967296 bytes)
disk size: 2.4G
该映像的保留大小为 4 GB,实际大小为 2.4 GB,格式为 raw
。使用以下命令创建自 /images/sles_base.raw
基本映像派生的映像:
>
qemu-img create -f qcow2 /images/sles_derived.qcow2 \
-o backing_file=/images/sles_base.raw
Formatting '/images/sles_derived.qcow2', fmt=qcow2 size=4294967296 \
backing_file='/images/sles_base.raw' encryption=off cluster_size=0
查看派生映像的细节:
>
qemu-img info /images/sles_derived.qcow2
image: /images/sles_derived.qcow2
file format: qcow2
virtual size: 4.0G (4294967296 bytes)
disk size: 140K
cluster_size: 65536
backing file: /images/sles_base.raw \
(actual path: /images/sles_base.raw)
尽管派生映像的保留大小与基本映像的大小相同 (4 GB),但实际大小仅为 140 KB。原因是只有对派生映像内部的系统进行的更改会保存下来。运行派生的虚拟机,根据需要注册,并应用最新补丁。在系统中进行任何其他更改,例如,去除不需要的软件包或安装新软件包。然后关闭 VM Guest 并再次检查其细节:
>
qemu-img info /images/sles_derived.qcow2
image: /images/sles_derived.qcow2
file format: qcow2
virtual size: 4.0G (4294967296 bytes)
disk size: 1.1G
cluster_size: 65536
backing file: /images/sles_base.raw \
(actual path: /images/sles_base.raw)
disk size
值已增长为 1.1 GB,这是文件系统(而不是基本映像)中的更改所占用的磁盘空间。
34.2.4.3 从派生映像重建基本映像 #
在修改派生映像(应用补丁、安装特定的应用程序、更改环境设置,等等)之后,它会达到所需的状态。此时,您可以合并原始基本映像和派生映像以创建新的基本映像。
原始基本映像 (/images/sles_base.raw
) 包含全新安装的系统。它可以是经过修改的新基本映像的模板,而新的基本映像可以包含与第一个基本映像相同的系统,加上所有安全补丁和更新补丁等内容。在创建此新基本映像后,还可将它用作更专用的派生映像的模板。新基本映像便会独立于原始基本映像。基于派生映像创建基本映像的过程称为重建基本映像:
>
qemu-img convert /images/sles_derived.qcow2 \
-O raw /images/sles_base2.raw
此命令创建了使用 raw
格式的新基本映像 /images/sles_base2.raw
。
>
qemu-img info /images/sles_base2.raw
image: /images/sles11_base2.raw
file format: raw
virtual size: 4.0G (4294967296 bytes)
disk size: 2.8G
新映像比原始基本映像大 0.4 GB。它不使用任何后备文件,您可以轻松基于此映像创建新的派生映像。这样,您便可以为组织中的虚拟磁盘映像创建复杂的层次结构,并节省大量的时间和工作。
34.2.4.4 在 VM 主机服务器上挂载映像 #
在主机系统下挂载虚拟磁盘映像的做法可能会很实用。强烈建议阅读第 19 章 “libguestfs”,并使用专用的工具来访问虚拟机映像。不过,如果您需要手动执行此操作,请按照本指南所述操作。
Linux 系统可以使用回写设备挂载 raw
磁盘映像的内部分区。第一个示例过程更复杂,但阐释得更清楚,而第二个过程则更简单直接:
在您要挂载其分区的磁盘映像中设置一个循环设备。
>
losetup /dev/loop0 /images/sles_base.raw确定您要挂载的分区的扇区大小和起始扇区编号。
>
fdisk -lu /dev/loop0 Disk /dev/loop0: 4294 MB, 4294967296 bytes 255 heads, 63 sectors/track, 522 cylinders, total 8388608 sectors Units = sectors of 1 * 512 = 5121 bytes Disk identifier: 0x000ceca8 Device Boot Start End Blocks Id System /dev/loop0p1 63 1542239 771088+ 82 Linux swap /dev/loop0p2 * 15422402 8385929 3421845 83 Linux计算分区起始偏移:
sector_size * sector_start = 512 * 1542240 = 789626880
删除循环,并在准备好的目录中,根据计算出的偏移挂载磁盘映像内的分区。
>
losetup -d /dev/loop0>
mount -o loop,offset=789626880 \ /images/sles_base.raw /mnt/sles/>
ls -l /mnt/sles/ total 112 drwxr-xr-x 2 root root 4096 Nov 16 10:02 bin drwxr-xr-x 3 root root 4096 Nov 16 10:27 boot drwxr-xr-x 5 root root 4096 Nov 16 09:11 dev [...] drwxrwxrwt 14 root root 4096 Nov 24 09:50 tmp drwxr-xr-x 12 root root 4096 Nov 16 09:16 usr drwxr-xr-x 15 root root 4096 Nov 16 09:22 var将一个或多个文件复制到挂载的分区,并在完成后卸载该分区。
>
cp /etc/X11/xorg.conf /mnt/sles/root/tmp>
ls -l /mnt/sles/root/tmp>
umount /mnt/sles/
切勿挂载处于 read-write
模式的运行中虚拟机映像的分区。这可能会损坏该分区并破坏整个 VM Guest。