35 使用 qemu-system-ARCH 运行虚拟机 #
准备好虚拟磁盘映像后(有关磁盘映像的详细信息,请参见第 34.2 节 “使用 qemu-img
管理磁盘映像”),便可以启动相关的虚拟机了。第 34.1 节 “使用 qemu-system-ARCH
进行基本安装”介绍了用于安装和运行 VM Guest 的简单命令。本章重点详细解释 qemu-system-ARCH
的用法,并针对更具体的任务提供解决方案。有关 qemu-system-ARCH
选项的完整列表,请参见其手册页 (man 1 qemu
)。
35.1 基本 qemu-system-ARCH
调用 #
qemu-system-ARCH
命令使用以下语法:
qemu-system-ARCH OPTIONS1 -drive file=DISK_IMAGE2
| |
包含要虚拟化的 Guest 系统的磁盘映像路径。 |
只有 64 位 ARM 体系结构 (AArch64) 上提供 KVM 支持。要在 AArch64 体系结构上运行 QEMU,您需要:
使用
-machine virt-VERSION_NUMBER
选项指定专用于 QEMU Arm® 虚拟机的计算机类型。使用
-bios
选项指定固件映像文件。也可以使用
-drive
选项指定固件映像文件,例如:-drive file=/usr/share/edk2/aarch64/QEMU_EFI-pflash.raw,if=pflash,format=raw -drive file=/var/lib/libvirt/qemu/nvram/opensuse_VARS.fd,if=pflash,format=raw
使用
-cpu host
选项指定 VM 主机服务器的 CPU(默认值为cortex-15
)。使用
-machine gic-version=host
选项指定与主机相同的通用中断控制器 (GIC) 版本(默认值为2
)。如需使用图形模式,请指定
virtio-gpu-pci
类型的图形设备。
例如:
>
sudo
qemu-system-aarch64 [...] \ -bios /usr/share/qemu/qemu-uefi-aarch64.bin \ -cpu host \ -device virtio-gpu-pci \ -machine virt,accel=kvm,gic-version=host
35.2 一般 qemu-system-ARCH
选项 #
本节介绍一般 qemu-system-ARCH
选项,以及与基本模拟硬件(例如虚拟机的处理器、内存、型号类型或时间处理方法)相关的选项。
-name NAME_OF_GUEST
指定运行中 Guest 系统的名称。该名称将显示在窗口标题中,用于 VNC 服务器。
-boot OPTIONS
指定定义的驱动器的引导顺序。驱动器以字母(盘符)表示,
a
和b
代表软盘驱动器 1 和 2,c
代表第一个硬盘,d
代表第一个 CD-ROM 驱动器,n
到p
代表 Ether 引导网络适配器。例如,
qemu-system-ARCH [...] -boot order=ndc
首先尝试从网络引导,然后尝试从第一个 CD-ROM 驱动器引导,最后尝试从第一个硬盘引导。-pidfile FILENAME
将 QEMU 的进程标识号 (PID) 存储在文件中。如果您从脚本运行 QEMU,此文件非常有用。
-nodefaults
默认情况下,即使您不在命令行上指定基本虚拟设备,QEMU 也会创建这些设备。此选项会关闭此功能,在此情况下,您必须手动指定每个设备,包括显卡和网卡、并行或串行端口,或虚拟控制台。默认连 QEMU 监控器都不会挂接。
-daemonize
启动 QEMU 进程后将其“守护程序化”。在 QEMU 准备好接收其任何设备上的连接后,会从标准输入和标准输出分离。
默认使用的 BIOS 是 SeaBIOS。您可以引导 USB 设备和任何驱动器(CD-ROM、软盘或硬盘)。SeaBIOS 支持 USB 鼠标和键盘,并支持多个 VGA 显卡。有关 SeaBIOS 的详细信息,请参见 SeaBIOS Website。
35.2.1 基本虚拟硬件 #
35.2.1.1 计算机类型 #
您可以指定模拟计算机的类型。运行 qemu-system-ARCH -M help
可查看支持的计算机类型列表。
不支持 isapc: ISA-only-PC 计算机类型。
35.2.1.2 CPU 型号 #
要指定处理器 (CPU) 型号的类型,请运行 qemu-system-ARCH -cpu
MODEL。使用 qemu-system-ARCH -cpu
help
可查看支持的 CPU 型号列表。
35.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
命令行示例:
>
sudo
qemu-system-x86_64 \ -name "SLES 15 SP6" \ -M pc-i440fx-2.7 -m 512 \ -machine accel=kvm -cpu kvm64 -smp 2 \ -drive format=raw,file=/images/sles.raw
-no-acpi
禁用 ACPI 支持。
-S
QEMU 在 CPU 停止的状态下启动。要启动 CPU,请在 QEMU 监控器中输入
c
。有关详细信息,请参见第 36 章 “使用 QEMU 监控器管理虚拟机”。
35.2.2 存储和读取虚拟设备的配置 #
-readconfig CFG_FILE
您无需每次想要运行 VM Guest 时都在命令行上输入设备配置选项,
qemu-system-ARCH
可以从先前使用-writeconfig
保存的或者手动编辑的文件中读取相应配置。-writeconfig CFG_FILE
将当前虚拟机的设备配置转储到文本文件,通过
-readconfig
选项可以重复使用该文件。>
sudo
qemu-system-x86_64 -name "SLES 15 SP6" \ -machine accel=kvm -M pc-i440fx-2.7 -m 512 -cpu kvm64 \ -smp 2 /images/sles.raw -writeconfig /images/sles.cfg (exited)>
cat /images/sles.cfg # qemu config file [drive] index = "0" media = "disk" file = "/images/sles_base.raw"这样,您便可以有条不紊地有效管理虚拟机的设备配置。
35.2.3 Guest 实时时钟 #
-rtc OPTIONS
指定在 VM Guest 中处理 RTC 的方式。Guest 的时钟默认自主机系统的时钟派生。因此,建议将主机系统时钟与精确的外部时钟同步(例如,通过 NTP 服务同步)。
如果您需要将 VM Guest 时钟与主机时钟隔离,请指定
clock=vm
,而不要使用默认值clock=host
。您也可以使用
base
选项来指定 VM Guest 时钟的初始时间:>
sudo
qemu-system-x86_64 [...] -rtc clock=vm,base=2010-12-03T01:02:00可以不指定时戳,而是指定
utc
或localtime
。前者指示 VM Guest 按当前 UTC(协调世界时,请参见 https://en.wikipedia.org/wiki/UTC)值启动,而后者则应用本地时间设置。
35.3 在 QEMU 中使用设备 #
QEMU 虚拟机会模拟运行 VM Guest 所需的所有设备。例如,QEMU 支持多种类型的网卡、块设备(硬盘和可移动驱动器)、USB 设备、字符设备(串行和并行端口)或多媒体设备(显卡和声卡)。本节介绍用于配置多种类型的受支持设备的选项。
如果需要为设备(例如 -drive
)设置特殊的驱动程序和驱动程序属性,请使用 -device
选项来指定,并使用 drive=
子选项进行标识。例如:
>
sudo
qemu-system-x86_64 [...] -drive if=none,id=drive0,format=raw \ -device virtio-blk-pci,drive=drive0,scsi=off ...
要获取有关可用驱动程序及其属性的帮助,请使用 -device ?
和 -device
DRIVER,?
。
35.3.1 块设备 #
块设备对于虚拟机而言至关重要。这些设备是称作驱动器的固定或可移动存储媒体。通常会用连接的硬盘中的其中一块保存要虚拟化的 Guest 操作系统。
虚拟机驱动器使用 -drive
来定义。此选项具有许多子选项,本节将介绍其中的一些子选项。有关完整列表,请参见手册页 (man 1 qemu
)。
-drive
选项的子选项 #file=image_fname
指定要用于此驱动器的磁盘映像的路径。如果未指定,将使用一个空(可移动)驱动器。
if=drive_interface
指定驱动器要连接到的接口类型。SUSE 目前仅支持
floppy
、scsi
、ide
或virtio
。virtio
定义半虚拟化磁盘驱动程序。默认值为ide
。index=index_of_connector
指定驱动器所连接到的磁盘接口(请参见
if
选项)上某个连接器的索引号。如果未指定,则索引会自动递增。media=type
指定媒体的类型。可以是
disk
(表示硬盘)或cdrom
(表示可移动的 CD-ROM 驱动器)。format=img_fmt
指定连接的磁盘映像的格式。如果未指定,系统会自动检测格式。SUSE 目前支持
raw
和qcow2
格式。cache=method
指定驱动器的缓存方法。可能的值为
unsafe
、writethrough
、writeback
、directsync
或none
。要在使用qcow2
映像格式时提高性能,请选择writeback
。none
会禁用主机页缓存,因此是最安全的选项。对于映像文件,默认值为writeback
。有关详细信息,请参见第 17 章 “磁盘缓存模式”。
为了简化块设备的定义,QEMU 能够识别多种简写形式,以方便您输入 qemu-system-ARCH
命令行。
可使用
>
sudo
qemu-system-x86_64 -cdrom /images/cdrom.iso
来代替
>
sudo
qemu-system-x86_64 -drive format=raw,file=/images/cdrom.iso,index=2,media=cdrom
和
>
sudo
qemu-system-x86_64 -hda /images/imagei1.raw -hdb /images/image2.raw -hdc \ /images/image3.raw -hdd /images/image4.raw
来代替
>
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
作为使用磁盘映像(请参见第 34.2 节 “使用 qemu-img
管理磁盘映像”)的替代方式,您还可以使用现有的 VM 主机服务器磁盘,将其作为驱动器进行连接,然后从 VM Guest 访问它们。请直接使用主机磁盘设备,而不要使用磁盘映像文件名。
要访问主机 CD-ROM 驱动器,请使用
>
sudo
qemu-system-x86_64 [...] -drive file=/dev/cdrom,media=cdrom
要访问主机硬盘,请使用
>
sudo
qemu-system-x86_64 [...] -drive file=/dev/hdb,media=disk
VM Guest 使用的主机驱动器不可同时由 VM 主机服务器或另一个 VM Guest 访问。
35.3.1.1 释放未使用的 Guest 磁盘空间 #
稀疏映像文件这种磁盘映像文件的大小会随着用户在其中添加数据而增长,它所占用的磁盘空间量等于其中存储的数据量。例如,如果您在稀疏磁盘映像中复制 1 GB 数据,则此映像的大小会增长 1 GB。如果您随后删除 500 MB(举例而言)的数据,映像大小默认不会按预期减小。
正因如此,KVM 命令行上引入了 discard=on
选项。此选项告知超级管理程序在从稀疏 Guest 映像中删除数据后自动释放“空洞”。此选项仅对 if=scsi
驱动器接口有效:
>
sudo
qemu-system-x86_64 [...] -drive format=img_format,file=/path/to/file.img,if=scsi,discard=on
不支持 if=scsi
。此接口不会映射到 virtio-scsi,而是映射到 lsi SCSI 适配器。
35.3.1.2 IOThread #
IOThread 是 virtio 设备的专用事件循环线程,用于执行 I/O 请求来提高可缩放性,尤其是在包含 SMP VM Guest 并使用许多磁盘设备的 SMP VM 主机服务器上。进行 I/O 处理时,IOThread 不会使用 QEMU 的主事件循环,而是允许将 I/O 工作分散到多个 CPU 之间,因而可改善延迟情况(如果配置正确)。
可通过定义 IOThread 对象来启用 IOThread。然后,virtio 设备可将这些对象用于其 I/O 事件循环。许多 virtio 设备都可以使用单个 IOThread 对象,或者可按 1:1 映射配置 virtio 设备和 IOThread 对象。以下示例创建 ID 为 iothread0
的单个 IOThread,然后,该 IOThread 将用作两个 virtio-blk 设备的事件循环。
>
sudo
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 映射:
>
sudo
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 [...]
35.3.1.3 virtio-blk 的基于 Bio 的 I/O 路径 #
为了提高 I/O 密集型应用程序的性能,内核版本 3.7 中为 virtio-blk 接口引入了新的 I/O 路径。这个基于 bio 的块设备驱动程序会跳过 I/O 调度程序,因此可缩短 Guest 中的 I/O 路径并降低延迟。对于 SSD 磁盘等高速存储设备,该驱动程序特别有用。
该驱动程序默认处于禁用状态。要使用该驱动程序,请执行以下操作:
在 Guest 上的内核命令行中追加
virtio_blk.use_bio=1
。可以通过 › › 执行此操作。为此,您也可以编辑
/etc/default/grub
,搜索包含GRUB_CMDLINE_LINUX_DEFAULT=
的行,并在末尾添加内核参数。然后运行grub2-mkconfig >/boot/grub2/grub.cfg
以更新 grub2 引导菜单。在激活新内核命令行的情况下重引导 Guest。
基于 bio 的 virtio-blk 驱动程序对于机械硬盘等慢速设备没有帮助。原因在于,调度所带来的优势大于缩短 bio 路径所带来的优势。请不要在慢速设备上使用基于 bio 的驱动程序。
35.3.1.4 直接访问 iSCSI 资源 #
QEMU 现已与 libiscsi
相集成。因此,QEMU 可以直接访问 iSCSI 资源并将其用作虚拟机块设备。此功能不需要任何主机 iSCSI 发起端配置,而基于 iSCSI 目标的 libvirt 存储池设置则需要这种配置。此功能通过用户空间库 libiscsi 直接将 Guest 存储接口连接到 iSCSI 目标 LUN。您也可以在 libvirt XML 配置中指定基于 iSCSI 的磁盘设备。
由于 iSCSI 协议存在某些技术方面的限制,仅当使用 RAW 映像格式时,此功能才可用。
下面是用于配置 iSCSI 连接的 QEMU 命令行界面。
virt-manager 界面尚未公开基于 libiscsi 的存储空间置备的用法,但是可以通过直接编辑 Guest XML 对其进行配置。这种访问基于 iSCSI 的存储空间的新方式通过命令行来实现。
>
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>
35.3.1.5 通过 QEMU 使用 RADOS 块设备 #
RADOS 块设备 (RBD) 将数据存储在 Ceph 群集中。这些设备支持快照、复制和数据一致性。您可以像使用其他块设备一样,从 KVM 管理的 VM Guest 使用 RBD。
有关更多细节,请参见 SUSE Enterprise Storage Administration Guide, chapter Ceph as a Back-end for QEMU KVM Instance。
35.3.2 图形设备和显示选项 #
本节介绍影响模拟视频卡类型的 QEMU 选项,以及 VM Guest 图形输出的显示方式。
35.3.2.1 定义视频卡 #
QEMU 使用 -vga
来定义用于显示 VM Guest 图形输出的视频卡。-vga
选项识别以下值:
none
在 VM Guest 上禁用视频卡(不模拟视频卡)。您仍可以通过串行控制台访问运行中的 VM Guest。
std
模拟标准的 VESA 2.0 VBE 视频卡。如果您打算在 VM Guest 上使用较高的显示分辨率,请使用此值。
- qxl
QXL 是半虚拟显卡。它与 VGA 兼容(包括 VESA 2.0 VBE 支持)。使用
spice
视频协议时,建议使用qxl
。- virtio
半虚拟 VGA 显卡。
35.3.2.2 显示选项 #
以下选项会影响 VM Guest 图形输出的显示方式。
-display gtk
在 GTK 窗口中显示视频输出。此界面提供用于在运行时配置和控制 VM 的 UI 元素。
-display sdl
通过 SDL 在单独的图形窗口中显示视频输出。有关详细信息,请参见 SDL 文档。
-spice option[,option[,...]]
启用 spice 远程桌面协议。
-display vnc
有关更多信息,请参考第 35.5 节 “使用 VNC 查看 VM Guest”。
-nographic
禁用 QEMU 的图形输出。模拟的串行端口将重定向到控制台。
使用
-nographic
启动虚拟机后,在虚拟控制台中按 Ctrl–A H 可查看其他有用快捷键的列表,例如,用于在控制台与 QEMU 监控器之间切换的快捷键。>
sudo
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
默认情况下,在按 Ctrl–Alt 之后,QEMU 窗口会释放“捕获的”鼠标。您可以将组合键更改为 Ctrl–Alt–Shift (
-alt-grab
) 或右 Ctrl 键 (-ctrl-grab
)。
35.3.3 USB 设备 #
可通过两种方式来创建可供 KVM 中的 VM Guest 使用的 USB 设备:可以在 VM Guest 中模拟新的 USB 设备,或将现有的主机 USB 设备分配给 VM Guest。要在 QEMU 中使用 USB 设备,首先需要通过 -usb
选项启用通用 USB 驱动程序。然后可以通过 -usbdevice
选项指定各个设备。
35.3.3.1 在 VM Guest 中模拟 USB 设备 #
SUSE 目前支持以下类型的 USB 设备:disk
、host
、serial
、braille
、net
、mouse
和 tablet
。
-usbdevice
选项的 USB 设备类型 #disk
基于文件模拟大容量存储设备。可以使用可选的
format
选项,而不要检测格式。>
sudo
qemu-system-x86_64 [...] -usbdevice disk:format=raw:/virt/usb_disk.rawhost
直通主机设备(由 bus.addr 标识)。
serial
主机字符设备的串行转换器。
braille
使用 BrlAPI 模拟盲文设备以显示盲文输出。
net
模拟支持 CDC 以太网和 RNDIS 协议的网络适配器。
mouse
模拟虚拟 USB 鼠标。此选项会覆盖默认的 PS/2 鼠标模拟。以下示例显示了使用
qemu-system-ARCH [...] -usbdevice mouse
启动的 VM Guest 上的鼠标硬件状态:>
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,则绘图板设备非常有用。有关更多信息,请参见第 35.5 节 “使用 VNC 查看 VM Guest”。
35.3.4 字符设备 #
使用 -chardev
可创建新的字符设备。该选项使用以下一般语法:
qemu-system-x86_64 [...] -chardev BACKEND_TYPE,id=ID_STRING
其中,BACKEND_TYPE 可以是 null
、socket
、udp
、msmouse
、vc
、file
、pipe
、console
、serial
、pty
、stdio
、braille
、tty
或 parport
。所有字符设备都必须有一个最长为 127 个字符的唯一标识字符串。此字符串用于在其他相关指令中标识该设备。有关后端的所有子选项的完整说明,请参见手册页 (man 1 qemu
)。下面是可用back-ends
的简要说明:
null
创建一个空设备,该设备不输出数据且会丢弃收到的所有数据。
stdio
连接到 QEMU 的进程标准输入和标准输出。
socket
创建双向流套接字。如果指定了 PATH,则创建 Unix 套接字:
>
sudo
qemu-system-x86_64 [...] -chardev \ socket,id=unix_socket1,path=/tmp/unix_socket1,serverSERVER 子选项指定该套接字是侦听套接字。
如果指定了 PORT,则创建 TCP 套接字:
>
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 的所有网络流量发送到远程主机。
>
sudo
qemu-system-x86_64 [...] \ -chardev udp,id=udp_fwd,host=mercury.example.com,port=7777该命令会在远程主机 mercury.example.com 上绑定端口 7777,并从中发送 VM Guest 网络流量。
vc
创建新的 QEMU 文本控制台。您可以选择性地指定虚拟控制台的尺寸:
>
sudo
qemu-system-x86_64 [...] -chardev vc,id=vc1,width=640,height=480 \ -mon chardev=vc1该命令会创建指定大小且名为
vc1
的新虚拟控制台,并将 QEMU 监控器连接到该控制台。file
将来自 VM Guest 的所有流量都记录到 VM 主机服务器上的一个文件。必须指定
path
,如果该路径不存在,系统将予以创建。>
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
)。
35.4 QEMU 中的网络 #
将 -netdev
选项与 -device
结合使用可为 VM Guest 定义特定类型的网络和网络接口卡。-netdev
选项的语法为
-netdev type[,prop[=value][,...]]
SUSE 目前支持以下网络类型:user
、bridge
和 tap
。有关 -netdev
子选项的完整列表,请参见手册页 (man 1 qemu
)。
-netdev
子选项 #bridge
使用指定的网络助手来配置 TAP 接口并将其挂接到指定的网桥。有关更多信息,请参见第 35.4.3 节 “桥接网络”。
user
指定用户模式网络。有关更多信息,请参见第 35.4.2 节 “用户模式网络”。
tap
指定桥接网络或路由网络。有关更多信息,请参见第 35.4.3 节 “桥接网络”。
35.4.1 定义网络接口卡 #
将 -netdev
与相关的 -device
选项一起使用可以添加新的模拟网卡:
>
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
指定网络设备类型。 | |
指定网卡的型号。使用
SUSE 目前支持型号
| |
将网络接口连接到 VLAN 1。您可以指定自己的编号,该编号主要用于标识目的。如果您省略此子选项,QEMU 将使用默认值 0。 | |
指定网卡的媒体访问控制 (MAC) 地址。它是一个唯一标识符,建议您始终指定该地址。如果未指定,QEMU 将提供自己的默认 MAC 地址,因此可能会在相关 VLAN 中造成 MAC 地址冲突。 |
35.4.2 用户模式网络 #
-netdev user
选项指示 QEMU 使用用户模式网络。如果未选择网络模式,则默认使用用户模式。因此,这些命令行等效于:
>
sudo
qemu-system-x86_64 -hda /images/sles_base.raw
>
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
来回复制文件。
35.4.2.1 命令行示例 #
本节提供了有关如何使用 QEMU 设置用户模式网络的几个示例。
>
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
>
sudo
qemu-system-x86_64 [...] \ -netdev user,id=hostnet0 \ -device virtio-net-pci,netdev=hostnet0,tftp=/images/tftp_dir1,\ bootfile=/images/boot/pxelinux.02
>
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 上运行,请输入
>
ssh qemu_host -p 2222
(其中,qemu_host
是主机系统的主机名或 IP 地址),以获取 VM Guest 的 SSH
提示。
35.4.3 桥接网络 #
使用 -netdev tap
选项时,QEMU 会通过将主机 TAP 网络设备连接到 VM Guest 的指定 VLAN 来创建网桥。该网络设备的网络接口便会对网络的其余部分可见。此方法默认不会启用,需要明确指定。
首先创建一个网桥,并将一个 VM 主机服务器物理网络接口(例如 eth0
)添加到其中:
启动
并选择 › 。单击
,然后从 窗口的 下拉框中选择 。单击 。选择您需要使用动态还是静态分配的 IP 地址,然后填写相关网络设置(如果适用)。
在
窗格中,选择要添加到网桥的以太网设备。单击
。出现有关调整已配置设备的提示时,请单击 。单击
以应用更改。检查是否已创建网桥:>
bridge link 2: eth0 state UP : <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 \ state forwarding priority 32 cost 100
35.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
网桥设备的名称。 | |
准备新的 TAP 设备并将其分配给运行脚本的用户。TAP 设备是常用于虚拟化和模拟设置的虚拟网络设备。 | |
启动新建的 TAP 网络接口。 | |
暂停 1 秒,以确保新 TAP 网络接口确实启动。 | |
将新 | |
| |
| |
删除网桥 | |
将 TAP 设备的状态设置为 | |
拆除 TAP 设备。 |
35.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
。
35.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 服务器。有关更多信息,请参见第 36 章 “使用 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 >
sudo
qemu-system-x86_64 [...] -vnc :5 # (on the client:)wilber >
vncviewer venus:5 &
35.5.1 保护 VNC 连接 #
默认的 VNC 服务器设置不使用任何形式的身份验证。在前面的示例中,任何用户都可以从网络中的任何主机连接和查看 QEMU VNC 会话。
系统提供了多个级别的安全性,可供您应用于 VNC 客户端/服务器连接。您可以使用口令、x509 证书、SASL 身份验证,甚至可在一条 QEMU 命令中结合多种身份验证方法来保护连接。
有关在 VM 主机服务器和客户端上配置 x509 证书的详细信息,请参见第 12.3.2 节 “使用 x509 证书进行远程 TLS/SSL 连接(qemu+tls
或 xen+tls
)”和第 12.3.2.3 节 “配置客户端并测试设置”。
Remmina VNC 查看器支持高级身份验证机制。对于此示例,我们假设服务器 x509 证书 ca-cert.pem
、server-cert.pem
和 server-key.pem
位于主机上的 /etc/pki/qemu
目录中。可将客户端证书放在任何自定义目录中,Remmina 在连接启动时会要求提供这些证书的路径。
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 监控器的输入/输出,您将无法管理该监控器。
QEMU VNC 服务器可对会话使用 TLS 加密,并使用 x509 证书进行身份验证。服务器将要求客户端提供证书,并根据 CA 证书验证提供的证书。如果您的公司可提供内部证书颁发机构,请使用此身份验证类型。
qemu-system-x86_64 [...] -vnc :5,tls,x509verify=/etc/pki/qemu
您可以将口令身份验证与 TLS 加密和 x509 证书身份验证结合使用,以便为客户端打造双层身份验证模型。运行以下命令后,请记得在 QEMU 监控器中设置口令:
qemu-system-x86_64 [...] -vnc :5,password,tls,x509verify=/etc/pki/qemu \ -monitor stdio
简单身份验证和安全层 (SASL) 是互联网协议中的身份验证和数据安全性框架。它集成了多种身份验证机制,例如 PAM、Kerberos、LDAP 等等。SASL 会维护自己的用户数据库,因此 VM 主机服务器上无需存在连接用户帐户。
出于安全考虑,建议您将 SASL 身份验证与 TLS 加密和 x509 证书结合使用:
qemu-system-x86_64 [...] -vnc :5,tls,x509,sasl -monitor stdio