第二十四章 虚拟化24.1. 简介24.2. FreeBSD作为macOS®Parallels Desktop的访客24.2.1. 在Mac®上的Parallels Desktop上安装FreeBSD24.2.2. 在Parallels上配置FreeBSD24.3. FreeBSD作为macOS®VMware Fusion的访客24.3.1. 在VMware Fusion上安装FreeBSD24.3.2. 在VMware Fusion上配置FreeBSD24.4. FreeBSD作为VirtualBox™的访客24.5. FreeBSD作为VirtualBox™的主机24.5.1. 安装VirtualBox™24.5.2. VirtualBox™USB支持24.5.3. VirtualBox™主机DVD/CD访问24.6. FreeBSD上QEMU的虚拟化24.6.1. 安装QEMU软件24.6.2. 虚拟机安装24.6.3. 使用技巧24.6.3.1. 使用X Window系统24.6.3.2. 使用QEMU窗口24.6.3.3. 使用QEMU窗口菜单24.6.3.4. 其他QEMU窗口菜单选项24.6.4. 向来宾VM添加串行端口接口24.6.4.1. 串行控制台使用注意事项24.6.5. QEMU用户模式仿真24.6.5.1. 在x86_64主机上设置SPARC64来宾VM24.6.6. 使用QEMU监视器24.6.6.1. 向虚拟机添加新磁盘24.6.6.2. 使用QEMU监视器管理快照24.6.7. 使用QEMU USB设备24.6.8. 通过Passthrough使用主机USB设备24.6.9. QEMU关于FreeBSD的总结24.7. FreeBSD作为bhyve主机24.7.1. 准备主机24.7.2. 创建FreeBSD客户机24.7.3. 创建Linux®客户机24.7.4. 使用UEFI固件引导bhyve虚拟机24.7.5. 面向bhyve访客的图形UEFI帧缓冲区24.7.6. 创建Microsoft Windows®客户机24.7.6.1. 创建Windows 11客户机24.7.7. 将ZFS与bhyve客户机结合使用24.7.8. 创建虚拟机快照24.7.8.1. ZFS快照24.7.8.2. 内存和CPU快照(实验功能)24.7.9. Jailing bhyve24.7.9.1. 为bhyve创建一个Jail24.7.9.2. 配置Jail24.7.9.3. 在Jail内创建虚拟机24.7.10. 虚拟机控制台24.7.11. 管理虚拟机24.7.12. 工具和实用程序24.7.13. 持久配置24.8. FreeBSD作为Xen™主机24.8.1. Xen™Dom0的硬件要求24.8.2. Xen™Dom0控制域设置24.8.3. Xen™DomU客户机VM配置24.8.4 排错24.8.4.1. 主机启动故障排除24.8.4.2. 客户机创建故障排除
虚拟化软件允许多个操作系统在同一台计算机上同时运行。这种用于PCs的软件系统通常涉及运行虚拟化软件并支持任何数量的客户操作系统的主机操作系统。
阅读本章以了解:
• 主机操作系统和客户操作系统之间的区别。 • 如何在以下虚拟化平台上安装FreeBSD: ◦ Parallels桌面(苹果®macOS®) ◦ VMware Fusion(苹果®macOS®) ◦ VirtualBox™(微软®Windows®、基于英特尔®的苹果®macOS®、Linux) ◦ QEMU(FreeBSD) ◦ bhyve(FreeBSD) • 如何调整FreeBSD系统以在虚拟化下获得最佳性能。
在阅读本章之前:
• 了解UNIX®和FreeBSD的基础知识。 • 知道如何安装FreeBSD。 • 知道如何设置网络连接。 • 知道如何安装其他第三方软件。
Parallels Desktop for Mac®是一款商业软件产品,适用于运行macOS®10.14.6或更高版本的Apple®Mac®计算机。FreeBSD是一个完全支持的客户操作系统。在macOS®上安装Parallels后,用户必须配置虚拟机,然后安装所需的客户操作系统。
在Parallels上安装FreeBSD的第一步是创建一个新的虚拟机来安装FreeBSD。
选择 Install Windows or another OS from a DVD or image file ,然后继续。

选择FreeBSD映像文件:

选择 Other as operating system 。
xxxxxxxxxx选择FreeBSD将导致启动时出现引导错误。
命名虚拟机并在安装前检查 Customize settings before installation

当配置窗口弹出时,转到 Hardware 选项卡,选择 Boot order ,然后单击 Advanced 。然后,选择 EFI 64 as BIOS 。

单击 OK ,关闭配置窗口,然后单击 Continue 。

虚拟机将自动启动。按照一般步骤安装FreeBSD。

使用Parallels在macOS®X上成功安装FreeBSD后,可以采取许多配置步骤来优化系统以进行虚拟化操作。
设置引导加载程序变量
最重要的一步是减少 kern.hz 可调参数,以降低Parallels环境下FreeBSD的CPU利用率。这是通过在 /boot/loder.conf 中添加以下行来实现的:
xxxxxxxxxxkern.hz=100如果没有此设置,空闲的FreeBSD Parallels客户机将使用单处理器iMac®大约15%的CPU。更改后,使用率将接近5%。
如果安装FreeBSD 14.0或更高版本,并且CPU利用率仍然很高,请在 /boot/loder.conf 中添加以下附加行:
xxxxxxxxxxdebug.acpi.disabled="ged"创建新的内核配置文件
所有SCSI、FireWire和USB设备驱动程序都可以从自定义内核配置文件中删除。Parallels提供了一个由 ed(4) 驱动程序使用的虚拟网络适配器,因此可以从内核中删除除 ed(4) 和 miibus(4) 之外的所有网络设备。
配置网络
最基本的网络设置使用DHCP将虚拟机连接到与主机Mac®相同的局域网。这可以通过在 /etc/rc.conf 中添加 ifconfig.ed0=“DHCP” 来实现。【34. 高级网络】中描述了更高级的网络设置。
VMware Fusion for Mac®是一款商业软件产品,适用于运行macOS®12或更高版本的Apple®Mac®计算机。FreeBSD是一个完全支持的客户操作系统。在macOS®上安装VMware Fusion后,用户可以配置虚拟机,然后安装所需的客户操作系统。
第一步是启动VMware Fusion,它将加载 Virtual Machine Library 。点击 +→New 创建虚拟机:

这将加载 New Virtual Machine Assistant 。选择 Create a custom virtual machine ,然后单击 Continus 继续:

选择 Other 作为操作系统,并在提示时选择 FreeBSD X 或 FreeBSD X 64 位作为版本:

选择固件(建议使用UEFI):

选择 Create a new virtual disk ,然后单击 Continue :

检查配置并单击 Finish :

选择虚拟机的名称及其应保存的目录:

按 command+E 打开虚拟机设置,然后单击 CD/DVD :

选择FreeBSD ISO镜像或CD/DVD:

启动虚拟机:

像往常一样安装FreeBSD:

安装完成后,可以修改虚拟机的设置,例如内存使用情况和虚拟机可以访问的CPU数量:
xxxxxxxxxx虚拟机运行时,无法修改虚拟机的系统硬件设置。
CD-ROM设备的状态。通常,当不再需要CD/DVD/ISO时,它会与虚拟机断开连接。

最后要更改的是虚拟机将如何连接到网络。要允许从主机以外的其他机器连接到虚拟机,请选择直接连接到物理网络(桥接)。否则,共享主机的互联网连接(NAT)是首选,这样虚拟机就可以访问互联网,但网络无法访问虚拟机。

修改设置后,启动新安装的FreeBSD虚拟机。
使用VMware Fusion在macOS®X上成功安装FreeBSD后,可以采取许多配置步骤来优化系统以进行虚拟化操作。
设置引导加载程序变量
最重要的一步是减少 kern.hz 可调,以降低VMware Fusion环境下FreeBSD的CPU利用率。这是通过在 /boot/loder.conf 中添加以下行来实现的:
xxxxxxxxxxkern.hz=100如果没有此设置,空闲的FreeBSD VMware Fusion客户机将使用单处理器iMac®大约15%的CPU。更改后,使用率将接近5%。
创建新的内核配置文件
可以从自定义内核配置文件中删除所有FireWire和USB设备驱动程序。VMware Fusion提供了一个由 em(4) 驱动程序使用的虚拟网络适配器,因此可以从内核中删除除 em(4) 之外的所有网络设备。
配置网络
最基本的网络设置使用DHCP将虚拟机连接到与主机Mac®相同的局域网。这可以通过在 /etc/rc.conf 中添加 ifconfig.em0=“DHCP” 来实现。【34. 高级网络】中描述了更高级的网络设置。
安装驱动程序并打开虚拟机工具
为了在VMWare上顺利运行FreeBSD,应该安装驱动程序:
xxxxxxxxxx# pkg install xf86-video-vmware xf86-input-vmmouse open-vm-toolsxxxxxxxxxxxf86软件包仅适用于x86 FreeBSD客户机。启用鼠标
一些用户报告了在虚拟机中使用鼠标时出现的问题。可以通过在 /boot/loder.conf 中附加以下内容来启用鼠标:
xxxxxxxxxx# ums_load=“YES”FreeBSD在VirtualBox™中作为访客运行良好。虚拟化软件可用于大多数常见的操作系统,包括FreeBSD本身。
VirtualBox™客户机新增功能支持:
• 剪贴板共享。 • 鼠标指针集成。 • 主机时间同步。 • 窗口缩放。 • 无缝模式。
xxxxxxxxxx这些命令在FreeBSD客户机中运行。首先,在FreeBSD客户机中安装 emulators/virtualbox-ose-additions 包或端口。这将安装端口:
xxxxxxxxxx# cd /usr/ports/emulators/virtualbox-ose-additions && make install clean将以下行添加到 /etc/rc.conf :
xxxxxxxxxxvboxguest_enable="YES"vboxservice_enable="YES"如果使用 ntpd(8) 或 ntpdate(8) ,请禁用主机时间同步:
xxxxxxxxxxvboxservice_flags="--disable-timesync"Xorg将自动识别 vboxvideo 驱动程序。也可以在 /etc/X11/xorg.conf 中手动输入:
xxxxxxxxxxSection "Device" Identifier "Card0" Driver "vboxvideo" VendorName "InnoTek Systemberatung GmbH" BoardName "VirtualBox Graphics Adapter"EndSection要使用 vboxmouse 驱动程序,请调整 /etc/X11/xorg.conf 中的鼠标部分:
xxxxxxxxxxSection "InputDevice" Identifier "Mouse0" Driver "vboxmouse"EndSection通过使用 mount_vboxvfs 挂载用于主机和VM之间文件传输的共享文件夹,可以访问它们。可以使用VirtualBox GUI或通过 vboxmanager 在主机上创建共享文件夹。例如,要在 /mnt/bsdboxshare 下为名为 BSDBox 的VM创建一个名为 myshare 的共享文件夹,请运行:
xxxxxxxxxx# vboxmanage sharedfolder add 'BSDBox' --name myshare --hostpath /mnt/bsdboxshare请注意,共享文件夹名称不得包含空格。从来宾系统中装载共享文件夹,如下所示:
xxxxxxxxxx# mount_vboxvfs -w myshare /mntVirtualBox™是一个积极开发的完整虚拟化软件包,适用于大多数操作系统,包括Windows®、macOS®、Linux®和FreeBSD。它同样能够运行类似Windows®或UNIX®的客户机。它作为开源软件发布,但在单独的扩展包中提供了闭源组件。这些组件包括对USB 2.0设备的支持。更多信息可以在 VirtualBox™wiki的下载页面 上找到。目前,这些扩展不适用于FreeBSD。
VirtualBox™可作为FreeBSD包或 emulators/VirtualBox-ose 中的端口提供。可以使用以下命令安装端口:
xxxxxxxxxx# cd /usr/ports/emulators/virtualbox-ose# make install clean端口配置菜单中的一个有用选项是 GuestAdditions 程序套件。这些在客户机操作系统中提供了许多有用的功能,如鼠标指针集成(允许在主机和客户机之间共享鼠标,而无需按特殊的键盘快捷键进行切换)和更快的视频渲染,特别是在Windows®客户机中。访客安装完成后,可以在 Devices 菜单中添加访客。
在VirtualBox™首次启动之前,需要进行一些配置更改。该端口在 /boot/modules 中安装一个内核模块,该模块必须加载到正在运行的内核中:
xxxxxxxxxx# kldload vboxdrv为确保模块在重新启动后始终加载,请将此行添加到 /boot/loader.conf :
xxxxxxxxxxvboxdrv_load="YES"要使用允许桥接或仅主机联网的内核模块,请将此行添加到 /etc/rc.conf 并重新启动计算机:
xxxxxxxxxxvboxnet_enable="YES"vboxusers 组是在VirtualBox™安装过程中创建的。所有需要访问VirtualBox™的用户都必须添加为此组的成员。pw 可用于添加新成员:
xxxxxxxxxx# pw groupmod vboxusers -m username/dev/vboxnetctl 的默认权限是限制性的,需要更改以实现桥接网络:
xxxxxxxxxx# chown root:vboxusers /dev/vboxnetctl# chmod 0660 /dev/vboxnetctl要使此权限更改永久化,请在 /etc/devfs.conf 中添加以下行:
xxxxxxxxxxown vboxnetctl root:vboxusersperm vboxnetctl 0660要启动VirtualBox™,请在Xorg会话中键入:
xxxxxxxxxx% VirtualBox有关配置和使用VirtualBox™的更多信息,请参阅官方网站。有关FreeBSD的特定信息和故障排除说明,请参阅FreeBSD wiki中的相关页面。
VirtualBox™可以配置为将USB设备传递到客户操作系统。OSE版本的主机控制器仅限于模拟USB 1.1设备,直到支持USB 2.0和3.0设备的扩展包在FreeBSD上可用。
要让VirtualBox™知道连接到机器的USB设备,用户需要是 operator 组的成员。
xxxxxxxxxx# pw groupmod operator -m username然后,将以下内容添加到 /etc/devfs.rules 中,或者如果还不存在,则创建此文件:
xxxxxxxxxx[system=10]add path 'usb/*' mode 0660 group operator要加载这些新规则,请在 /etc/rc.conf 中添加以下内容:
xxxxxxxxxxdevfs_system_ruleset="system"然后,重新启动 devfs :
xxxxxxxxxx# service devfs restart重新启动登录会话和VirtualBox™以使这些更改生效,并根据需要创建USB过滤器。
客人可以通过共享物理驱动器访问主机DVD/CD驱动器。在VirtualBox™中,这是通过虚拟机设置中的存储窗口设置的。如果需要,请先创建一个空的IDECD/DVD设备。然后从虚拟CD/DVD驱动器选择的弹出菜单中选择主机驱动器。将出现一个标记为 Passthrough 的复选框。这允许虚拟机直接使用硬件。例如,只有选择了此选项,音频CD或刻录机才能工作。
为了使用VirtualBox™DVD/CD功能,用户需要访问 /dev/xpt0 、 /dev/cdN 和 /dev/passN 。这通常是通过让用户成为操作员的一员来实现的。必须通过在 /etc/devfs.conf 中添加以下行来更正这些设备的权限:
xxxxxxxxxxperm cd* 0660perm xpt0 0660perm pass* 0660xxxxxxxxxx# service devfs restartQEMU是一个完全开源的通用机器模拟器和虚拟器。它由一个庞大而活跃的社区开发,为FreeBSD、OpenBSD和NetBSD以及其他操作系统提供支持。
来自QEMU文档:
KVM 、Xen 或 hypervisor 等管理程序一起工作。Framework 允许客户机直接在主机CPU上运行。qemu-img(1) 磁盘映像实用程序,它允许创建、转换和修改磁盘映像。QEMU可以模拟多种架构,包括 Arm™、i386、x86_64、MIPS™、s390X、SPARC™(SPARC™和Sparc64™)等。QEMU系统仿真器目标列表 会定期更新。
本节介绍如何在FreeBSD上使用QEMU进行系统仿真和用户模式仿真,并提供使用QMEU命令和命令行实用程序的示例。
QEMU可以作为FreeBSD包或 emulators/qemu 中的端口提供。对于大多数用户来说,包构建包括健全的选项和默认值,是推荐的安装方法。
xxxxxxxxxx# pkg install qemu软件包安装包括几个依赖项。安装完成后,创建一个指向最常用的QEMU主机版本的链接。如果主机是Intel™或AMD™64位系统,则:
xxxxxxxxxx# ln -s /usr/local/bin/qemu-system-x86_64 /usr/local/bin/qemu以非root用户身份运行以下命令来测试安装:
xxxxxxxxxx% qemu这将打开一个窗口,其中QEMU正在尝试从硬盘、软盘、DVD/CD和PXE启动。尚未设置任何内容,因此该命令将产生几个错误,并以 No bootable device 结束,如下图所示。然而,它确实表明QEMU软件已正确安装。

xxxxxxxxxxQEMU正在积极开发中。功能和命令选项可以从一个版本更改到下一个版本。本节提供了使用QEMU版本9.0.1(Summer,2024)开发的示例。如有疑问,请务必查阅QEMU文档,特别是关于QEMU页面,该页面提供了支持的构建平台、模拟、弃用功能和删除功能的链接。按照以下步骤创建两个名为 left 和 right 的虚拟机。大多数命令可以在没有root权限的情况下执行。
创建一个测试环境来使用QEMU:
xxxxxxxxxx% mkdir -p ~/QEMU ~/QEMU/SCRIPTS ~/QEMU/ISO ~/QEMU/VMSCRIPTS 目录用于启动脚本和实用程序。ISO 目录用于来宾ISO引导映像。VM 目录是虚拟机映像(VMs)将驻留的位置。
将FreeBSD的最新版本下载到 ~/QEMU/ISO :
xxxxxxxxxx% cd ~/QEMU/ISO% fetch https://download.freebsd.org/releases/ISO-IMAGES/14.1/FreeBSD-14.1-RELEASEamd64-bootonly.iso下载完成后,创建一个简写链接。下面的启动脚本中使用了此简写链接。
xxxxxxxxxx% ln -s FreeBSD-14.1-RELEASE-amd64-bootonly.iso fbsd.iso将目录更改为虚拟机的位置(~/QEMU/VM)。运行 qemu-img(1) 为 left VM创建磁盘映像:
xxxxxxxxxx% cd ~/QEMU/VM% qemu-img create -f raw left.img 15GQEMU raw 格式是为性能而设计的。该格式简单明了,没有开销,因此速度更快,特别是在高性能或高吞吐量的情况下。用例是在不需要快照等其他功能的情况下实现最大性能。此格式用于下面 left VM的脚本中。
另一种格式是 qcow2 ,它使用QEMU的“写时复制”技术来管理磁盘空间。此技术不需要完整的15G磁盘,只需要一个由VM直接管理的存根版本。当VM写入磁盘时,磁盘会动态增长。这种格式支持快照、压缩和加密。此格式的用例用于开发、测试和需要这些高级功能的场景。此格式用于下面 right VM的脚本中。
再次运行 qemu-img(1) ,使用 qcow2 为 right VM创建磁盘映像:
xxxxxxxxxx% qemu-img create -f qcow2 -o \preallocation=full,cluster_size=512K,lazy_refcounts=on right.qcow2 20G要查看文件的实际大小,请使用:
xxxxxxxxxx% du -Ah right.qcow2使用以下命令为两个虚拟机设置网络。在这个例子中,主机网络接口是 em0 。如有必要,请更改它以适应主机系统的接口。这必须在每次主机重启后完成,以使QEMU客户机能够通信。
xxxxxxxxxx# ifconfig tap0 create# ifconfig tap1 create# sysctl net.link.tap.up_on_open=1net.link.tap.up_on_open: 0 -> 1# sysctl net.link.tap.user_open=1net.link.tap.user_open: 0 -> 1# ifconfig bridge0 create# ifconfig bridge0 addm tap0 addm tap1 addm em0# ifconfig bridge0 up上述命令创建了两个 tap(4) 设备(tap0、tap1)和一个 if_bridge(4) 装置(bridge0)。然后,他们将 tap 设备和本地主机接口(em0)添加到 bridge 中,并设置两个 sysctl(8) 条目,以允许普通用户打开抽头设备。这些命令将允许虚拟机与主机上的网络堆栈进行通信。
更改为 ~/QEMU/SCRIPTS ,使用以下脚本启动第一个虚拟机 left 。此脚本使用QEMU原始磁盘格式。
xxxxxxxxxx/usr/local/bin/qemu-system-x86_64 -monitor none \ -cpu qemu64 \ -vga std \ -m 4096 \ -smp 4 \ -cdrom ../ISO/fbsd.iso \ -boot order=cd,menu=on \ -blockdev driver=file,aio=threads,node-name=imgleft,filename=../VM/left.img \ -blockdev driver=raw,node-name=drive0,file=imgleft \ -device virtio-blk-pci,drive=drive0,bootindex=1 \ -netdev tap,id=nd0,ifname=tap0,script=no,downscript=no,br=bridge0 \ -device e1000,netdev=nd0,mac=02:20:6c:65:66:74 \ -name \"left\"xxxxxxxxxx将上述内容保存到一个文件中(例如 left.sh),然后简单地运行: % /bin/sh left.shQEMU将在一个单独的窗口中启动一个虚拟机,并引导FreeBSD iso,如下图所示。QEMU手册页 qemu(1) 中详细描述了所有命令选项,如 -cpu 和 -boot 。

xxxxxxxxxx如果在QEMU控制台窗口中单击鼠标,QEMU将“grab”(抓取)鼠标,如下图所示。键入 Ctl+Alt+G 释放鼠标。
xxxxxxxxxx在FreeBSD上,QEMU的初始安装可能会有点慢。这是因为仿真器在磁盘首次使用期间写入文件系统格式和元数据。后续操作通常要快得多。在安装过程中,有几点需要注意:
安装完成后,虚拟机将重新启动到新安装的FreeBSD映像中。
以root身份登录并按如下方式更新系统:
xxxxxxxxxx# freebsd-update fetch install# rebootx成功安装后,QEMU将启动磁盘上安装的操作系统,而不是安装程序。QEMU支持-runas选项。为了增加安全性,请在上面的脚本列表中包含选项“-runas user_name”。详见qemu(1)。再次以 root 身份登录并添加所需的任何包。要在客户机中使用X Window系统,请参阅下面的“使用X Windows系统”一节。
这就完成了“左”VM的设置。
要安装 right 的虚拟机,请运行以下脚本。此脚本具有tap1、format=qcow2、映像文件名、MAC地址和终端窗口名称所需的修改。如果需要,请按照上述注释中的描述包含 -runas 参数。
xxxxxxxxxx/usr/local/bin/qemu-system-x86_64 -monitor none \ -cpu qemu64 \ -vga cirrus \ -m 4096 -smp 4 \ -cdrom ../ISO/fbsd.iso \ -boot order=cd,menu=on \ -drive if=none,id=drive0,cache=writeback,aio=threads,format=qcow2,discard=unmap,file=../VM/right.qcow2 \ -device virtio-blk-pci,drive=drive0,bootindex=1 \ -netdev tap,id=nd0,ifname=tap1,script=no,downscript=no,br=bridge0 \ -device e1000,netdev=nd0,mac=02:72:69:67:68:74 \ -name \"right\"安装完成后, left 和 right 机器可以相互通信并与主机通信。如果主机上有严格的防火墙规则,请考虑添加或修改规则,以允许网桥和抽头设备相互通信。
【5.4. [安装Xorg】描述了如何设置 X Window 系统。有关初始 X Window 设置,请参阅该指南,然后咨询【8. 桌面环境】以了解如何设置完整的桌面。
本节演示XFCE桌面的使用。
安装完成后,以普通用户身份登录,然后键入:
xxxxxxxxxx% startxXFCE4窗口管理器应启动并显示一个功能正常的图形桌面,如下图所示。初次启动时,可能需要一分钟才能显示桌面。有关使用详细信息,请参阅XFCE网站上的文档。

xxxxxxxxxx向客户系统添加更多内存可以加快图形用户界面的速度。在这里, left VM已安装了 X Window 系统,而 right VM仍处于文本模式。
QEMU窗口作为一个完整的FreeBSD控制台,能够运行多个虚拟终端,就像裸机系统(bare-metal system)一样。
要切换到另一个虚拟控制台,请单击QEMU窗口并键入 Alt+F2 或 Alt+F3 。FreeBSD应该切换到另一个虚拟控制台。下图显示了在 ttyv3 上显示虚拟控制台的 left VM。

xxxxxxxxxx主机当前桌面管理器或窗口管理器可能已经使用Alt+F1、Alt+F2键序列设置了其他功能。如果是这样,请尝试键入Ctl+Alt+F1、Ctl+Alt+F2或其他类似的组合键。有关详细信息,请查看窗口管理器或桌面管理器文档。QEMU窗口的另一个功能是 View 菜单和缩放控件。最有用的是 Zoom to Fit 。单击此菜单选项后,可以通过单击窗口角控件并调整窗口大小来调整QEMU窗口的大小。下图显示了在图形模式下调整 left 窗口大小的效果。

View 菜单中还显示了
cirrus-vga、serial0 和 parallel0 选项。这些允许将输入/输出切换到所选设备。QEMU窗口的 Machine 菜单允许对来宾VM进行四种类型的控制:
Pause
允许暂停QEMU虚拟机。这可能有助于冻结快速滚动窗口。
Reset
会立即将虚拟机重置回冷“开机”状态。与真正的机器一样,除非绝对必要,否则不建议使用。
Power Down
模拟ACPI关机信号,操作系统会正常关机。
Quit
立即关闭虚拟机电源-除非必要,否则也不建议这样做。
要实现串行控制台,运行FreeBSD的客户机VM需要向 /boot/loader.conf 插入
xxxxxxxxxxconsole="comconsole"以允许使用FreeBSD串行控制台。
下面更新的配置显示了如何在来宾VM上实现串行控制台。运行脚本以启动VM。
xxxxxxxxxx# left+serial.shechoecho "NOTE: telnet startup server running on guest VM!"echo "To start QEMU, start another session and telnet to localhost port 4410"echo/usr/local/bin/qemu-system-x86_64 -monitor none \ -serial telnet:localhost:4410,server=on,wait=on\ -cpu qemu64 \ -vga std \ -m 4096 \ -smp 4 \ -cdrom ../ISO/fbsd.iso \ -boot order=cd,menu=on \ -blockdev driver=file,aio=threads,node-name=imgleft,filename=../VM/left.img \ -blockdev driver=raw,node-name=drive0,file=imgleft \ -device virtio-blk-pci,drive=drive0,bootindex=1 \ -netdev tap,id=nd0,ifname=tap0,script=no,downscript=no,br=bridge0 \ -device e1000,netdev=nd0,mac=02:20:6c:65:66:74 \ -name \"left\"
在上图中,在VM启动时,串行端口被重定向到主机系统上的TCP端口,QEMU监视器等待(wait=on)激活来宾VM,直到在指定的localhost端口上发生 telnet(1) 连接。在从单独的会话接收到连接后,FreeBSD系统开始启动,并在 /boot/loader.conf 中查找控制台指令。使用指令 console=comconsole ,FreeBSD在串行端口上启动控制台会话。QEMU监视器检测到这一点,并将该串行端口上必要的字符I/O定向到主机上的telnet会话。系统启动,完成后,在串行端口(ttyu0)和控制台(ttyv0)上启用登录提示。
值得注意的是,TCP上的串行重定向发生在虚拟机外部。与虚拟机上的任何网络都没有交互,因此它不受任何防火墙规则的约束。把它想象成一个坐在真实机器上RS-232或USB端口上的哑终端(dumb terminal)。
在串行控制台上,如果调整了窗口大小,请执行 resizewin(1) 以更新终端大小。
停止向控制台(QEMU控制台和串行端口)发送syslog消息可能是可取的(甚至是必要的)。有关重定向控制台消息的详细信息,请参阅 syslog.conf(5) 。
xxxxxxxxxx一旦更新了/boot.loader.conf以允许串行控制台,访客VM每次都会尝试从串行端口启动。确保如上所示启用了串行端口,或更新/boot/loader.conf文件以不需要串行控制台。QEMU还支持在与主机CPU不同的架构上运行预编译的应用程序。例如,可以在x86_64主机上运行Sparc64架构操作系统。下一节将对此进行演示。
设置一个与主机架构不同的新虚拟机需要几个步骤:
在以下过程中,OpenBSD 6.8 SPARC64软件的副本用于此QEMU用户模式仿真练习。
xxxxxxxxxx并非所有版本的OpenBSD Sparc64都适用于QEMU。OpenBSD 6.8版本是已知的,并被选为本节的示例。从OpenBSD档案下载OpenBSD 6.8 Sparc64。
在OpenBSD下载网站上,只维护最新版本。有必要搜索档案以获取过去的版本。
xxxxxxxxxx% cd ~/QEMU/ISO% fetch https://mirror.planetunix.net/pub/OpenBSD-archive/6.8/sparc64/install68.iso为Sparc64虚拟机创建新的磁盘映像类似于上面的 right 虚拟机。本例对磁盘使用QEMU qcow2格式:
xxxxxxxxxx% cd ~/QEMU/VMqemu-img create -f qcow2 -o preallocation=full,lazy_refcounts=on sparc64.qcow2 16G使用下面的脚本创建新的Sparc64架构。与上面的示例一样,运行脚本,然后启动一个新的会话,并在指定的端口上将 telnet 连接到localhost:
xxxxxxxxxxechoecho "NOTE: telnet startup server running on guest VM!"echo "To start QEMU, start another session and telnet to localhost port 4410"echo/usr/local/bin/qemu-system-sparc64 \ -serial telnet:localhost:4410,server=on,wait=on \ -machine sun4u,usb=off \ -smp 1,sockets=1,cores=1,threads=1 \ -rtc base=utc \ -m 1024 \ -boot d \ -drive file=../VM/sparc64.qcow2,if=none,id=drive-ide0-0-1,format=qcow2,cache=none \ -cdrom ../ISO/install68.iso \ -device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-1,id=ide0-0-1 \ -msg timestamp=on \ -net nic,model=sunhme -net user \ -nographic \ -name \"sparc64\"注意以下事项:
-boot d 选项从设置为 -cdrom ../ISO/install68.iso 的QEMU CDROM设备启动。telnet 服务器选项设置为等待端口4410上的单独连接。启动另一个会话,并使用 telnet(1) 连接到端口4410上的localhost。-nographic 选项,这意味着只有串行端口I/O。没有图形界面。tap(4) / if_bridge(4) 组合设置的。这个例子使用了一种单独的QEMU网络方法,称为“串行线互联网协议”(Serial Line Internet Protocol,SLIRP),有时也称为“用户模式网络”(User Mode Networking)。关于这种和其他QEMU网络方法的文档在这里:QEMU网络文档 。如果一切设置正确,系统将如下图所示启动。

安装系统后,修改脚本并将引导参数更改为 -boot c 。这将指示QEMU从提供的硬盘而不是CDROM引导。
安装的系统可以像任何其他客户虚拟机一样使用。然而,客户机的底层架构是Sparc64,而不是x86_64。
xxxxxxxxxx如果系统在OpenBios控制台提示符0>处停止,请输入 power-off 退出系统。下图显示了已安装系统的root登录并运行 uname(1) 。

QEMU监视器控制正在运行的QEMU仿真器(客户VM)。
使用监视器,可以:
以及许多其他操作。
监视器最常见的用途是检查VM的状态,以及添加、删除或更改设备。某些操作,如迁移,仅在KVM、Xen等管理程序加速器下可用,在FreeBSD主机上不受支持。
在使用图形桌面环境时,使用QEMU监视器的最简单方法是从终端会话启动QEMU时使用 -monitor stdio 选项。
xxxxxxxxxx# /usr/local/bin/qemu-system-x86_64 -monitor stdio \ -cpu qemu64 \ -vga cirrus \ -m 4096 -smp 4 \ ...这将在终端窗口中产生一个新的提示(qemu),如下图所示。

该图还显示了在FreeBSD引导序列中冻结系统的 stop 命令。在监视器中输入 cont 命令之前,系统将保持冻结状态。
要将新磁盘添加到正在运行的VM中,需要如上所述准备磁盘:
xxxxxxxxxx% cd ~/QEMU/VM% qemu-img create -f raw new10G.img 10G下图显示了在VM中添加新磁盘所需的监视器命令序列。在监视器中使用 device_add 命令添加设备后,它就会显示在图下半部分所示的FreeBSD系统控制台上。可以根据需要配置磁盘。
请注意,如果要在VM重新启动后使用新磁盘,则必须将其添加到启动脚本中。

QEMU的文档描述了使用术语快照时的几个类似概念。命令行上有 -snapshot 选项,它指的是使用驱动器或驱动器的一部分来包含设备的副本。然后是监视器命令 snapshot_blkdev 和 snapshot_brkdev_internal ,它们描述了复制blockdev设备的实际行为。最后,还有监视器命令 savevm、loadvm 和 delvm 命令,它们涉及创建和保存、加载或删除整个虚拟机的副本。与后者一起,监视器 info snapshot 命令列出了最近快照的详细信息。
本节将重点介绍创建、保存和加载完整的VM映像,并将为此使用快照一词。
首先,从头开始重新创建 left VM,这次使用 qcow2 格式。
xxxxxxxxxx% cd ~/QEMU/VM% rm left.img% qemu-img create -f qcow2 left.qcow2 16G # Clean file for a new FreeBSD installation.% cd ../SCRIPTS# /bin/sh left.sh # See the below program listing.安装完成后,重新启动,这次使用 -monitor stdio 选项允许使用监视器。
xxxxxxxxxx# left VM script. /usr/local/bin/qemu-system-x86_64 -monitor stdio \ -cpu qemu64 \ -vga std \ -m 4096 \ -smp 4 \ -cdrom ../ISO/fbsd.iso \ -boot order=cd,menu=on \ -blockdev driver=file,aio=threads,node-name=imgleft,filename=../VM/left.qcow2 \ -blockdev driver=qcow2,node-name=drive0,file=imgleft \ -device virtio-blk-pci,drive=drive0,bootindex=1 \ -netdev tap,id=nd0,ifname=tap0,script=no,downscript=no,br=bridge0 \ -device e1000,netdev=nd0,mac=02:20:6c:65:66:74 \ -name \"left\"要演示快照,可以使用以下过程:
在 Prepare the environment 步骤中,在单独的虚拟控制台(ttyv1)中,使用vi(1) 启动编辑会话,模拟用户活动。如果需要,可以启动其他程序。快照应考虑拍摄快照时运行的所有应用程序的状态。
下图显示了新安装的没有软件包的FreeBSD系统,以及ttyv1上的编辑会话。vi(1) 编辑器当前处于插入模式,打字员正在键入单词“broadcast”。

要生成快照,请在监视器中输入 savevm 。一定要给它一个标签(比如 original_install )。
xxxxxxxxxxQEMU 9.0.1 monitor - type 'help' for more information(qemu)(qemu) savevm original_install接下来,在主控制台窗口中,安装一个没有依赖关系的包,如 zip(1) 。完成后,租用监视器并创建另一个快照(snap1_pkg+zip)。
下图显示了上述命令的结果和 info shapshots 命令的输出。

重新启动系统,在FreeBSD启动之前,切换到监视器并输入 stop 。VM将停止。
使用上面使用的标签输入 loadvm(此处为 original_install)。
xxxxxxxxxxQEMU 9.0.1 monitor - type 'help' for more information(qemu) stop(qemu) loadvm original_install(qemu) contVM屏幕将立即切换到上面输入 savevm 命令的确切时刻。请注意,VM仍然停止。
输入 cont 启动VM,切换到 ttyv1 上的编辑会话,然后在键盘上键入一个字母。编辑器仍处于插入模式,应相应地做出响应。拍摄快照时运行的任何其他程序都不应受到影响。
以上步骤显示了如何拍摄快照、修改系统,然后通过还原上一个快照进行“回滚”。
默认情况下,QEMU将快照数据存储在与映像相同的文件中。使用 qemu-img(1) 查看快照列表,如下图所示。

QEMU支持创建由映像文件支持的虚拟USB设备。这些是虚拟USB设备,可以像真正的USB设备一样进行分区、格式化、挂载和使用。
xxxxxxxxxx/usr/local/bin/qemu-system-x86_64 -monitor stdio \ -cpu qemu64 \ -vga cirrus \ -m 4096 -smp 4 \ -cdrom ../ISO/fbsd.iso \ -boot order=cd,menu=on \ -drive if=none,id=usbstick,format=raw,file=../VM/foo.img \ -usb \ -device usb-ehci,id=ehci \ -device usb-storage,bus=ehci.0,drive=usbstick \ -device usb-mouse \ -blockdev driver=file,node-name=img1,filename=../VM/right.qcow2 \ -blockdev driver=qcow2,node-name=drive0,file=img1 \ -device virtio-blk-pci,drive=drive0,bootindex=1 \ -netdev tap,id=nd0,ifname=tap1,script=no,downscript=no,br=bridge0 \ -device e1000,netdev=nd0,mac=02:72:69:67:68:74 \ -name \"right\"此配置包括 id=usbstick 的 -drive 规范、原始格式和映像文件(必须由 qemu-img(1) 创建)。下一行包含 USB EHCI 控制器的 -device usb-ehci 规范,id=ehci 。最后, -device usb-storage 规范将上述驱动器连接到EHCI USB总线。
当系统启动时,FreeBSD将识别一个USB集线器,添加连接的USB设备,并将其分配给 da0 ,如下图所示。

该设备已准备好使用 gpart(8) 进行分区,并使用 newfs(8) 格式化。由于USB设备由 qemu-img(1) 创建的文件支持,因此写入设备的数据将在重新启动后持续存在。
QEMU USB直通支持在版本9.0.1(Summer,2024)中被列为实验性支持。但是,以下步骤显示了来宾VM如何使用安装在主机上的USB记忆棒。
有关更多信息和示例,请参阅:
https://www.qemu.org/docs/master/system/devices/usb.html
下图的上半部分显示了QEMU监视器命令:
nfo usbhost 显示主机系统上所有USB设备的信息。在主机系统上找到所需的USB设备,并记下该行上的两个十六进制值。(在下面的示例中,主机USB设备是Memorex Mini,vendori 0718,productid 0619。)使用下面 device_add 步骤中 info usbhost 命令显示的两个值。device_add 将USB设备添加到来宾VM。
如前所述,一旦 device_add 完成,FreeBSD内核就会识别出一个新的USB设备,如下半部分所示。
使用新设备如下图所示。

如果USB设备被格式化为FAT16或FAT32文件系统,则可以使用 mount_msdosfs(8) 将其挂载为MS-DOS™文件系统,如图所示。将 /etc/hosts 文件复制到新安装的驱动器,并进行校验和以验证USB设备上文件的完整性。然后使用 umount(8) 卸载设备。
如果USB设备格式化为NTFS,则需要安装 fusefs-ntfs 包并使用 ntfs-3g(8) 访问设备:
xxxxxxxxxx# pkg install fusefs-ntfs# kldload fusefs# gpart show da1# ntfs-3g /dev/da1s1 /mntAccess the drive as needed. When finished:# umount /mnt
更改上述设备标识符以匹配安装的硬件。有关使用NTFS文件系统的更多信息,请参阅 ntfs-3g(8) 。
如上所述,QEMU与几个不同的管理程序加速器一起工作。
QEMU支持的虚拟化加速器列表包括:
本节中的所有示例都使用了 Tiny Code Generator (tcg)加速器,因为这是目前FreeBSD上唯一支持的加速器。
bhyve BSD许可的管理程序成为FreeBSD 10.0-RELEASE基础系统的一部分。此管理程序支持多个客户机,包括FreeBSD、OpenBSD、许多Linux®发行版和Microsoft Windows®。默认情况下,bhyve提供对串行控制台的访问,并且不模拟图形控制台。较新CPU的虚拟化卸载功能用于避免翻译指令和手动管理内存映射的传统方法。
bhyve设计要求
ARM仅支持纯ARMv8.0虚拟化,目前未使用虚拟化主机扩展。使用多个vCPU托管Linux®客户机或FreeBSD客户机需要VMX无限制模式支持(UG)。
判断英特尔或AMD处理器是否支持bhyve的最简单方法是运行 dmesg 或在 /var/run/dmesg.boot 中查找AMD®处理器 Features2 行上的 POPCNT 处理器功能标志,或英特尔®处理器 VT-x 行上的 EPT 和 UG 。
在bhyve中创建虚拟机的第一步是配置主机系统。首先,加载bhyve内核模块:
xxxxxxxxxx# kldload vmm有几种方法可以将虚拟机访客连接到主机的网络;实现这一点的一种直接方法是为虚拟机中的网络设备创建一个分接接口(tap interface)进行连接。为了使网络设备参与网络,还创建一个包含分接接口和物理接口作为成员的网桥接口。在这个例子中,物理接口是 igb0 :
xxxxxxxxxx# ifconfig tap0 create# sysctl net.link.tap.up_on_open=1net.link.tap.up_on_open: 0 -> 1# ifconfig bridge0 create# ifconfig bridge0 addm igb0 addm tap0# ifconfig bridge0 up创建一个文件用作来宾计算机的虚拟磁盘。指定虚拟磁盘的大小和名称:
xxxxxxxxxx# truncate -s 16G guest.img下载FreeBSD的安装镜像进行安装:
xxxxxxxxxx# fetch https://download.freebsd.org/releases/ISO-IMAGES/14.0/FreeBSD-14.0-RELEASEamd64-bootonly.isoFreeBSD-14.0-RELEASE-amd64-bootonly.iso 426 MB 16 MBps 22sFreeBSD附带了一个示例脚本 vmrun.sh ,用于在bhyve中运行虚拟机。它将启动虚拟机并在循环中运行,因此如果崩溃,它将自动重新启动。vmrun.sh 有几个选项来控制机器的配置,包括:
最后一个参数是虚拟机的名称,用于跟踪正在运行的机器。以下命令列出了所有可用的程序参数选项:
xxxxxxxxxx# sh /usr/share/examples/bhyve/vmrun.sh -h此示例在安装模式下启动虚拟机:
xxxxxxxxxx# sh /usr/share/examples/bhyve/vmrun.sh -c 1 -m 1024M -t tap0 -d guest.img \ -i -I FreeBSD-14.0-RELEASE-amd64-bootonly.iso guestname虚拟机将引导并启动安装程序。在虚拟机中安装系统后,当系统询问是否在安装结束时放入shell时,选择 【Yes】。
重新启动虚拟机。当重新启动虚拟机导致bhyve退出时,vmrun.sh 脚本会在循环中运行 bhyve 并自动重新启动它。发生这种情况时,从引导加载程序菜单中选择reboot选项以退出循环。现在可以从虚拟磁盘启动来宾:
xxxxxxxxxx# sh /usr/share/examples/bhyve/vmrun.sh -c 4 -m 1024M -t tap0 -d guest.img guestnameLinux客户机可以像任何其他基于UEFI的常规客户机虚拟机一样启动,也可以使用 sysutils/grub2-bhyve 端口启动。
为此,首先确保端口已安装,然后创建一个文件作为来宾机的虚拟磁盘:
xxxxxxxxxx# truncate -s 16G linux.img使用 grub2-bhyve 启动Linux虚拟机是一个两步过程。
创建一个 device.map ,grub将使用它将虚拟设备映射到主机系统上的文件:
xxxxxxxxxx(hd0) ./linux.img(cd0) ./somelinux.iso使用 sysutils/grub2-bhyve 从ISO映像加载Linux®内核:
xxxxxxxxxx# grub-bhyve -m device.map -r cd0 -M 1024M linuxguest这将启动 grub 。如果安装CD包含 grub.cfg ,将显示一个菜单。如果没有,则必须手动定位和加载 vmlinuz 和 initrd 文件:
xxxxxxxxxxgrub> ls(hd0) (cd0) (cd0,msdos1) (host)grub> ls (cd0)/isolinuxboot.cat boot.msg grub.conf initrd.img isolinux.bin isolinux.cfg memtest splash.jpg TRANS.TBL vesamenu.c32 vmlinuzgrub> linux (cd0)/isolinux/vmlinuzgrub> initrd (cd0)/isolinux/initrd.imggrub> boot现在Linux®内核已经加载,可以启动客户机了:
xxxxxxxxxx# bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 \ -s 3:0,virtio-blk,./linux.img -s 4:0,ahci-cd,./somelinux.iso \ -l com1,stdio -c 4 -m 1024M linuxguest系统将引导并启动安装程序。在虚拟机中安装系统后,重新启动虚拟机。这将导致bhyve退出。虚拟机的实例需要先销毁,然后才能再次启动:
xxxxxxxxxx# bhyvectl --destroy --vm=linuxguest现在可以直接从虚拟磁盘启动客户机。加载内核:
xxxxxxxxxx# grub-bhyve -m device.map -r hd0,msdos1 -M 1024M linuxguestgrub> ls(hd0) (hd0,msdos2) (hd0,msdos1) (cd0) (cd0,msdos1) (host)(lvm/VolGroup-lv_swap) (lvm/VolGroup-lv_root)grub> ls (hd0,msdos1)/lost+found/ grub/ efi/ System.map-2.6.32-431.el6.x86_64 config-2.6.32-431.el6.x86_64 symvers-2.6.32-431.el6.x86_64.gz vmlinuz-2.6.32-431.el6.x86_64 initramfs-2.6.32-431.el6.x86_64.imggrub> linux (hd0,msdos1)/vmlinuz-2.6.32-431.el6.x86_64 root=/dev/mapper/VolGrouplv_rootgrub> initrd (hd0,msdos1)/initramfs-2.6.32-431.el6.x86_64.imggrub> boot启动虚拟机:
xxxxxxxxxx# bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 \ -s 3:0,virtio-blk,./linux.img -l com1,stdio -c 4 -m 1024M linuxguestLinux®现在将在虚拟机中启动,并最终显示登录提示。登录并使用虚拟机。完成后,重新启动虚拟机以退出bhyve。销毁虚拟机实例:
xxxxxxxxxx# bhyvectl --destroy --vm=linuxguest除了 bhyveload 和 grub-bhyve ,bhyve管理程序还可以使用UEFI固件引导虚拟机。此选项可能支持其他加载器不支持的客户操作系统。
要使用bhyve中的UEFI支持,请首先获取UEFI固件映像。这可以通过安装 sysutils/bhyve 固件端口或软件包来完成。
固件就绪后,将 -l bootrom、/path/to/firmware 标志添加到 bhyve 命令行中。实际的bhyve命令可能看起来像这样:
xxxxxxxxxx# bhyve -AHP -s 0:0,hostbridge -s 1:0,lpc \ -s 2:0,virtio-net,tap1 -s 3:0,virtio-blk,./disk.img \ -s 4:0,ahci-cd,./install.iso -c 4 -m 1024M \ -l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd \ guest要允许来宾存储UEFI变量,请使用附加在 -l 标志后的变量文件。请注意,bhyve会将客户修改写入给定的变量文件。因此,请确保首先创建变量模板文件的每个客户副本:
xxxxxxxxxx# cp /usr/local/share/uefi-firmware/BHYVE_UEFI_VARS.fd \ /path/to/vmimage/BHYVE_UEFI_VARS.fd然后,将该变量文件添加到bhyve参数中:
xxxxxxxxxx# bhyve -AHP -s 0:0,hostbridge -s 1:0,lpc \ -s 2:0,virtio-net,tap1 -s 3:0,virtio-blk,./disk.img \ -s 4:0,ahci-cd,./install.iso -c 4 -m 1024M \ -l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd,/path/to/vmimage/BHYVE_UEFI_VARS.fd \ guestxxxxxxxxxx一些Linux发行版要求使用UEFI变量来存储其UEFI引导文件的路径(例如,使用linux64.efi或grubx64.efi而不是bootx64.efis)。因此,建议为Linux虚拟机使用变量文件,以避免手动更改引导分区文件。要查看或修改变量文件内容,请从主机使用 efivar(8) 。
sysutils/bhyve 固件还包含一个启用CSM的固件,用于在传统BIOS模式下引导不支持UEFI的客户机:
xxxxxxxxxx# bhyve -AHP -s 0:0,hostbridge -s 1:0,lpc \ -s 2:0,virtio-net,tap1 -s 3:0,virtio-blk,./disk.img \ -s 4:0,ahci-cd,./install.iso -c 4 -m 1024M \ -l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI_CSM.fd \ guestUEFI固件支持对于主要是图形客户操作系统(如Microsoft Windows®)特别有用。
还可以使用 -s 29,fbuf,tcp=0.0.0.0:5900 标志启用对UEFI-GOP帧缓冲区的支持。帧缓冲区分辨率可以配置为 w=800 和 h=600 ,并且可以通过添加 wait 来指示bhyve在引导访客之前等待VNC连接。帧缓冲区可以从主机访问,也可以通过VNC协议通过网络访问。此外,可以添加 -s 30,xhci,tablet 来实现与主机的精确鼠标光标同步。
生成的bhyve命令如下:
xxxxxxxxxx# bhyve -AHP -s 0:0,hostbridge -s 31:0,lpc \ -s 2:0,virtio-net,tap1 -s 3:0,virtio-blk,./disk.img \ -s 4:0,ahci-cd,./install.iso -c 4 -m 1024M \ -s 29,fbuf,tcp=0.0.0.0:5900,w=800,h=600,wait \ -s 30,xhci,tablet \ -l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd \ guest注意,在BIOS仿真模式下,一旦控制权从固件传递到客户操作系统,帧缓冲区将停止接收更新。
为Windows 10或更早版本设置来宾可以直接从原始安装介质完成,这是一个相对简单的过程。除了最低资源要求外,以来宾身份运行Windows还需要
-w)和使用Windows安装ISO启动虚拟机客户机的示例:
xxxxxxxxxxbhyve \ -c 2 \ -s 0,hostbridge \ -s 3,nvme,windows2016.img \ -s 4,ahci-cd,install.iso \ -s 10,virtio-net,tap0 \ -s 31,lpc \ -s 30,xhci,tablet \ -l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd \ -m 8G -H -w \ windows2016安装过程中只应使用一两个VCPUs,但安装Windows后可以增加此数量。
必须安装VirtIO驱动程序才能使用定义的 virtio-net 网络接口。另一种方法是通过在上述命令行中将 virtio-net 更改为 e1000 来切换到E1000(Intel E82545)仿真。然而,性能将受到影响。
从Windows 11开始,微软引入了TPM 2模块的硬件要求。bhyve支持将硬件TPM传递给访客。可以修改安装介质以禁用相关硬件检查。这个过程的详细描述可以在 FreeBSD Wiki 上找到。
xxxxxxxxxx制造商不支持修改Windows安装介质和在没有TPM模块的情况下运行Windows客户机。在实施这些方法之前,请考虑应用程序和用例。如果主机上有ZFS可用,使用ZFS卷而不是磁盘映像文件可以为客户机提供显著的性能优势。ZFS卷可以通过以下方式创建:
xxxxxxxxxx# zfs create -V16G -o volmode=dev zroot/linuxdisk0启动VM时,将ZFS卷指定为磁盘驱动器:
xxxxxxxxxx# bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 \ -s3:0,virtio-blk,/dev/zvol/zroot/linuxdisk0 \ -l com1,stdio -c 4 -m 1024M linuxguest在主机和客户机内部使用ZFS时,请记住缓存虚拟机内容的两个系统的竞争内存压力。为了缓解这种情况,可以考虑将主机的ZFS文件系统设置为仅使用元数据缓存。为此,将以下设置应用于主机上的ZFS文件系统,将 <name> 替换为虚拟机的特定zvol数据集名称。
xxxxxxxxxx# zfs set primarycache=metadata <name>现代管理程序允许用户创建其状态的“快照”;这样的快照包括客户机的磁盘、CPU和内存内容。通常可以独立于来宾是正在运行还是已关闭来拍摄快照。然后,可以重置虚拟机并将其恢复到拍摄快照时的精确状态。
使用ZFS卷作为虚拟机的后备存储可以对客户机的磁盘进行快照。例如:
xxxxxxxxxxzfs snapshot zroot/path/to/zvol@snapshot_name虽然可以在客户机运行时以这种方式快照ZFS卷,但请记住,当客户机处于活动状态时,虚拟磁盘的内容可能处于不一致的状态。因此,建议在执行此命令之前先关闭或暂停客户机。默认情况下不支持暂停客户机,需要先启用(请参阅【24.7.8.2. 内存和CPU快照】)
xxxxxxxxxx当虚拟机正在使用ZFS zvol时,将其回滚到快照可能会损坏文件系统内容并导致客户机崩溃。客户机中所有未保存的数据都将丢失,自上次快照以来的修改可能会被销毁。一旦虚拟机关闭,可能需要第二次回滚以将文件系统恢复到可用状态。这反过来将最终销毁快照后所做的任何更改。从FreeBSD 13开始,bhyve有一个实验性的“快照”功能,用于将客户机的内存和CPU状态转储到文件中,然后停止虚拟机。稍后可以从快照文件内容中恢复客户机。
但是,默认情况下不启用此功能,需要从源代码重建系统。有关使用自定义选项编译内核的过程的深入描述,请参阅从源代码构建。
xxxxxxxxxx该功能尚未准备好用于生产,仅限于特定的虚拟机配置。存在多种限制: • nvme和virtio-blk存储后端尚未工作 • 只有当客户机使用每种设备的单一类型时,才支持快照,即如果连接了多个ahci-hd磁盘,快照创建将失败 • 此外,该功能在英特尔上可能相当稳定,但在AMD CPU上可能不起作用。xxxxxxxxxx在执行以下步骤之前,请确保/usr/src目录是最新的。有关如何执行此操作的详细过程,请参阅更新源。首先,在/etc/src.conf中添加以下内容:
xxxxxxxxxxWITH_BHYVE_SNAPHOT=yesBHYVE_SNAPSHOT=1MK_BHYVE_SNAPSHOT=yesxxxxxxxxxx如果系统已部分或全部重建,建议在继续之前运行: # cd /usr/src # make cleanworld然后按照 【26.6.2. 快速启动.从源代码更新】一章中概述的步骤构建和安装world和内核。
要验证快照功能的成功激活,请输入
xxxxxxxxxx# bhyvectl --usage并检查输出是否列出了 --suspend 标志。如果标志缺失,则该功能未正确激活。
然后,快照并挂起所选的正在运行的虚拟机:
xxxxxxxxxx# bhyvectl --vm=vmname --suspend=/path/to/snapshot/filenamexxxxxxxxxx为--suspend提供绝对路径和文件名。否则,bhyve将把快照数据写入bhyve启动的任何目录。确保将快照数据写入安全目录。生成的输出包含客户机的完整内存转储,因此可能包含敏感数据(即密码)!这将创建三个文件:
内存快照
命名类似于 --suspend 的输入
内核文件
名称类似于 --suspend 的输入,后缀为 .kern
元数据
包含有关系统状态的元数据,以后缀 .meta 命名
要从快照还原客户机,请在 bhyve 中使用 -r 标志:
xxxxxxxxxx# bhyve -r /path/to/snapshot/filename在不同的CPU架构上还原来宾快照将不起作用。通常,在与快照创建者不同的系统上尝试还原可能会失败。
为了提高安全性并将虚拟机与主机操作系统分离,可以在jail中运行bhyve。有关jail及其安全福利的深入描述,请参阅【17. Jails】。
第一,创建jail环境。如果使用UFS文件系统,只需运行:
xxxxxxxxxx# mkdir -p /jails/bhyve如果使用ZFS文件系统,使用以下命令:
xxxxxxxxxx# zfs create zroot/jails# zfs create zroot/jails/bhyve然后为虚拟机 bhyvevm0 创建ZFS zvol:
xxxxxxxxxx# zfs create zroot/vms# zfs create -V 20G zroot/vms/bhyvevm0如果不使用ZFS,请使用以下命令直接在jail目录结构中创建磁盘映像文件:
xxxxxxxxxx# mkdir /jails/bhyve/vms# truncate -s 20G /jails/bhyve/vms/bhyvevm0下载FreeBSD镜像,最好是与主机相同或更早的版本,并将其解压缩到jail目录中:
xxxxxxxxxx# cd /jails# fetch -o base.txz http://ftp.freebsd.org/pub/FreeBSD/releases/amd64/13.2-RELEASE/base.txz# tar -C /jails/bhyve -xvf base.txzxxxxxxxxxx在jail中运行比主机更高的FreeBSD版本是不受支持的(即在jail中执行14.0-RELEASE,嵌入13.2-RELEASE主机中)。接下来,将devfs规则集添加到 /etc/devfs.rules 中:
xxxxxxxxxx[devfsrules_jail_bhyve=100]add include $devfsrules_hide_alladd include $devfsrules_unhide_loginadd path 'urandom' unhideadd path 'random' unhideadd path 'crypto' unhideadd path 'shm' unhideadd path 'zero' unhideadd path 'null' unhideadd path 'mem' unhideadd path 'vmm' unhideadd path 'vmm/*' unhideadd path 'vmm.io' unhideadd path 'vmm.io/*' unhideadd path 'nmdmbhyve*' unhideadd path 'zvol' unhideadd path 'zvol/zroot' unhideadd path 'zvol/zroot/vms' unhideadd path 'zvol/zroot/vms/bhyvevm0' unhideadd path 'zvol/zroot/vms/bhyvevm1' unhideadd path 'tap10*' unhidexxxxxxxxxx如果/etc/devfs.rules文件中有另一个数字ID为100的devfs规则,请用另一个尚未使用的ID号替换清单中的规则。xxxxxxxxxx如果不使用ZFS文件系统,请跳过/etc/devfs.rules中的相关zvol规则: add path 'zvol' unhide add path 'zvol/zroot' unhide add path 'zvol/zroot/vms' unhide add path 'zvol/zroot/vms/bhyvevm0' unhide add path 'zvol/zroot/vms/bhyvevm1' unhide这些规则将导致bhyve
bhyvevm0 和 bhyvevm1 的磁盘卷创建虚拟机,tap10 的tap网络接口。这意味着,有效的接口名称将是 tap10、tap100、tap101、…tap109、tap1000 等。
限制对可能的抽头接口名称子集的访问将阻止监狱(以及bhyve)看到主机和其他监狱的抽头接口。nmdm 设备,即 /dev/nmdmbhyve0 。这些规则可以根据需要扩展和变化,以适应不同的访客和界面名称。
xxxxxxxxxx当打算在主机以及一个或多个jails中使用bhyve时,请记住tap和nmdm接口名称将在共享环境中运行。例如,仅在主机上或jail中对bhyve使用/dev/nmdmbhyve0。重新启动devfs以加载更改:
xxxxxxxxxx# service devfs restart然后在 /etc/jail.conf 或 /etc/jail.conf.d 中添加新监狱的定义。将接口号 $if 和IP地址替换为个人变体。
示例33. 使用NAT或防火墙路由流量
xxxxxxxxxxbhyve { $if = 0; exec.prestart = "/sbin/ifconfig epair${if} create up"; exec.prestart += "/sbin/ifconfig epair${if}a up"; exec.prestart += "/sbin/ifconfig epair${if}a name ${name}0"; exec.prestart += "/sbin/ifconfig epair${if}b name jail${if}"; exec.prestart += "/sbin/ifconfig ${name}0 inet 192.168.168.1/27"; exec.prestart += "/sbin/sysctl net.inet.ip.forwarding=1"; exec.clean; host.hostname = "the-hostname-here"; vnet; vnet.interface = "jail${if}"; path = "/jails/${name}"; persist; securelevel = 3; devfs_ruleset = 100; mount.devfs; allow.vmm; exec.start += "/bin/sh /etc/rc"; exec.stop = "/bin/sh /etc/rc.shutdown"; exec.poststop += "/sbin/ifconfig ${name}0 destroy";}本例假设使用 pf 或 ipfw 等防火墙对监狱流量进行NAT。有关实现此功能的可用选项的更多详细信息,请参阅【33. 防火墙】一章。
示例34. 使用桥接网络连接
xxxxxxxxxxbhyve { $if = 0; exec.prestart = "/sbin/ifconfig epair${if} create up"; exec.prestart += "/sbin/ifconfig epair${if}a up"; exec.prestart += "/sbin/ifconfig epair${if}a name ${name}0"; exec.prestart += "/sbin/ifconfig epair${if}b name jail${if}"; exec.prestart += "/sbin/ifconfig bridge0 addm ${name}0"; exec.prestart += "/sbin/sysctl net.inet.ip.forwarding=1"; exec.clean; host.hostname = "the-hostname-here"; vnet; vnet.interface = "jail${if}"; path = "/jails/${name}"; persist; securelevel = 3; devfs_ruleset = 100; mount.devfs; allow.vmm; exec.start += "/bin/sh /etc/rc"; exec.stop = "/bin/sh /etc/rc.shutdown"; exec.poststop += "/sbin/ifconfig ${name}0 destroy";}xxxxxxxxxx之前已将/etc/devfs.rules中的devfs规则集ID 100替换为自定义唯一编号,请记住在jails.conf中也替换数字ID。要首次启动jail并进行一些额外的配置工作,请输入:
xxxxxxxxxx# cp /etc/resolv.conf /jails/bhyve/etc# service jail onestart bhyve# jexec bhyve# sysrc ifconfig_jail0="inet 192.168.168.2/27"# sysrc defaultrouter="192.168.168.1"# sysrc sendmail_enable=NONE# sysrc cloned_interfaces="tap100"# exit重新启动并启用jail:
xxxxxxxxxx# sysrc jail_enable=YES# service jail restart bhyve然后,在jail内创建一个虚拟机。对于FreeBSD客户机,请先下载安装ISO:
xxxxxxxxxx# jexec bhyve# cd /vms# fetch -o freebsd.iso https://download.freebsd.org/releases/ISO-IMAGES/14.0/FreeBSD-14.0-RELEASE-amd64-bootonly.iso要创建虚拟机,请先使用 bhyvectl 对其进行初始化:
xxxxxxxxxx# jexec bhyve# bhyvectl --create --vm=bhyvevm0xxxxxxxxxx从jail启动虚拟机时,可能需要使用bhyvectl创建访客。跳过此步骤可能会在启动bhyve时导致以下错误消息: vm_open: vm-name could not be opened. No such file or directory最后,使用首选的开始客户机的方式。
示例35. 从vmrun.sh和ZFS开始
xxxxxxxxxx# jexec bhyve# sh /usr/share/examples/bhyve/vmrun.sh -c 1 -m 1024M \ -t tap100 -d /dev/zvol/zroot/vms/bhyvevm0 -i -I /vms/FreeBSD-14.0-RELEASEamd64-bootonly.iso bhyvevm0示例36. 使用vmrun.sh和UFS开始
xxxxxxxxxx# jexec bhyve# sh /usr/share/examples/bhyve/vmrun.sh -c 1 -m 1024M \ -t tap100 -d /vms/bhyvevm0 -i -I /vms/FreeBSD-14.0-RELEASE-amd64-bootonly.iso bhyvevm0示例37. 使用ZFS为UEFI客户机启动bhyve
当想要使用UEFI客户机时,请记住首先在jail中安装所需的固件包 sysutils/bhyve-firmware :
xxxxxxxxxx# pkg -j bhyve install bhyve-firmware然后直接使用 bhyve :
xxxxxxxxxx# bhyve -A -c 4 -D -H -m 2G \ -s 0,hostbridge \ -s 1,lpc \ -s 2,virtio-net,tap100 \ -s 3,virtio-blk,/dev/zvol/zroot/vms/bhyvevm0 \ -s 4,ahci-cd,/vms/FreeBSD-14.0-RELEASE-amd64-bootonly.iso \ -s 31,fbuf,tcp=127.0.0.1:5900,w=1024,h=800,tablet \ -l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd \ -l com1,/dev/nmdbbhyve0A \ bhyvevm0这允许通过VNC连接到虚拟机 bhyvevm0 ,以及位于 /dev/nmdbbhyve0B 的串行控制台。
将bhyve控制台封装在会话管理工具(如 sysutils/tmux 或 sysutils/screen )中是有利的,以便分离和重新连接到控制台。也可以将bhyve的控制台设置为可以使用 cu 访问的空调制解调器设备。为此,请加载nmdm内核模块,并将 -l com1, stdio 替换为 -l com2, /dev/nmdm0A 。根据需要自动创建 /dev/nmdm 设备,其中每个设备都是一对,对应于零调制解调器电缆的两端( /dev/nmdm0A 和 /dev/nmdm0B )。有关更多信息,请参见 nmdm(4) 。
xxxxxxxxxx# kldload nmdm# bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 -s 3:0,virtioblk,./linux.img \ -l com1,/dev/nmdm0A -c 4 -m 1024M linuxguest# cu -l /dev/nmdm0BConnectedUbuntu 13.10 handbook ttyS0handbook login:要断开与控制台的连接,请输入换行符(即按 RETURN ),后跟波浪号(~),最后输入点(.)。请记住,只有在登录会话保持活动状态时才会断开连接。因此,连接到同一控制台的另一个用户可以使用任何活动会话,而无需首先进行身份验证。出于安全原因,建议在断开连接之前注销。
nmdm 设备路径中的数字对于每个虚拟机都必须是唯一的,并且在bhyve启动之前不得被任何其他进程使用。该数字可以任意选择,不需要从连续的数字序列中选取。设备节点对(即 /dev/nmdm0a 和 /dev/nmdm0b )在bhyve连接其控制台时动态创建,并在关闭时销毁。在创建启动虚拟机的脚本时,请记住这一点:确保为所有虚拟机分配了唯一的nmdm设备。
在 /dev/vmm 中为每个虚拟机创建一个设备节点。这允许管理员轻松查看正在运行的虚拟机列表:
xxxxxxxxxx# ls -al /dev/vmmtotal 1dr-xr-xr-x 2 root wheel 512 Mar 17 12:19 ./dr-xr-xr-x 14 root wheel 512 Mar 17 06:38 ../crw------- 1 root wheel 0x1a2 Mar 17 12:20 guestnamecrw------- 1 root wheel 0x19f Mar 17 12:19 linuxguestcrw------- 1 root wheel 0x1a1 Mar 17 12:19 otherguest可以使用 bhyvectl 销毁指定的虚拟机:
xxxxxxxxxx# bhyvectl --destroy --vm=guestname以这种方式销毁虚拟机意味着立即将其杀死。任何未保存的数据都将丢失,打开的文件和文件系统可能会损坏。要优雅地关闭虚拟机,请向其bhyve进程发送 TERM 信号。这将触发客户机的ACPI关闭事件:
xxxxxxxxxx# ps ax | grep bhyve17424 - SC 56:48.27 bhyve: guestvm (bhyve)# kill 17424端口中有许多实用程序和应用程序可以帮助简化bhyve虚拟机的设置和管理:
表34. bhyve管理器
| 名称 | 授权 | 包 | 文档 |
|---|---|---|---|
| vm-bhyve | BSD-2 | sysutils/vm-bhyve | 文档 |
| CBSD | BSD-2 | sysutils/cbsd | 文档 |
| Virt-Manager | LGPL-3 | deskutils/virt-manager | 文档 |
| Bhyve RC Script | Unknown | sysutils/bhyve-rc | 文档 |
| bmd | BSD-2 | sysutils/bmd | 文档 |
| vmstated | BSD-2 | sysutils/vmstated | 文档 |
为了将系统配置为在启动时启动bhyve客户机,需要更改一些配置文件。
/etc/sysctl.conf
当使用抽头接口作为网络后端时,可以手动将每个使用的抽头接口设置为UP,也可以简单地设置以下sysctl:
xxxxxxxxxxnet.link.tap.up_on_open=1/etc/rc.conf
要通过网桥将虚拟机的抽头设备连接到网络,需要将设备设置持久化在 /etc/rc.conf 中。此外,通过 kld_list 配置变量为bhyve和 nmdm 设备加载必要的内核模块 vmm 和 nmdm 。配置 ifconfig_bridge0 时,请确保将 <ipaddr>/<netmask> 替换为物理接口的实际IP地址(本例中为 igb0 ),并从物理设备中删除IP设置。
xxxxxxxxxx# sysrc cloned_interfaces+="bridge0 tap0"# sysrc ifconfig_bridge0="inet <ipaddr>/<netmask> addm igb0 addm tap0"# sysrc kld_list+="nmdm vmm"# sysrc ifconfig_igb0="up"示例38. 设置网桥设备的IP
对于具有连接到IP 10.10.10.1 和网络掩码 255.255.255.0 的网络的 igb0 接口的主机,请使用以下命令:
xxxxxxxxxx# sysrc ifconfig_igb0="up"# sysrc ifconfig_bridge0="inet 10.10.10.1/24 addm igb0 addm tap0"# sysrc kld_list+="nmdm vmm"# sysrc cloned_interfaces+="bridge0 tap0"xxxxxxxxxx修改系统的IP地址配置可能会终止当前的远程连接(例如,通过SSH),从而导致锁定。在登录本地终端会话时,采取预防措施保持系统访问权限或进行这些修改。Xen是用于Intel®和ARM®架构的GPLv2许可类型1管理程序。自FreeBSD 8.0以来,FreeBSD已包含i386™和AMD®64位DomU以及Amazon EC2无特权域(虚拟机)支持,并在FreeBSD 11.0中包含Dom0控制域(主机)支持。对准虚拟化(PV)域的支持已从FreeBSD 11中删除,转而支持硬件虚拟化(HVM)域,这提供了更好的性能。
Xen™是一个裸机管理程序(bare-metal hypervisor),这意味着它是BIOS之后加载的第一个程序。然后启动一个名为Domain-0(简称 Dom0 )的特殊特权访客。Dom0使用其特权直接访问底层物理硬件,使其成为高性能解决方案。它能够直接访问磁盘控制器和网络适配器。Dom0还使用Xen™管理工具来管理和控制Xen™虚拟机管理程序,以创建、列出和销毁虚拟机。Dom0为非特权域(通常称为 DomU)提供虚拟磁盘和网络。Xen™Dom0可以与其他虚拟机监控程序解决方案的服务控制台进行比较,而DomU是运行单个客户机虚拟机的地方。
Xen™可以在不同的Xen™服务器之间迁移虚拟机。当两个xen主机共享相同的底层存储时,迁移可以在不必先关闭VM的情况下完成。相反,迁移是在DomU运行时实时执行的,不需要重新启动它或计划停机时间。这在维护场景或升级窗口中很有用,可以确保DomU提供的服务仍然可用。Xen™的更多功能列在Xen Wiki概述页面上。请注意,FreeBSD还不支持所有功能。
要在主机上运行Xen™管理程序,需要某些硬件功能。将FreeBSD作为Xen主机(Dom0)运行需要主机处理器中的Intel扩展页表(Extended Page Tables,EPT)或AMD嵌套页表(Nested Page Tables,NPT)和输入/输出内存管理单元(Input/Output Memory Management Unit,IOMMU)支持。
xxxxxxxxxx为了运行FreeBSD 13 Xen™Dom0,必须使用传统引导(BIOS)启动该机器。FreeBSD 14和更新版本支持在BIOS和UEFI模式下作为Xen™Dom0启动。用户应安装基于xen™4.18的 emulators/xen-kernel 和 sysutils/xentools 包。
安装Xen软件包后,必须编辑配置文件,为Dom0集成准备主机。/etc/sysctl.conf 中的一个条目禁用了允许连接多少页内存的限制。否则,具有更高内存要求的DomU VM将无法运行。
xxxxxxxxxx# echo 'vm.max_wired=-1' >> /etc/sysctl.conf另一个与内存相关的设置涉及更改 /etc/login.conf ,将 memorylocked 选项设置为 unlimited 。否则,创建DomU域可能会失败,并出现Cannot allocate memory (无法分配内存)错误。在对 /etc/login.conf 进行更改后,运行 cap_mkdb 以更新功能数据库。有关详细信息,请参阅【16.14. 资源限制】。
xxxxxxxxxx# sed -i '' -e 's/memorylocked=64K/memorylocked=unlimited/' /etc/login.conf# cap_mkdb /etc/login.conf将Xen™控制台的条目添加到 /etc/ttys :
xxxxxxxxxx# echo 'xc0 "/usr/libexec/getty Pc" xterm onifconsole secure' >> /etc/ttys在 /boot/loader.conf 中选择Xen™内核会激活Dom0。Xen™还需要主机为其自身和其他DomU域提供CPU和内存等资源。多少CPU和内存取决于个人要求和硬件能力。在这个例子中,8GB内存和4个虚拟CPU可用于Dom0。串行控制台也被激活,并定义了日志记录选项。
以下命令用于Xen 4.7软件包:
xxxxxxxxxx# echo 'hw.pci.mcfg=0' >> /boot/loader.conf# echo 'if_tap_load="YES"' >> /boot/loader.conf# echo 'xen_kernel="/boot/xen"' >> /boot/loader.conf# echo 'xen_cmdline="dom0_mem=8192M dom0_max_vcpus=4 dom0pvh=1 console=com1,vga com1=115200,8n1 guest_loglvl=all loglvl=all"' >> /boot/loader.conf对于Xen 4.11及更高版本,应使用以下命令:
xxxxxxxxxx# echo 'if_tap_load="YES"' >> /boot/loader.conf# echo 'xen_kernel="/boot/xen"' >> /boot/loader.conf# echo 'xen_cmdline="dom0_mem=8192M dom0_max_vcpus=4 dom0=pvh console=com1,vga com1=115200,8n1 guest_loglvl=all loglvl=all"' >> /boot/loader.confxxxxxxxxxxXen™为DomU VM创建的日志文件存储在/var/Log/Xen中。如果遇到问题,请务必检查该目录的内容。在系统启动期间激活 xencommons 服务:
xxxxxxxxxx# sysrc xencommons_enable=yes这些设置足以启动启用Dom0的系统。然而,它缺乏DomU机器的网络功能。要解决此问题,请定义一个与系统主NIC的桥接接口,DomU VM可以使用该接口连接到网络。将 em0 替换为主机网络接口名称。
xxxxxxxxxx# sysrc cloned_interfaces="bridge0"# sysrc ifconfig_bridge0="addm em0 SYNCDHCP"# sysrc ifconfig_em0="up"重新启动主机以加载Xen™内核并启动Dom0。
xxxxxxxxxx# reboot成功启动Xen™内核并再次登录系统后,Xen™管理工具xl用于显示有关域的信息。
xxxxxxxxxx# xl listName ID Mem VCPUs State Time(s)Domain-0 0 8192 4 r----- 962.0输出确认Dom0(称为 Domain-0 )的ID为 0 并且正在运行。它还具有之前在 /boot/loader.conf 中定义的内存和虚拟CPU。更多信息可以在Xen™文档中找到。现在可以创建DomU客户机。
非特权域由配置文件和虚拟或物理硬盘组成。DomU的虚拟磁盘存储可以是由 truncate(1) 或ZFS卷创建的文件,如【22.4.2. 创建和销毁卷】中所述。在这个例子中,使用了20 GB的卷。VM由ZFS卷、FreeBSD ISO映像、1GB RAM和两个虚拟CPU创建。使用 fetch(1) 检索ISO安装文件,并将其保存在本地名为 freebsd.iso 的文件中。
xxxxxxxxxx# fetch https://download.freebsd.org/releases/ISO-IMAGES/14.0/FreeBSD-14.0-RELEASEamd64-bootonly.iso -o freebsd.iso创建了一个名为xendisk0的20 GB ZFS卷,作为VM的磁盘空间。
xxxxxxxxxx# zfs create -V20G -o volmode=dev zroot/xendisk0新的DomU客户VM在文件中定义。还定义了一些特定的定义,如名称、键映射和VNC连接详细信息。以下 freebsd.cfg 包含此示例的最小DomU配置:
xxxxxxxxxx# cat freebsd.cfgbuilder = "hvm" ①name = "freebsd" ②memory = 1024 ③vcpus = 2 ④vif = [ 'mac=00:16:3E:74:34:32,bridge=bridge0' ] ⑤disk = ['/dev/zvol/tank/xendisk0,raw,hda,rw', ⑥'/root/freebsd.iso,raw,hdc:cdrom,r' ⑦ ]vnc = 1 ⑧vnclisten = "0.0.0.0"serial = "pty"usbdevice = "tablet"这些行将得到更详细的解释:
① 这定义了要使用哪种虚拟化。hvm 是指硬件辅助虚拟化或硬件虚拟机。客户操作系统可以在具有虚拟化扩展的CPU上无需修改即可运行,提供与在物理硬件上运行几乎相同的性能。generic 是默认值,并创建PV域。
② 此虚拟机的名称,以将其与在同一Dom0上运行的其他虚拟机区分开来。必修的。
③ VM可用的RAM数量(MB)。这个量是从管理程序的总可用内存中减去的,而不是Dom0的内存。
④ 客户机VM可用的虚拟CPU数量。为了获得最佳性能,不要创建虚拟CPU数量超过主机上物理CPU数量的客户机。
⑤ 虚拟网络适配器。这是连接到主机网络接口的网桥。mac 参数是在虚拟网络接口上设置的MAC地址。此参数是可选的,如果没有提供MAC,Xen™将生成一个随机的MAC。
⑥ 此VM的磁盘存储的磁盘、文件或ZFS卷的完整路径。选项和多个磁盘定义用逗号分隔。
⑦ 定义安装初始操作系统的引导介质。在这个例子中,它是之前下载的ISO映像。有关其他类型的设备和要设置的选项,请参阅Xen™文档。
⑧ 控制VNC连接到DomU串行控制台的选项。依次为:主动VNC支持、定义监听的IP地址、串行控制台的设备节点、鼠标精确定位的输入法和其他输入法。keymap 定义了要使用的keymap,默认情况下是 english 的。
在使用所有必要的选项创建文件后,通过将其作为参数传递给 xl create 来创建DomU。
xxxxxxxxxx# xl create freebsd.cfgxxxxxxxxxx每次重新启动Dom0时,必须再次将配置文件传递给 xl create 以重新创建DomU。默认情况下,重新启动后只创建Dom0,而不是单个VM。虚拟机可以在将操作系统存储在虚拟磁盘上时继续它们停止的地方。虚拟机配置可能会随时间而变化(例如,添加更多内存时)。虚拟机配置文件必须正确备份并保持可用,以便在需要时能够重新创建客户机VM。xl list 的输出确认DomU已创建。
xxxxxxxxxx# xl listName ID Mem VCPUs State Time(s)Domain-0 0 8192 4 r----- 1653.4freebsd 1 1024 1 -b---- 663.9要开始安装基本操作系统,请启动VNC客户端,将其定向到主机的主网络地址或 freebsd.cfg 的 vnclisten 行上定义的IP地址。安装操作系统后,关闭DomU并断开VNC查看器。编辑 freebsd.cfg ,删除带有 cdrom 定义的行,或在行首插入 # 字符将其注释掉。要加载此新配置,需要使用 xl destroy 删除旧的DomU,并将名称或id作为参数传递。然后,使用修改后的 freebsd.cfg 重新创建它。
xxxxxxxxxx# xl destroy freebsd# xl create freebsd.cfg然后,可以使用VNC查看器再次访问该机器。这一次,它将从安装了操作系统的虚拟磁盘启动,并可以用作虚拟机。
本节包含基本信息,以帮助解决将FreeBSD用作Xen™主机或客户机时发现的问题。
请注意,以下故障排除提示适用于Xen™4.11或更高版本。当仍在使用Xen™4.7并遇到问题时,请考虑迁移到较新版本的Xen™。
为了解决主机启动问题,需要串行电缆或调试USB电缆。通过在 loader.conf 中的 xen_cmdline 选项中添加选项,可以获得详细的Xen™引导输出。几个相关的调试选项是:
iommu=debug
可用于打印有关iommu的其他诊断信息。
dom0=verbose
可用于打印有关dom0构建过程的其他诊断信息。
sync_console
标志强制同步控制台输出。可用于调试,以避免因速率限制而丢失消息。切勿在生产环境中使用此选项,因为它可能允许恶意客户使用控制台对Xen™执行DoS攻击。
FreeBSD也应该以详细模式启动,以识别任何问题。要激活详细引导,请运行以下命令:
xxxxxxxxxx# echo 'boot_verbose="YES"' >> /boot/loader.conf如果这些选项都无法解决问题,请将串行启动日志发送至 freebsdxen@FreeBSD.org 和 xen-devel@lists.xenproject.org 以供进一步分析。
创建来宾时也可能出现问题,以下尝试为那些试图诊断来宾创建问题的人提供一些帮助。
访客创建失败的最常见原因是 xl 命令吐出一些错误,并以不同于0的返回代码退出。如果提供的错误不足以帮助识别问题,也可以通过反复使用 v 选项从 xl 获得更详细的输出。
xxxxxxxxxx# xl -vvv create freebsd.cfgParsing config from freebsd.cfglibxl: debug: libxl_create.c:1693:do_domain_create: Domain 0:ao 0x800d750a0: create:how=0x0 callback=0x0 poller=0x800d6f0f0libxl: debug: libxl_device.c:397:libxl__device_disk_set_backend: Disk vdev=xvdaspec.backend=unknownlibxl: debug: libxl_device.c:432:libxl__device_disk_set_backend: Disk vdev=xvda, usingbackend phylibxl: debug: libxl_create.c:1018:initiate_domain_create: Domain 1:running bootloaderlibxl: debug: libxl_bootloader.c:328:libxl__bootloader_run: Domain 1:not a PV/PVHdomain, skipping bootloaderlibxl: debug: libxl_event.c:689:libxl__ev_xswatch_deregister: watch w=0x800d96b98:deregister unregistereddomainbuilder: detail: xc_dom_allocate: cmdline="", features=""domainbuilder: detail: xc_dom_kernel_file: filename="/usr/local/lib/xen/boot/hvmloader"domainbuilder: detail: xc_dom_malloc_filemap : 326 kBlibxl: debug: libxl_dom.c:988:libxl__load_hvm_firmware_module: Loading BIOS:/usr/local/share/seabios/bios.bin...如果详细输出无法帮助诊断问题,/var/log/Xen 中还有QEMU和Xen™工具堆栈日志。请注意,域的名称附加在日志名称后面,因此如果域名为freebsd,请找到 /var/log/xen/xl-freebsd.log ,可能还有 /var/log/xne/qemu-dm-febsd.log 。这两个日志文件都可以包含调试的有用信息。如果这些都没有帮助解决问题,请将问题的描述和尽可能多的信息发送至 freebsdxen@FreeBSD.org 和 xen-devel@lists.xenproject.org 寻求帮助。