跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / SUSE Linux Enterprise Server 文档 / 虚拟化指南 / 使用 QEMU 管理虚拟机 / 使用 qemu-system-ARCH 运行虚拟机
适用范围 SUSE Linux Enterprise Server 15 SP2

32 使用 qemu-system-ARCH 运行虚拟机

准备好虚拟磁盘映像后(有关磁盘映像的详细信息,请参见第 31.2 节 “使用 qemu-img 管理磁盘映像”),便可以启动相关的虚拟机了。第 31.1 节 “使用 qemu-system-ARCH 进行基本安装”介绍了用于安装和运行 VM Guest 的简单命令。本章会重点详细解释 qemu-system-ARCH 的用法,并针对更具体的任务提供解决方案。有关 qemu-system-ARCH 的完整选项列表,请参见其手册页 (man 1 qemu)。

32.1 基本的 qemu-system-ARCH 调用

qemu-system-ARCH 命令使用以下语法:

qemu-system-ARCH options1 disk_img2

1

qemu-system-ARCH 接受许多选项。其中的大部分选项定义模拟硬件的参数,其他选项会影响更一般性的模拟器行为。如果您不提供任何选项,则会使用默认值,在此情况下,您需要提供所要运行的磁盘映像的路径。

2

包含要虚拟化的 Guest 系统的磁盘映像路径。qemu-system-ARCH 支持许多映像格式。使用 qemu-img --help 可列出这些格式。如果您不以独立参数的形式提供磁盘映像的路径,则需要使用 -drive file= 选项。

32.2 常规 qemu-system-ARCH 选项

本节介绍常规 qemu-system-ARCH 选项,以及与基本模拟硬件(例如虚拟机的处理器、内存、型号类型或时间处理方法)相关的选项。

-name NAME_OF_GUEST

指定运行中 Guest 系统的名称。该名称将显示在窗口标题中,用于 VNC 服务器。

-boot OPTIONS

指定定义的驱动器的引导顺序。驱动器以字母(盘符)表示,ab 代表软盘驱动器 1 和 2,c 代表第一个硬盘,d 代表第一个 CD-ROM 驱动器,np 代表无盘引导网络适配器。

例如,qemu-system-ARCH [...] -boot order=ndc 首先尝试从网络引导,然后尝试从第一个 CD-ROM 驱动器引导,最后尝试从第一个硬盘引导。

-pidfile FILENAME

将 QEMU 的进程标识号 (PID) 储存在文件中。如果您从脚本运行 QEMU,此文件非常有用。

-nodefaults

默认情况下,即使您不在命令行上指定基本虚拟设备,QEMU 也会创建这些设备。此选项会关闭此功能,在此情况下,您必须手动指定每个设备,包括显卡和网卡、并行或串行端口,或虚拟控制台。默认连 QEMU 监视器都不会挂接。

-daemonize

启动 QEMU 进程后将其守护程序化。在 QEMU 准备好接收其任何设备上的连接后,它会从标准输入和标准输出分离。

注意
注意:SeaBIOS BIOS 实现

默认使用的 BIOS 是 SeaBIOS。您可以引导 USB 设备和任何驱动器(CD-ROM、软盘或硬盘)。SeaBIOS 支持 USB 鼠标和键盘,并支持多个 VGA 显卡。有关 SeaBIOS 的详细信息,请参见 SeaBIOS 网站

32.2.1 基本虚拟硬件

32.2.1.1 计算机类型

您可以指定模拟计算机的类型。运行 qemu-system-ARCH -M help 可查看支持的计算机类型列表。

注意
注意:ISA-PC

不支持 isapc: ISA-only-PC 计算机类型。

32.2.1.2 CPU 型号

要指定处理器 (CPU) 型号的类型,请运行 qemu-system-ARCH -cpu MODEL。使用 qemu-system-ARCH -cpu help 可查看支持的 CPU 型号列表。

CPUID 维基百科中提供了 CPU 标志信息。

32.2.1.3 其他基本选项

下面是从命令行启动 qemu 时最常用的选项列表。要查看所有可用选项,请参见 qemu-doc 手册页。

-m MEGABYTES

指定用作虚拟 RAM 大小的 MB 数。

-balloon virtio

指定用于动态更改指派给 VM Guest 的虚拟 RAM 内存量的半虚拟化设备。上限是使用 -m 指定的内存量。

-smp NUMBER_OF_CPUS

指定要模拟的 CPU 数量。QEMU 在 PC 平台上最多支持 255 个 CPU(其中最多有 64 个 CPU 可使用 KVM 加速)。此选项还接受其他 CPU 相关的参数,例如插槽数、每个插槽的核心数,或每个核心的线程数。

下面是有效的 qemu-system-ARCH 命令行示例:

tux > qemu-system-x86_64 -name "SLES 12 SP2" -M pc-i440fx-2.7 -m 512 \
-machine accel=kvm -cpu kvm64 -smp 2 -drive format=raw,file=/images/sles.raw
显示使用 SLES 作为 VM Guest 的 QEMU 窗口
图 32.1︰ 显示使用 SLES 作为 VM Guest 的 QEMU 窗口
-no-acpi

禁用 ACPI 支持。

-S

QEMU 在 CPU 停止的状态下启动。要启动 CPU,请在 QEMU 监视器中输入 c。有关更多信息,请参见第 33 章 “使用 QEMU 监视器管理虚拟机

32.2.2 储存和读取虚拟设备的配置

-readconfig CFG_FILE

您无需每次想要运行 VM Guest 时都在命令行上输入设备配置选项,qemu-system-ARCH 可以从先前使用 -writeconfig 保存的或者手动编辑的文件中读取相应配置。

-writeconfig CFG_FILE

将当前虚拟机的设备配置转储到文本文件,通过 -readconfig 选项可以重复使用该文件。

tux > qemu-system-x86_64 -name "SLES 12 SP2" -machine accel=kvm -M pc-i440fx-2.7 -m 512 -cpu kvm64 \
-smp 2 /images/sles.raw -writeconfig /images/sles.cfg
(exited)
tux > cat /images/sles.cfg
# qemu config file

[drive]
  index = "0"
  media = "disk"
  file = "/images/sles_base.raw"

这样,您便可以有条不紊地有效管理虚拟机的设备配置。

32.2.3 Guest 实时时钟

-rtc OPTIONS

指定在 VM Guest 中处理 RTC 的方式。Guest 的时钟默认自主机系统的时钟派生。因此,建议将主机系统时钟与精确的外部时钟同步(例如,通过 NTP 服务同步)。

如果您需要将 VM Guest 时钟与主机时钟隔离,请指定 clock=vm,而不要使用默认值 clock=host

您也可以使用 base 选项来指定 VM Guest 时钟的初始时间:

tux > qemu-system-x86_64 [...] -rtc clock=vm,base=2010-12-03T01:02:00

可以不指定时戳,而是指定 utclocaltime。前者指示 VM Guest 按当前 UTC(协调世界时,请参见 http://en.wikipedia.org/wiki/UTC)值启动,而后者则应用本地时间设置。

32.3 在 QEMU 中使用设备

QEMU 虚拟机会模拟运行 VM Guest 所需的所有设备。例如,QEMU 支持多种类型的网卡、块设备(硬盘和可移动驱动器)、USB 设备、字符设备(串行和并行端口)或多媒体设备(显卡和声卡)。本节介绍用于配置各种类型的受支持设备的选项。

提示
提示

如果需要为设备(例如 -drive)设置特殊的驱动程序和驱动程序属性,请使用 -device 选项来指定,并使用 drive= 子选项进行标识。例如:

tux > sudo qemu-system-x86_64 [...] -drive if=none,id=drive0,format=raw \
-device virtio-blk-pci,drive=drive0,scsi=off ...

要获取有关可用驱动程序及其属性的帮助,请使用 -device ? -device DRIVER,?

32.3.1 块设备

块设备对于虚拟机而言至关重要。一般情况下,这些设备是固定或可移动的储存媒体,通常称作驱动器。通常会用连接的硬盘中的其中一块保存要虚拟化的 Guest 操作系统。

虚拟机驱动器使用 -drive 来定义。此选项具有许多子选项,本节将介绍其中的一些子选项。有关完整列表,请参见手册页 (man 1 qemu)。

-drive 选项的子选项
file=image_fname

指定要用于此驱动器的磁盘映像的路径。如果未指定,将使用一个空(可移动)驱动器。

if=drive_interface

指定驱动器要连接到的接口类型。SUSE 目前仅支持 floppyscsiidevirtiovirtio 定义半虚拟化磁盘驱动程序。默认值为 ide

index=index_of_connector

指定驱动器所连接到的磁盘接口(请参见 if 选项)上某个连接器的索引号。如果未指定,则索引会自动递增。

media=type

指定媒体的类型。可以是 disk(表示硬盘)或 cdrom(表示可移动的 CD-ROM 驱动器)。

format=img_fmt

指定连接的磁盘映像的格式。如果未指定,系统会自动检测格式。SUSE 目前支持 rawqcow2 格式。

cache=method

指定驱动器的缓存方法。可能的值为 unsafewritethroughwritebackdirectsyncnone。要在使用 qcow2 映像格式时提高性能,请选择 writebacknone 会禁用主机页缓存,因此是最安全的选项。对于映像文件,默认值为 writeback。有关更多信息,请参见第 17 章 “磁盘缓存模式

提示
提示

为了简化块设备的定义,QEMU 能够识别多种简写形式,以方便您输入 qemu-system-ARCH 命令行。

可使用

tux > sudo qemu-system-x86_64 -cdrom /images/cdrom.iso

来代替

tux > sudo qemu-system-x86_64 -drive format=raw,file=/images/cdrom.iso,index=2,media=cdrom

可使用

tux > sudo qemu-system-x86_64 -hda /images/imagei1.raw -hdb /images/image2.raw -hdc \
/images/image3.raw -hdd /images/image4.raw

来代替

tux > sudo qemu-system-x86_64 -drive format=raw,file=/images/image1.raw,index=0,media=disk \
-drive format=raw,file=/images/image2.raw,index=1,media=disk \
-drive format=raw,file=/images/image3.raw,index=2,media=disk \
-drive format=raw,file=/images/image4.raw,index=3,media=disk
提示
提示:使用主机驱动器代替映像

作为使用磁盘映像(请参见第 31.2 节 “使用 qemu-img 管理磁盘映像”)的替代方式,您还可以使用现有的 VM 主机服务器磁盘,将其作为驱动器进行连接,然后从 VM Guest 访问它们。请直接使用主机磁盘设备,而不要使用磁盘映像文件名。

要访问主机 CD-ROM 驱动器,请使用

tux > sudo qemu-system-x86_64 [...] -drive file=/dev/cdrom,media=cdrom

要访问主机硬盘,请使用

tux > sudo qemu-system-x86_64 [...] -drive file=/dev/hdb,media=disk

VM Guest 使用的主机驱动器不可同时由 VM 主机服务器或另一个 VM Guest 访问。

32.3.1.1 释放未使用的 Guest 磁盘空间

稀疏映像文件这种磁盘映像文件的大小会随着用户在其中添加数据而增长,它所占用的磁盘空间量等于其中储存的数据量。例如,如果您在稀疏磁盘映像中复制 1 GB 数据,则此映像的大小会增长 1 GB。如果您随后删除 500 MB(举例而言)的数据,映像大小默认不会按预期减小。

正因如此,KVM 命令行上引入了 discard=on 选项。此选项告知超级管理程序在从稀疏 Guest 映像中删除数据后自动释放空洞。请注意,此选项仅对 if=scsi 驱动器接口有效:

tux > sudo qemu-system-x86_64 [...] -drive format=img_format,file=/path/to/file.img,if=scsi,discard=on
重要
重要:支持状态

不支持 if=scsi。此接口不会映射到 virtio-scsi,而是映射到 lsi SCSI 适配器

32.3.1.2 IOThread

IOThread 是 virtio 设备的专用事件循环线程,用于执行 I/O 请求来提高可缩放性,尤其是在包含 SMP VM Guest 并使用许多磁盘设备的 SMP VM 主机服务器上。IOThread 不使用 QEMU 的主事件循环进行 I/O 处理,而是允许将 I/O 工作分散到多个 CPU 之间,经过正确配置后将可以改善延迟情况。

可通过定义 IOThread 对象来启用 IOThread。然后,virtio 设备可将这些对象用于其 I/O 事件循环。许多 virtio 设备都可以使用单个 IOThread 对象,或者可按 1:1 映射配置 virtio 设备和 IOThread 对象。下面的示例会创建 ID 为 iothread0 的单个 IOThread,然后,该 IOThread 将用作两个 virtio-blk 设备的事件循环。

tux > qemu-system-x86_64 [...] -object iothread,id=iothread0\
-drive if=none,id=drive0,cache=none,aio=native,\
format=raw,file=filename -device virtio-blk-pci,drive=drive0,scsi=off,\
iothread=iothread0 -drive if=none,id=drive1,cache=none,aio=native,\
format=raw,file=filename -device virtio-blk-pci,drive=drive1,scsi=off,\
iothread=iothread0 [...]

下面的 qemu 命令行示例说明了 virtio 设备与 IOThread 之间的 1:1 映射:

tux > qemu-system-x86_64 [...] -object iothread,id=iothread0\
-object iothread,id=iothread1 -drive if=none,id=drive0,cache=none,aio=native,\
format=raw,file=filename -device virtio-blk-pci,drive=drive0,scsi=off,\
iothread=iothread0 -drive if=none,id=drive1,cache=none,aio=native,\
format=raw,file=filename -device virtio-blk-pci,drive=drive1,scsi=off,\
    iothread=iothread1 [...]

32.3.1.3 virtio-blk 的基于 Bio 的 I/O 路径

为了提高 I/O 密集型应用程序的性能,内核版本 3.7 中为 virtio-blk 接口引入了新的 I/O 路径。这个基于 bio 的块设备驱动程序会跳过 I/O 调度程序,因此可缩短 Guest 中的 I/O 路径并降低延迟。对于 SSD 磁盘等高速储存设备,该驱动程序特别有用。

该驱动程序默认处于禁用状态。要使用该驱动程序,请执行以下操作:

  1. 在 Guest 上的内核命令行中追加 virtio_blk.use_bio=1。可以通过 YaST › 系统 › 引导加载程序执行此操作。

    为此,您还可以编辑 /etc/default/grub,搜索包含 GRUB_CMDLINE_LINUX_DEFAULT= 的行,并在末尾添加内核参数。然后运行 grub2-mkconfig >/boot/grub2/grub.cfg 以更新 grub2 引导菜单。

  2. 在激活新内核命令行的情况下重引导 Guest。

提示
提示:慢速设备上基于 Bio 的驱动程序

基于 bio 的 virtio-blk 驱动程序对于机械硬盘等慢速设备没有帮助。原因在于,调度所带来的优势大于缩短 bio 路径所带来的优势。请不要在慢速设备上使用基于 bio 的驱动程序。

32.3.1.4 直接访问 iSCSI 资源

QEMU 现已与 libiscsi 相集成。因此,QEMU 可以直接访问 iSCSI 资源并将其用作虚拟机块设备。此功能不需要任何主机 iSCSI 发起端配置,而基于 iSCSI 目标的 libvirt 储存池设置则需要这种配置。此功能通过用户空间库 libiscsi 直接将 Guest 储存接口连接到 iSCSI 目标 LUN。您也可以在 libvirt XML 配置中指定基于 iSCSI 的磁盘设备。

注意
注意:RAW 映像格式

由于 iSCSI 协议存在一些技术方面的限制,仅当使用 RAW 映像格式时,此功能才可用。

下面是用于配置 iSCSI 连接的 QEMU 命令行界面。

注意
注意:virt-manager 限制

virt-manager 界面尚未公开基于 libiscsi 的储存供应的用法,但是可以通过直接编辑 Guest XML 对其进行配置。这种访问基于 iSCSI 的储存的新方式通过命令行来实现。

tux > sudo qemu-system-x86_64 -machine accel=kvm \
  -drive file=iscsi://192.168.100.1:3260/iqn.2016-08.com.example:314605ab-a88e-49af-b4eb-664808a3443b/0,\
  format=raw,if=none,id=mydrive,cache=none \
  -device ide-hd,bus=ide.0,unit=0,drive=mydrive ...

下面是使用基于协议的 iSCSI 的 Guest 域 XML 的示例代码段:

<devices>
...
  <disk type='network' device='disk'>
    <driver name='qemu' type='raw'/>
    <source protocol='iscsi' name='iqn.2013-07.com.example:iscsi-nopool/2'>
      <host name='example.com' port='3260'/>
    </source>
    <auth username='myuser'>
      <secret type='iscsi' usage='libvirtiscsi'/>
    </auth>
    <target dev='vda' bus='virtio'/>
  </disk>
</devices>

将此代码段与使用 virt-manager 设置的基于主机的 iSCSI 发起端示例相对比:

<devices>
...
  <disk type='block' device='disk'>
    <driver name='qemu' type='raw' cache='none' io='native'/>
    <source dev='/dev/disk/by-path/scsi-0:0:0:0'/>
    <target dev='hda' bus='ide'/>
    <address type='drive' controller='0' bus='0' target='0' unit='0'/>
  </disk>
  <controller type='ide' index='0'>
    <address type='pci' domain='0x0000' bus='0x00' slot='0x01'
             function='0x1'/>
  </controller>
</devices>

32.3.1.5 通过 QEMU 使用 RADOS 块设备

RADOS 块设备 (RBD) 将数据储存在 Ceph 群集中。这些设备支持快照、复制和数据一致性。您可以像使用其他块设备一样,从 KVM 管理的 VM Guest 使用 RBD。

有关更多细节,请参见《SUSE Enterprise Storage Administration Guide》(SUSE Enterprise Storage 管理指南)中的“Ceph as a Back-end for QEMU KVM Instance”(将 Ceph 用作 QEMU KVM 实例的后端”)一章

32.3.2 图形设备和显示选项

本节介绍影响模拟视频卡类型的 QEMU 选项,以及 VM Guest 图形输出的显示方式。

32.3.2.1 定义视频卡

QEMU 使用 -vga 来定义用于显示 VM Guest 图形输出的视频卡。-vga 选项识别以下值:

none

在 VM Guest 上禁用视频卡(不模拟视频卡)。您仍可以通过串行控制台访问运行中的 VM Guest。

std

模拟标准的 VESA 2.0 VBE 视频卡。如果您打算在 VM Guest 上使用较高的显示分辨率,请使用此值。

cirrus

模拟 Cirrus Logic GD5446 视频卡。如果您需要确保模拟视频硬件的高兼容性,则此值非常适合。大多数操作系统(甚至包括 Windows 95)都能识别此类视频卡。

提示
提示

为了在使用 cirrus 类型时获得最佳视频性能,请在 VM Guest 和 VM 主机服务器上都使用 16 位色深。

32.3.2.2 显示选项

以下选项会影响 VM Guest 图形输出的显示方式。

-display gtk

在 GTK 窗口中显示视频输出。此界面提供用于在运行时配置和控制 VM 的 UI 元素。

-display sdl

通过 SDL 显示视频输出(通常是在单独的图形窗口中)。有关详细信息,请参见 SDL 文档。

-spice option[,option[,...]]

启用 spice 远程桌面协议。

-display vnc

有关更多信息,请参考第 32.5 节 “使用 VNC 查看 VM Guest”

-nographic

禁用 QEMU 的图形输出。模拟的串行端口将重定向到控制台。

使用 -nographic 启动虚拟机后,在虚拟控制台中按 CtrlA H 可查看其他有用快捷键的列表,例如,用于在控制台与 QEMU 监视器之间切换的快捷键。

tux > qemu-system-x86_64 -hda /images/sles_base.raw -nographic

C-a h    print this help
C-a x    exit emulator
C-a s    save disk data back to file (if -snapshot)
C-a t    toggle console timestamps
C-a b    send break (magic sysrq)
C-a c    switch between console and monitor
C-a C-a  sends C-a
(pressed C-a c)

QEMU 2.3.1 monitor - type 'help' for more information
(qemu)
-no-frame

禁用 QEMU 窗口的装饰。便于在专用桌面工作空间中操作。

-full-screen

以全屏模式启动 QEMU 图形输出。

-no-quit

禁用 QEMU 窗口的关闭按钮,防止强行关闭窗口。

-alt-grab-ctrl-grab

默认情况下,在按 CtrlAlt 之后,QEMU 窗口会释放捕获的鼠标。您可以将组合键更改为 CtrlAltShift (-alt-grab) 或右 Ctrl 键 (-ctrl-grab)。

32.3.3 USB 设备

可通过两种方式来创建可供 KVM 中的 VM Guest 使用的 USB 设备:可以在 VM Guest 中模拟新的 USB 设备,或将现有的主机 USB 设备指派给 VM Guest。要在 QEMU 中使用 USB 设备,首先需要通过 -usb 选项启用通用 USB 驱动程序。然后可以通过 -usbdevice 选项指定各个设备。

32.3.3.1 在 VM Guest 中模拟 USB 设备

SUSE 目前支持以下类型的 USB 设备:diskhostserialbraillenetmousetablet

-usbdevice 选项的 USB 设备类型
disk

基于文件模拟大容量储存设备。可以使用可选的 format 选项,而不要检测格式。

tux > qemu-system-x86_64 [...] -usbdevice
        disk:format=raw:/virt/usb_disk.raw
host

直通主机设备(由 bus.addr 标识)。

serial

主机字符设备的串行转换器。

braille

使用 BrlAPI 模拟盲文设备以显示盲文输出。

net

模拟支持 CDC 以太网和 RNDIS 协议的网络适配器。

mouse

模拟虚拟 USB 鼠标。此选项会覆盖默认的 PS/2 鼠标模拟。下面的示例显示了使用 qemu-system-ARCH [...] -usbdevice mouse 启动的 VM Guest 上的鼠标硬件状态:

tux > sudo hwinfo --mouse
20: USB 00.0: 10503 USB Mouse
[Created at usb.122]
UDI: /org/freedesktop/Hal/devices/usb_device_627_1_1_if0
[...]
Hardware Class: mouse
Model: "Adomax QEMU USB Mouse"
Hotplug: USB
Vendor: usb 0x0627 "Adomax Technology Co., Ltd"
Device: usb 0x0001 "QEMU USB Mouse"
[...]
tablet

模拟使用绝对坐标的定位设备(例如触摸屏)。此选项会覆盖默认的 PS/2 鼠标模拟。如果您要通过 VNC 协议查看 VM Guest,则绘图板设备非常有用。有关更多信息,请参见第 32.5 节 “使用 VNC 查看 VM Guest”

32.3.4 字符设备

使用 -chardev 可创建新的字符设备。该选项使用以下一般语法:

qemu-system-x86_64 [...] -chardev BACKEND_TYPE,id=ID_STRING

其中,BACKEND_TYPE 可以是 nullsocketudpmsmousevcfilepipeconsoleserialpty、​stdiobraillettyparport。所有字符设备都必须有一个最长为 127 个字符的唯一标识字符串。此字符串用于在其他相关指令中标识该设备。有关后端的所有子选项的完整说明,请参见手册页 (man 1 qemu)。下面是可用后端的简要说明:

null

创建一个空设备,该设备不输出数据且会丢弃收到的所有数据。

stdio

连接到 QEMU 的进程标准输入和标准输出。

socket

创建双向流套接字。如果指定了 PATH,则创建 Unix 套接字:

tux > sudo qemu-system-x86_64 [...] -chardev \
socket,id=unix_socket1,path=/tmp/unix_socket1,server

SERVER 子选项指定该套接字是监听套接字。

如果指定了 PORT,则创建 TCP 套接字:

tux > sudo qemu-system-x86_64 [...] -chardev \
socket,id=tcp_socket1,host=localhost,port=7777,server,nowait

该命令在端口 7777 上创建一个本地监听 (server) TCP 套接字。QEMU 将不会因为等待客户端连接到监听端口而进入阻塞状态 (nowait)。

udp

通过 UDP 协议将来自 VM Guest 的所有网络流量发送到远程主机。

tux > sudo qemu-system-x86_64 [...] \
-chardev udp,id=udp_fwd,host=mercury.example.com,port=7777

该命令在远程主机 mercury.example.com 上绑定端口 7777,并从中发送 VM Guest 网络流量。

vc

创建新的 QEMU 文本控制台。您可以选择性地指定虚拟控制台的尺寸:

tux > sudo qemu-system-x86_64 [...] -chardev vc,id=vc1,width=640,height=480 \
-mon chardev=vc1

该命令会创建指定大小且名为 vc1 的新虚拟控制台,并将 QEMU 监视器连接到该控制台。

file

将来自 VM Guest 的所有流量都记录到 VM 主机服务器上的一个文件。必须指定 path,如果该路径不存在,系统将会予以创建。

tux > sudo qemu-system-x86_64 [...] \
-chardev file,id=qemu_log1,path=/var/log/qemu/guest1.log

默认情况下,QEMU 将为串行与并行端口创建一组字符设备,并为 QEMU 监视器创建一个特殊控制台。不过,您可以创建自己的字符设备,并将其用于所述目的。以下选项可为您提供帮助:

-serial CHAR_DEV

将 VM Guest 的虚拟串行端口重定向到 VM 主机服务器上的字符设备 CHAR_DEV。在图形模式下,此设备默认是一个虚拟控制台 (vc);在非图形模式下,默认则是 stdio-serial 可识别许多子选项。有关子选项的完整列表,请参见手册页 man 1 qemu

您最多可以模拟四个串行端口。使用 -serial none 可禁用所有串行端口。

-parallel DEVICE

将 VM Guest 的并行端口重定向到 DEVICE。此选项支持的设备与 -serial 相同。

提示
提示

使用 SUSE Linux Enterprise Server 作为 VM 主机服务器时,您可以直接使用硬件并行端口设备 /dev/parportN(其中的 N 是端口号)。

您最多可以模拟三个并行端口。使用 -parallel none 可禁用所有并行端口。

-monitor CHAR_DEV

将 QEMU 监视器重定向到 VM 主机服务器上的字符设备 CHAR_DEV。此选项支持的设备与 -serial 相同。在图形模式下,此设备默认是一个虚拟控制台 (vc);在非图形模式下,默认则是 stdio

有关可用字符设备后端的完整列表,请参见手册页 (man 1 qemu)。

32.4 QEMU 中的网络

-netdev 选项与 -device 结合使用可为 VM Guest 定义特定类型的网络和网络接口卡。-netdev 选项的语法为

-netdev type[,prop[=value][,...]]

SUSE 目前支持以下网络类型:userbridgetap。有关 -netdev 子选项的完整列表,请参见手册页 (man 1 qemu)。

支持的 -netdev 子选项
bridge

使用指定的网络助手来配置 TAP 接口并将其挂接到指定的网桥。有关更多信息,请参见第 32.4.3 节 “桥接网络”

user

指定用户模式网络。有关更多信息,请参见第 32.4.2 节 “用户模式网络”

tap

指定桥接网络或路由网络。有关更多信息,请参见第 32.4.3 节 “桥接网络”

32.4.1 定义网络接口卡

-netdev 与相关的 -device 选项搭配使用可以添加新的模拟网卡:

tux > sudo qemu-system-x86_64 [...] \
-netdev tap1,id=hostnet0 \
-device virtio-net-pci2,netdev=hostnet0,vlan=13,\
macaddr=00:16:35:AF:94:4B4,name=ncard1

1

指定网络设备类型。

2

指定网卡的型号。使用 qemu-system-ARCH -device help 并搜索 Network devices: 部分可以获取您平台上受 QEMU 支持的所有网卡型号的列表。

SUSE 目前支持型号 rtl8139e1000 及其衍生产品 e1000-82540eme1000-82544gce1000-82545emvirtio-net-pci。要查看特定驱动程序的选项列表,请添加 help 作为驱动程序选项:

tux > sudo qemu-system-x86_64 -device e1000,help
e1000.mac=macaddr
e1000.vlan=vlan
e1000.netdev=netdev
e1000.bootindex=int32
e1000.autonegotiation=on/off
e1000.mitigation=on/off
e1000.addr=pci-devfn
e1000.romfile=str
e1000.rombar=uint32
e1000.multifunction=on/off
e1000.command_serr_enable=on/off

3

将网络接口连接到 VLAN 1。您可以指定自己的编号,该编号主要用于标识目的。如果您省略此子选项,QEMU 将使用默认值 0。

4

指定网卡的媒体访问控制 (MAC) 地址。它是一个唯一标识符,建议您始终指定该地址。如果未指定,QEMU 将提供自己的默认 MAC 地址,因此可能会在相关 VLAN 中造成 MAC 地址冲突。

32.4.2 用户模式网络

-netdev user 选项指示 QEMU 使用用户模式网络。如果未选择网络模式,则默认使用用户模式。因此,这些命令行等效于:

tux > sudo qemu-system-x86_64 -hda /images/sles_base.raw
tux > sudo qemu-system-x86_64 -hda /images/sles_base.raw -netdev user,id=hostnet0

如果您要允许 VM Guest 访问外部网络资源(例如因特网),则此模式非常有用。默认不允许任何传入流量,因此 VM Guest 对于网络中的其他计算机不可见。在此网络模式下,将不需要管理员特权。用户模式还可用于从 VM 主机服务器上的本地目录在 VM Guest 上执行网络引导。

VM Guest 会获得虚拟 DHCP 服务器分配的一个 IP 地址。可通过 10.0.2.2 访问 VM 主机服务器(DHCP 服务器),而分配的 IP 地址范围从 10.0.2.15 开始。您可以使用 ssh 连接到 10.0.2.2 上的 VM 主机服务器,并使用 scp 来回复制文件。

32.4.2.1 命令行示例

本节提供了有关如何使用 QEMU 设置用户模式网络的几个示例。

例 32.1︰ 受限用户模式网络
tux > sudo qemu-system-x86_64 [...] \
-netdev user1,id=hostnet0 \
-device virtio-net-pci,netdev=hostnet0,vlan=12,name=user_net13,restrict=yes4

1

指定用户模式网络。

2

连接到 VLAN 1。如果省略此选项,则默认使用 0。

3

指定网络堆栈的直观易懂名称。可用于在 QEMU 监视器中标识该堆栈。

4

隔离 VM Guest。这样 VM Guest 将无法与 VM 主机服务器通讯,并且网络包将不会路由到外部网络。

例 32.2︰ 使用自定义 IP 范围的用户模式网络
tux > sudo qemu-system-x86_64 [...] \
-netdev user,id=hostnet0 \
-device virtio-net-pci,netdev=hostnet0,net=10.2.0.0/81,host=10.2.0.62,\
dhcpstart=10.2.0.203,hostname=tux_kvm_guest4

1

指定 VM Guest 看到的网络 IP 地址,以及可选的网络掩码。默认值为 10.0.2.0/8。

2

指定 VM Guest 看到的 VM 主机服务器 IP 地址。默认值为 10.0.2.2。

3

指定可由内置 DHCP 服务器指派给 VM Guest 的 16 个 IP 地址中的第一个。默认值为 10.0.2.15。

4

指定内置 DHCP 服务器将指派给 VM Guest 的主机名。

例 32.3︰ 使用网络引导和 TFTP 的用户模式网络
tux > sudo qemu-system-x86_64 [...] \
-netdev user,id=hostnet0 \
-device virtio-net-pci,netdev=hostnet0,tftp=/images/tftp_dir1,\
bootfile=/images/boot/pxelinux.02

1

激活内置 TFTP(提供最为基本的 FTP 功能的文件传输协议)服务器。指定目录中的文件将以 TFTP 服务器根目录的形式显示给 VM Guest。

2

以 BOOTP(可提供引导映像 IP 地址和网络位置的一种网络协议,通常在无盘工作站中使用)文件的形式广播指定的文件。与 tftp 搭配使用时,可以通过主机上的本地目录从网络引导 VM Guest。

例 32.4︰ 使用主机端口转发的用户模式网络
tux > sudo qemu-system-x86_64 [...] \
-netdev user,id=hostnet0 \
-device virtio-net-pci,netdev=hostnet0,hostfwd=tcp::2222-:22

将主机上端口 2222 的传入 TCP 连接转发到 VM Guest 上的端口 22 (SSH)。如果 sshd 正在 VM Guest 上运行,请输入

tux > ssh qemu_host -p 2222

(其中,qemu_host 是主机系统的主机名或 IP 地址),以获取 VM Guest 的 SSH 提示。

32.4.3 桥接网络

使用 -netdev tap 选项时,QEMU 会通过将主机 TAP 网络设备连接到 VM Guest 的指定 VLAN 来创建网桥。该网络设备的网络接口便会对网络的其余部分可见。此方法默认未启用,需要显式指定。

首先创建一个网桥,并将一个 VM 主机服务器物理网络接口(通常是 eth0)添加到其中:

  1. 启动 YaST 控制中心并选择系统 › 网络设置

  2. 单击添加,然后从硬件对话框窗口的设备类型下拉框中选择网桥。单击下一步

  3. 选择您需要使用动态还是静态指派的 IP 地址,然后填写相关网络设置(如果适用)。

  4. 桥接的设备窗格中,选择要添加到网桥的以太网设备。

    单击下一步。出现有关调整已配置设备的提示时,请单击继续

  5. 单击确定以应用更改。检查是否已创建网桥:

    tux > bridge link
    2: eth0 state UP : <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 \
     state forwarding priority 32 cost 100

32.4.3.1 手动连接到网桥

使用以下示例脚本将 VM Guest 连接到新建的网桥接口 br0。脚本中的数个命令通过 sudo 机制运行,原因是这些命令需要 root 特权。

提示
提示:要求的软件

要管理网桥,需要安装 tunctl 软件包。

#!/bin/bash
bridge=br01
tap=$(sudo tunctl -u $(whoami) -b)2
sudo ip link set $tap up3
sleep 1s4
sudo ip link add name $bridge type bridge
sudo ip link set $bridge up
sudo ip link set $tap master $bridge5
qemu-system-x86_64 -machine accel=kvm -m 512 -hda /images/sles_base.raw \
 -netdev tap,id=hostnet0 \
 -device virtio-net-pci,netdev=hostnet0,vlan=0,macaddr=00:16:35:AF:94:4B,\
 ifname=$tap6,script=no7,downscript=no
sudo ip link set $tap nomaster8
sudo ip link set $tap down9
sudo tunctl -d $tap10

1

网桥设备的名称。

2

准备新的 TAP 设备并将其指派给运行脚本的用户。TAP 设备是常用于虚拟化和模拟设置的虚拟网络设备。

3

启动新建的 TAP 网络接口。

4

暂停 1 秒,以确保新 TAP 网络接口确实启动。

5

将新 TAP 设备添加到网桥 br0

6

ifname= 子选项指定用于桥接的 TAP 网络接口的名称。

7

qemu-system-ARCH 在连接到网桥之前,会检查 scriptdownscript 值。如果它在 VM 主机服务器文件系统上找到了指定的脚本,将会在连接到网桥之前运行 script,并在退出网络环境之后运行 downscript。您可以使用这些脚本来设置和拆除桥接接口。默认会检查 /etc/qemu-ifup/etc/qemu-ifdown。如果指定了 script=nodownscript=no,则会禁用脚本执行功能,您需要手动处理其执行。

8

删除网桥 br0 中的 TAP 接口。

9

将 TAP 设备的状态设置为 down

10

拆除 TAP 设备。

32.4.3.2 使用 qemu-bridge-helper 连接到网桥

通过网桥将 VM Guest 连接到网络的另一种方式是使用 qemu-bridge-helper 助手程序。该程序可为您配置 TAP 接口并将其挂接到指定的网桥。默认的助手可执行文件为 /usr/lib/qemu-bridge-helper。该助手可执行文件的权限要求为 setuid root,也就是说,只允许虚拟化组 (kvm) 的成员执行。因此,qemu-system-ARCH 命令本身并不需要以 root 特权运行。

当您指定网桥时,会自动调用该助手:

qemu-system-x86_64 [...] \
 -netdev bridge,id=hostnet0,vlan=0,br=br0 \
 -device virtio-net-pci,netdev=hostnet0

您可以使用 helper=/path/to/your/helper 选项指定自己的自定义助手脚本来处理 TAP 设备配置(解除配置):

qemu-system-x86_64 [...] \
 -netdev bridge,id=hostnet0,vlan=0,br=br0,helper=/path/to/bridge-helper \
 -device virtio-net-pci,netdev=hostnet0
提示
提示

要定义对 qemu-bridge-helper 的访问特权,请检查 /etc/qemu/bridge.conf 文件。例如,以下指令

allow br0

允许 qemu-system-ARCH 命令将其 VM Guest 连接到网桥 br0

32.5 使用 VNC 查看 VM Guest

默认情况下,QEMU 使用 GTK(一个跨平台工具包库)窗口来显示 VM Guest 的图形输出。如果指定了 -vnc 选项,您可以让 QEMU 监听指定的 VNC 显示器,并将其图形输出重定向到 VNC 会话。

提示
提示

通过 VNC 会话操作 QEMU 的虚拟机时,使用 -usbdevice tablet 选项会很有用。

此外,如果您需要使用另一种键盘布局而不是默认的 en-us,请使用 -k 选项指定所需布局。

-vnc 的第一个子选项必须是 display 值。-vnc 选项识别以下 display 指定值:

host:display

只接受来自显示器编号 display 上的 host 的连接。随后运行 VNC 会话的 TCP 端口通常是值为 5900 + display 的数字。如果未指定 host,系统将接受来自任何主机的连接。

unix:path

VNC 服务器监听 Unix 域套接字上的连接。path 选项指定相关 Unix 套接字的位置。

none

将初始化 VNC 服务器功能,但不启动该服务器本身。您稍后可以使用 QEMU 监视器启动 VNC 服务器。有关更多信息,请参见第 33 章 “使用 QEMU 监视器管理虚拟机

可以在 display 值的后面使用一个或多个选项标志(以逗号分隔)。有效选项为:

reverse

通过反向连接来连接监听方 VNC 客户端。

websocket

额外打开一个专用于 VNC Websocket 连接的 TCP 监听端口。根据定义,Websocket 端口为 5700+display。

password

要求对客户端连接使用基于口令的身份验证。

tls

要求客户端在与 VNC 服务器通讯时使用 TLS。

x509=/path/to/certificate/dir

指定了 TLS 时有效。要求使用 x509 身份凭证来协商 TLS 会话。

x509verify=/path/to/certificate/dir

指定了 TLS 时有效。要求使用 x509 身份凭证来协商 TLS 会话。

sasl

要求客户端使用 SASL 向 VNC 服务器进行身份验证。

acl

打开访问控制列表,以检查 x509 客户端证书和 SASL 参与方。

lossy

启用有损压缩方法(梯度、JPEG 等)。

non-adaptive

禁用自适应编码。默认会启用自适应编码。

share=[allow-exclusive|force-shared|ignore]

设置显示共享策略。

注意
注意

有关显示选项的更多细节,请参见 qemu-doc 手册页。

VNC 示例用法:

tux > qemu-system-x86_64 [...] -vnc :5
# (on the client:)
wilber > vncviewer venus:5 &
QEMU VNC 会话
图 32.2︰ QEMU VNC 会话

32.5.1 保护 VNC 连接

默认的 VNC 服务器设置不使用任何形式的身份验证。在前面的示例中,任何用户都可以从网络中的任何主机连接和查看 QEMU VNC 会话。

系统提供了多个级别的安全性,可供您应用于 VNC 客户端/服务器连接。您可以使用口令、x509 证书、SASL 身份验证,甚至可在一条 QEMU 命令中结合数种身份验证方法来保护连接。

有关在 VM 主机服务器和客户端上配置 x509 证书的详细信息,请参见第 11.3.2 节 “使用 x509 证书进行远程 TLS/SSL 连接(qemu+tlsxen+tls)”第 11.3.2.3 节 “配置客户端并测试设置”

Remmina VNC 查看器支持高级身份验证机制。因此,在以下示例中将使用该查看器来查看 VM Guest 的图形输出。对于此示例,我们假设服务器 x509 证书 ca-cert.pemserver-cert.pemserver-key.pem 位于主机上的 /etc/pki/qemu 目录中。可将客户端证书放在任何自定义目录中,Remmina 在连接启动时会要求提供这些证书的路径。

例 32.5︰ 口令身份验证
qemu-system-x86_64 [...] -vnc :5,password -monitor stdio

在 VNC 显示器编号 5(通常为端口 5905)上启动 VM Guest 图形输出。password 子选项会初始化一种基于口令的简单身份验证方法。默认未设置口令,您需要在 QEMU 监视器中使用 change vnc password 命令设置一个口令:

QEMU 2.3.1 monitor - type 'help' for more information
(qemu) change vnc password
Password: ****

在此处需指定 -monitor stdio 选项,因为如果不重定向 QEMU 监视器的输入/输出,您将无法管理该监视器。

Remmina 中的身份验证对话框
图 32.3︰ Remmina 中的身份验证对话框
例 32.6︰ x509 证书身份验证

QEMU VNC 服务器可对会话使用 TLS 加密,并使用 x509 证书进行身份验证。服务器将要求客户端提供证书,并根据 CA 证书验证提供的证书。如果您的公司可提供内部证书颁发机构,请使用此身份验证类型。

qemu-system-x86_64 [...] -vnc :5,tls,x509verify=/etc/pki/qemu
例 32.7︰ x509 证书和口令身份验证

您可以将口令身份验证与 TLS 加密和 x509 证书身份验证结合使用,以便为客户端打造双层身份验证模型。运行以下命令后,请记得在 QEMU 监视器中设置口令:

qemu-system-x86_64 [...] -vnc :5,password,tls,x509verify=/etc/pki/qemu \
-monitor stdio
例 32.8︰ SASL 身份验证

简单身份验证和安全层 (SASL) 是因特网协议中的身份验证和数据安全性框架。它集成了多种身份验证机制,例如 PAM、Kerberos、LDAP 等等。SASL 会维护自己的用户数据库,因此 VM 主机服务器上无需存在连接用户帐户。

出于安全原因,建议您将 SASL 身份验证与 TLS 加密和 x509 证书结合使用:

qemu-system-x86_64 [...] -vnc :5,tls,x509,sasl -monitor stdio