第 24 章 虚拟化

如果发现翻译错误,请直接 发起PR修改

24.1. 简介

虚拟化软件允许多个操作系统同时在同一台计算机上运行。这种针对个人电脑的软件系统通常包括一个主机操作系统,它运行虚拟化软件并支持任意数量的客户操作系统。

阅读完本章后,您将了解:

  • 主机操作系统和客户操作系统之间的区别。

  • 如何在以下虚拟化平台上安装 FreeBSD :

    • Parallels Desktop (苹果( R ) macOS ( R ))

    • VMware Fusion (苹果( R ) macOS ( R ))

    • VirtualBox™ ( Microsoft® Windows® 、 Intel®-based Apple® macOS® 、 Linux )

    • bhyve ( FreeBSD )

  • 如何调整 FreeBSD 系统以在虚拟化环境下获得最佳性能。

在阅读本章之前,你应该:

  • 了解 UNIX® 和 FreeBSD 的基础知识

  • 了解如何交叉引用: bsdinstall[bsdinstall ,安装 FreeBSD] 。

  • 了解如何进行交叉引用:高级网络设置 [advanced-networking ,设置网络连接] 。

  • 了解如何交叉引用: ports[ports ,安装额外的第三方软件] 。

24.2. 在 Parallels Desktop for macOS® 上作为客户机的 FreeBSD

Parallels Desktop for Mac ( R )是一款商业软件产品,适用于运行 macOS ( R ) 10.14.6 或更高版本的 Apple ( R ) Mac ( R )计算机。 FreeBSD 是一个完全支持的客户操作系统。一旦在 macOS ( R )上安装了 Parallels ,用户必须配置一个虚拟机,然后安装所需的客户操作系统。

24.2.1. 在 Mac 上使用 Parallels Desktop 安装 FreeBSD

在 Parallels 上安装 FreeBSD 的第一步是创建一个新的虚拟机来安装 FreeBSD 。

选择菜单:从 DVD 或镜像文件安装 Windows 或其他操作系统 [] ,然后继续。

Parallels 安装向导显示选择从 DVD 或镜像文件安装 Windows 或其他操作系统。

选择 FreeBSD 镜像文件。

Parallels 安装向导显示已选择 FreeBSD 镜像文件。

选择菜单:其他作为操作系统 [] 。

选择 FreeBSD 会导致启动时出现引导错误。

Parallels 安装向导显示操作系统选择为“其他”。

命名虚拟机并在安装之前检查菜单:自定义设置 []

Parallels 安装向导显示了在安装之前自定义设置的复选框已被选中。

当配置窗口弹出时,转到菜单:硬件 [] 选项卡,选择菜单:启动顺序 [] ,然后点击菜单:高级 [] 。然后,选择 *EFI 64 位 * 作为菜单: BIOS[] 。

Parallels 安装向导显示选择 EFI 64 位作为 BIOS 。

点击菜单:确定 [] ,关闭配置窗口,然后点击菜单:继续 [] 。

Parallels 安装向导显示新虚拟机的摘要信息。

虚拟机将自动启动。按照通用步骤安装 FreeBSD 。

FreeBSD 在 Parallels 上启动成功。

24.2.2. 在 Parallels 上配置 FreeBSD

在使用 Parallels 在 macOS® X 上成功安装 FreeBSD 之后,可以采取一些配置步骤来优化系统以进行虚拟化操作。

  1. 设置引导加载程序变量

    最重要的步骤是减少在 Parallels 环境下 FreeBSD 的 CPU 利用率,方法是将 kern.hz 可调参数降低。通过在 /boot/loader.conf 文件中添加以下行来实现:

    kern.hz=100

    如果没有这个设置,一个空闲的 FreeBSD Parallels 虚拟机将会占用大约一个处理器 iMac® 的 15% 的 CPU 。在进行这个更改后,使用率将会接近 5% 。

  2. 创建一个新的内核配置文件

    可以从自定义内核配置文件中删除所有 SCSI 、 FireWire 和 USB 设备驱动程序。 Parallels 提供了一个虚拟网络适配器,由 ed(4) 驱动程序使用,因此除了 ed(4)miibus(4) 之外,所有网络设备都可以从内核中删除。

  3. 配置网络

    最基本的网络设置使用 DHCP 将虚拟机连接到与主机 Mac® 相同的局域网。可以通过在 /etc/rc.conf 文件中添加 ifconfig_ed0 ="DHCP" 来实现。更高级的网络设置在 中有描述。

24.3. 在 macOS 上使用 VMware Fusion 作为客户机的 FreeBSD

VMware Fusion for Mac ( R )是一款商业软件产品,适用于运行 macOS ( R ) 12 或更高版本的 Apple ( R ) Mac ( R )计算机。 FreeBSD 是一个完全支持的客户操作系统。一旦在 macOS ( R )上安装了 VMware Fusion ,用户可以配置虚拟机,然后安装所需的客户操作系统。

24.3.1. 在 VMware Fusion 上安装 FreeBSD

第一步是启动 VMware Fusion ,它将加载虚拟机库。点击【+ → 新建】来创建虚拟机:

vmware freebsd01

这将加载新的虚拟机助手。选择【创建自定义虚拟机】并点击【继续】以继续:

vmware freebsd02

在提示时,选择 [.guimenuitem]# 其他 # 作为 [.guimenuitem]# 操作系统 # ,并选择 FreeBSD X 或 [.guimenuitem]#FreeBSD X 64 位 # 作为菜单 : 版本 [] 。

vmware freebsd03

选择固件(推荐使用 UEFI ):

vmware freebsd04

选择 [.guimenuitem]# 创建新的虚拟磁盘 # 并点击 [.guimenuitem]# 继续 # :

vmware freebsd05

检查配置并点击 [.guimenuitem]# 完成 # 。

vmware freebsd06

选择虚拟机的名称和保存的目录:

vmware freebsd07

按下 Command + E 打开虚拟机设置,然后点击 CD/DVD

vmware freebsd08

选择 FreeBSD ISO 镜像或者从 CD/DVD 中选择:

vmware freebsd09

启动虚拟机:

vmware freebsd10

按照通常的方式安装 FreeBSD :

vmware freebsd11

安装完成后,可以修改虚拟机的设置,例如内存使用量和虚拟机可以访问的 CPU 数量。

虚拟机运行时无法修改虚拟机的系统硬件设置。

vmware freebsd12

CD-ROM 设备的状态。通常,当虚拟机不再需要 CD/DVD/ISO 时,它会与之断开连接。

vmware freebsd09

最后需要更改的是虚拟机如何连接到网络。为了允许虚拟机与主机以外的其他机器进行连接,选择 [.guimenuitem]# 直接连接物理网络(桥接) # 。否则,推荐选择 [.guimenuitem]# 共享主机的互联网连接( NAT ) # ,这样虚拟机可以访问互联网,但网络无法访问虚拟机。

vmware freebsd13

修改设置后,启动新安装的 FreeBSD 虚拟机。

24.3.2. 在 VMware Fusion 上配置 FreeBSD

在使用 VMware Fusion 成功安装 FreeBSD 到 macOS® X 之后,可以采取一些配置步骤来优化系统以进行虚拟化操作。

  1. 设置引导加载程序变量

    最重要的步骤是在 VMware Fusion 环境下减少 FreeBSD 的 CPU 利用率,方法是将 kern.hz 可调参数降低。通过在 [/boot/loader.conf] 文件中添加以下行来实现:

    kern.hz=100

    如果没有这个设置,一个空闲的 FreeBSD VMware Fusion 客户机将使用大约 15% 的单处理器 iMac® 的 CPU 。在进行这个更改之后,使用率将接近 5% 。

  2. 创建一个新的内核配置文件

    可以从自定义内核配置文件中删除所有的 FireWire 和 USB 设备驱动程序。 VMware Fusion 提供了一个虚拟网络适配器,由 em(4) 驱动程序使用,因此除了 em(4) 之外的所有网络设备都可以从内核中删除。

  3. 配置网络

    最基本的网络设置使用 DHCP 将虚拟机连接到与主机 Mac® 相同的局域网。可以通过在 /etc/rc.conf 文件中添加 ifconfig_em0 ="DHCP" 来实现。更高级的网络设置在《高级网络设置》中有描述。

  4. 安装驱动程序和 open-vm-tools

    要在 VMWare 上顺畅运行 FreeBSD ,需要安装驱动程序:

    # pkg install xf86-video-vmware xf86-input-vmmouse open-vm-tools

24.4. 在 VirtualBox™ 上作为客户机的 FreeBSD

FreeBSD 在 VirtualBox™ 中作为客户机运行良好。这款虚拟化软件适用于大多数常见操作系统,包括 FreeBSD 本身。

VirtualBox™ 客户机附加组件提供以下支持:

  • 剪贴板共享。

  • 鼠标指针集成。

  • 主机时间同步。

  • 窗口缩放。

  • 无缝模式。

这些命令在 FreeBSD 虚拟机中运行。

首先,在 FreeBSD 客户机中安装包: emulators/virtualbox-ose-additions[] 。这将安装端口:

# cd /usr/ports/emulators/virtualbox-ose-additions && make install clean

将以下行添加到 [/etc/rc.conf] 文件中:

vboxguest_enable="YES"
vboxservice_enable="YES"

如果使用 ntpd(8)ntpdate(8) ,请禁用主机时间同步:

vboxservice_flags="--disable-timesync"

Xorg 会自动识别 vboxvideo 驱动程序。也可以在 /etc/X11/xorg.conf 文件中手动输入。

Section "Device"
	Identifier "Card0"
	Driver "vboxvideo"
	VendorName "InnoTek Systemberatung GmbH"
	BoardName "VirtualBox Graphics Adapter"
EndSection

要使用 vboxmouse 驱动程序,请在 /etc/X11/xorg.conf 中调整鼠标部分。

Section "InputDevice"
	Identifier "Mouse0"
	Driver "vboxmouse"
EndSection

通过使用 mount_vboxvfs 挂载,可以访问主机和虚拟机之间的共享文件夹进行文件传输。可以使用 VirtualBox GUI 或通过 vboxmanage 在主机上创建共享文件夹。例如,要在名为_BSDBox_的虚拟机下创建一个名为_myshare_的共享文件夹,位于 /mnt/bsdboxshare ,运行以下命令:

# vboxmanage sharedfolder add 'BSDBox' --name myshare --hostpath /mnt/bsdboxshare

请注意,共享文件夹的名称不能包含空格。在虚拟机中挂载共享文件夹的方法如下:

# mount_vboxvfs -w myshare /mnt

24.5. 使用 VirtualBox™ 将 FreeBSD 作为主机

VirtualBox™ 是一个积极开发的完整虚拟化软件包,适用于包括 Windows® 、 macOS® 、 Linux® 和 FreeBSD 在内的大多数操作系统。它能够同样运行 Windows® 或类 UNIX® 的客户机。它以开源软件的形式发布,但也有一些闭源组件可在单独的扩展包中获取。这些组件包括对 USB 2.0 设备的支持。有关更多信息,请参阅 VirtualBox™ 维基的 下载页面 。目前,这些扩展在 FreeBSD 上不可用。

24.5.1. 安装 VirtualBox™

VirtualBox™ 可以作为 FreeBSD 的一个软件包或端口在 emulators/virtualbox-ose 中获得。可以使用以下命令安装该端口:

# cd /usr/ports/emulators/virtualbox-ose
# make install clean

端口配置菜单中的一个有用选项是“ GuestAdditions ”程序套件。这些程序在客户操作系统中提供了许多有用的功能,如鼠标指针集成(允许鼠标在主机和客户之间共享,无需按特殊的键盘快捷键切换)和更快的视频渲染,尤其是在 Windows® 客户中。在客户安装完成后,可以在菜单 : 设备 [] 菜单中找到客户附加组件。

在首次启动 VirtualBox™ 之前,需要进行一些配置更改。该端口会在 /boot/modules 中安装一个内核模块,必须将其加载到正在运行的内核中:

# kldload vboxdrv

为了确保模块在重新启动后始终加载,将以下行添加到 [/boot/loader.conf] 文件中:

vboxdrv_load="YES"

要使用允许桥接或仅主机网络的内核模块,请将以下行添加到 [/etc/rc.conf] 文件中,并重新启动计算机:

vboxnet_enable="YES"

在安装 VirtualBox™ 时会创建 vboxusers 组。所有需要访问 VirtualBox™ 的用户都必须添加为该组的成员。可以使用 pw 命令来添加新成员:

# pw groupmod vboxusers -m yourusername

/dev/vboxnetctl 的默认权限很严格,需要更改以支持桥接网络:

# chown root:vboxusers /dev/vboxnetctl
# chmod 0660 /dev/vboxnetctl

要使此权限更改永久生效,请将以下行添加到 /etc/devfs.conf 文件中:

own     vboxnetctl root:vboxusers
perm    vboxnetctl 0660

要启动 VirtualBox™ ,请在 Xorg 会话中输入以下命令:

% VirtualBox

有关配置和使用 VirtualBox™ 的更多信息,请参阅 官方网站 。有关 FreeBSD 特定信息和故障排除说明,请参阅 FreeBSD wiki 中的相关页面

24.5.2. VirtualBox™ USB 支持

VirtualBox™ 可以配置为将 USB 设备传递给客户操作系统。 OSE 版本的主机控制器仅限于模拟 USB 1.1 设备,直到支持 USB 2.0 和 3.0 设备的扩展包在 FreeBSD 上可用为止。

要使 VirtualBox™ 能够识别连接到计算机的 USB 设备,用户需要是 operator 组的成员。

# pw groupmod operator -m yourusername

然后,将以下内容添加到 /etc/devfs.rules 中,如果该文件尚不存在,则创建该文件:

[system=10]
add path 'usb/*' mode 0660 group operator

要加载这些新规则,请将以下内容添加到 [/etc/rc.conf] 文件中:

devfs_system_ruleset="system"

然后,重新启动 devfs :

# service devfs restart

重新启动登录会话和 VirtualBox™ 以使这些更改生效,并根据需要创建 USB 过滤器。

24.5.3. VirtualBox™ 主机 DVD/CD 访问

通过共享物理驱动器,可以实现从虚拟机访问主机的 DVD/CD 驱动器。在 VirtualBox™ 中,可以在虚拟机的设置中的存储窗口中进行设置。如果需要,首先创建一个空的 IDECD/DVD 设备。然后从弹出菜单中选择主机驱动器作为虚拟 CD/DVD 驱动器的选择。将会出现一个名为“ Passthrough ”的复选框。这允许虚拟机直接使用硬件。例如,只有在选择了此选项后,音频 CD 或刻录机才能正常工作。

为了使用户能够使用 VirtualBox™ 的 DVD/CD 功能,他们需要访问 /dev/xpt0/dev/cdN/dev/passN 。通常通过将用户添加到 operator 组来实现此目的。需要通过在 /etc/devfs.conf 中添加以下行来更正对这些设备的权限:

perm cd* 0660
perm xpt0 0660
perm pass* 0660
# service devfs restart

24.6. 使用 bhyve 作为 FreeBSD 主机

bhyve 是一个基于 BSD 许可的虚拟机监控程序,自 FreeBSD 10.0-RELEASE 版本起成为基础系统的一部分。该虚拟机监控程序支持多种客户操作系统,包括 FreeBSD 、 OpenBSD 和许多 Linux® 发行版。默认情况下, bhyve 提供串行控制台访问,并不模拟图形控制台。它利用较新的 CPU 的虚拟化卸载功能,避免了传统的指令转换和手动管理内存映射的方法。

bhyve 设计要求处理器支持 Intel® 扩展页表 (EPT) 或 AMD® 快速虚拟化索引 (RVI) 或嵌套页表 (NPT) 。托管具有多个虚拟 CPU 的 Linux® 客户机或 FreeBSD 客户机需要 VMX 无限制模式支持 (UG) 。大多数较新的处理器,特别是 Intel® Core™ i3/i5/i7 和 Intel® Xeon™ E3/E5/E7 ,都支持这些功能。 UG 支持是在 Intel 的 Westmere 微架构中引入的。有关支持 EPT 的 Intel® 处理器的完整列表,请参阅 https://ark.intel.com/content/www/us/en/ark/search/featurefilter.html ? productType = 873 & 0_ExtendedPageTables = True[] 。 RVI 出现在第三代及以后的 AMD Opteron™(Barcelona) 处理器上。判断处理器是否支持 bhyve 的最简单方法是运行 dmesg 命令或在 AMD® 处理器的 Features2 行上查找 POPCNT 处理器特性标志,或在 Intel® 处理器的 VT-x 行上查找 EPTUG

24.6.1. 准备主机

在 bhyve 中创建虚拟机的第一步是配置主机系统。首先,加载 bhyve 内核模块:

# kldload vmm

然后,在虚拟机中为网络设备创建一个名为 tap 的接口,以便连接到该接口。为了使网络设备能够参与网络通信,还需创建一个桥接接口,其中包含 tap 接口和物理接口作为成员。在这个例子中,物理接口是 igb0

# ifconfig tap0 create
# sysctl net.link.tap.up_on_open=1
net.link.tap.up_on_open: 0 -> 1
# ifconfig bridge0 create
# ifconfig bridge0 addm igb0 addm tap0
# ifconfig bridge0 up

24.6.2. 创建一个 FreeBSD 虚拟机

创建一个文件作为虚拟磁盘用于客户机。指定虚拟磁盘的大小和名称:

# truncate -s 16G guest.img

下载一个 FreeBSD 的安装镜像来进行安装:

# fetch https://download.freebsd.org/releases/ISO-IMAGES/13.1/FreeBSD-13.1-RELEASE-amd64-bootonly.iso
FreeBSD-13.1-RELEASE-amd64-bootonly.iso                366 MB   16 MBps    22s

FreeBSD 附带了一个示例脚本,用于在 bhyve 中运行虚拟机。该脚本将启动虚拟机并在循环中运行,因此如果虚拟机崩溃,它将自动重新启动。脚本接受多个选项来控制机器的配置: -c 控制虚拟 CPU 的数量, -m 限制可用于客户机的内存量, -t 定义要使用的 tap 设备, -d 指示要使用的磁盘映像, -i 告诉 bhyve 从 CD 映像而不是磁盘启动, -I 定义要使用的 CD 映像。最后一个参数是虚拟机的名称,用于跟踪正在运行的虚拟机。此示例在安装模式下启动虚拟机:

# sh /usr/share/examples/bhyve/vmrun.sh -c 1 -m 1024M -t tap0 -d guest.img -i -I FreeBSD-13.1-RELEASE-amd64-bootonly.iso guestname

虚拟机将启动并开始安装程序。在虚拟机中安装系统后,当系统在安装结束时询问是否进入 shell ,请选择“是”。

重新启动虚拟机。虚拟机重新启动会导致 bhyve 退出,但是 vmrun.sh 脚本会在循环中运行 bhyve 并自动重新启动它。当这种情况发生时,选择从引导加载程序菜单中的重新启动选项以退出循环。现在可以从虚拟磁盘启动客户机。

# sh /usr/share/examples/bhyve/vmrun.sh -c 4 -m 1024M -t tap0 -d guest.img guestname

24.6.3. 创建一个 Linux® 虚拟机

为了引导除 FreeBSD 之外的操作系统,必须首先安装 sysutils/grub2-bhyve 端口。

接下来,创建一个文件作为虚拟磁盘用于客户机。

# truncate -s 16G linux.img

使用 bhyve 启动虚拟机是一个两步骤的过程。首先必须加载内核,然后才能启动客户机。使用 sysutils/grub2-bhyve 加载 Linux® 内核。创建一个 device.map ,供 grub 使用,将虚拟设备映射到主机系统上的文件。

(hd0) ./linux.img
(cd0) ./somelinux.iso

使用包: sysutils/grub2-bhyve[] 从 ISO 镜像中加载 Linux® 内核:

# grub-bhyve -m device.map -r cd0 -M 1024M linuxguest

这将启动 grub 。如果安装 CD 包含一个 grub.cfg 文件,将显示一个菜单。如果没有,必须手动定位并加载 vmlinuzinitrd 文件:

grub> ls
(hd0) (cd0) (cd0,msdos1) (host)
grub> ls (cd0)/isolinux
boot.cat boot.msg grub.conf initrd.img isolinux.bin isolinux.cfg memtest
splash.jpg TRANS.TBL vesamenu.c32 vmlinuz
grub> linux (cd0)/isolinux/vmlinuz
grub> initrd (cd0)/isolinux/initrd.img
grub> boot

现在 Linux® 内核已经加载完毕,可以启动虚拟机了:

# 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 退出。在可以再次启动之前,需要销毁虚拟机的实例。

# bhyvectl --destroy --vm=linuxguest

现在可以直接从虚拟磁盘启动客户机。加载内核:

# grub-bhyve -m device.map -r hd0,msdos1 -M 1024M linuxguest
grub> 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.x
86_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.img
grub> linux (hd0,msdos1)/vmlinuz-2.6.32-431.el6.x86_64 root=/dev/mapper/VolGroup-lv_root
grub> initrd (hd0,msdos1)/initramfs-2.6.32-431.el6.x86_64.img
grub> boot

启动虚拟机:

# 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 linuxguest

Linux® 现在将在虚拟机中启动,并最终呈现给您登录提示符。登录并使用虚拟机。完成后,重新启动虚拟机以退出 bhyve 。销毁虚拟机实例:

# bhyvectl --destroy --vm=linuxguest

24.6.4. 使用 UEFI 固件引导 bhyve 虚拟机

除了 bhyveload 和 grub-bhyve 之外, bhyve 虚拟机监视器还可以使用 UEFI 用户空间固件引导虚拟机。这个选项可能支持其他加载器不支持的客户操作系统。

为了在 bhyve 中使用 UEFI 支持,首先需要获取 UEFI 固件镜像。可以通过安装 sysutils/bhyve-firmware 端口或包来完成。

在固件安装完成后,将标志 -l bootrom ,/path/to/firmware 添加到您的 bhyve 命令行中。实际的 bhyve 命令可能如下所示:

# 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

sysutils/bhyve-firmware 还包含一个启用了 CSM 的固件,用于以传统 BIOS 模式启动不支持 UEFI 的虚拟机:

# 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 \
guest

24.6.5. bhyve 客户机的图形 UEFI 帧缓冲

UEFI 固件支持对于主要以图形为主的客户操作系统(如 Microsoft Windows® )特别有用。

还可以使用 -s 29 , fbuf , tcp =0.0.0.0:5900 标志来启用对 UEFI-GOP 帧缓冲的支持。可以使用 w =800h =600 来配置帧缓冲的分辨率,并且可以通过添加 wait 来指示 bhyve 在启动客户机之前等待 VNC 连接。帧缓冲可以通过主机或通过 VNC 协议通过网络访问。此外,还可以添加 -s 30 , xhci , tablet 以实现与主机的精确鼠标光标同步。

生成的 bhyve 命令将如下所示:

# 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 仿真模式下,一旦控制权从固件转移到客户操作系统,帧缓冲将停止接收更新。

24.6.6. 使用 ZFS 与 bhyve 虚拟机

如果主机上可用 ZFS ,使用 ZFS 卷而不是磁盘映像文件可以为客户机提供显著的性能优势。可以通过以下方式创建 ZFS 卷:

# zfs create -V16G -o volmode=dev zroot/linuxdisk0

在启动虚拟机时,将 ZFS 卷指定为磁盘驱动器:

# 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

24.6.7. 虚拟机控制台

将 bhyve 控制台包装在会话管理工具(如 sysutils/tmuxsysutils/screen )中是有优势的,这样可以分离和重新连接到控制台。还可以将 bhyve 的控制台设置为一个空调制解调器设备,可以使用 cu 访问。为此,加载 nmdm 内核模块,并将 -l com1 , stdio 替换为 -l com1 , /dev/nmdm0A/dev/nmdm 设备会根据需要自动创建,每个设备都是一对,对应于空调制解调器电缆的两端( /dev/nmdm0A/dev/nmdm0B )。有关更多信息,请参阅 nmdm(4)

# kldload nmdm
# 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,/dev/nmdm0A -c 4 -m 1024M linuxguest
# cu -l /dev/nmdm0B
Connected

Ubuntu 13.10 handbook ttyS0

handbook login:

24.6.8. 管理虚拟机

每个虚拟机都在 /dev/vmm 目录下创建了一个设备节点。这样管理员就可以轻松地查看正在运行的虚拟机列表。

# ls -al /dev/vmm
total 1
dr-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 guestname
crw-------   1 root  wheel  0x19f Mar 17 12:19 linuxguest
crw-------   1 root  wheel  0x1a1 Mar 17 12:19 otherguest

可以使用 bhyvectl 命令销毁指定的虚拟机:

# bhyvectl --destroy --vm=guestname

24.6.9. 持久化配置

为了在启动时配置系统以启动 bhyve 虚拟机,必须在指定的文件中进行以下配置:

  1. /etc/sysctl.conf

    net.link.tap.up_on_open=1
  2. /etc/rc.conf

    cloned_interfaces="bridge0 tap0"
    ifconfig_bridge0="addm igb0 addm tap0"
    kld_list="nmdm vmm"

24.7. FreeBSD 作为 Xen™ 主机

Xen 是一种基于 GPLv2 许可的 1 型虚拟化监控程序 ,适用于 Intel® 和 ARM® 架构。 FreeBSD 自 8.0 版本起包含了 i386™ 和 AMD® 64 位 DomU 以及 Amazon EC2 非特权域(虚拟机)支持,并在 FreeBSD 11.0 中增加了 Dom0 控制域(主机)支持。在 FreeBSD 11 中,对于半虚拟化( PV )域的支持已被移除,取而代之的是硬件虚拟化( HVM )域,这提供了更好的性能。

Xen™ 是一个裸金属虚拟化监控程序,这意味着它是在 BIOS 之后加载的第一个程序。然后启动一个特殊的特权客户机,称为 Domain-0 (简称为 Dom0 )。 Dom0 利用其特权直接访问底层物理硬件,使其成为高性能解决方案。它能够直接访问磁盘控制器和网络适配器。 Dom0 还使用 Xen™ 管理工具来管理和控制 Xen™ 虚拟化监控程序,创建、列出和销毁虚拟机( VMs )。 Dom0 为非特权域(通常称为 DomU )提供虚拟磁盘和网络。 Xen™ Dom0 可以与其他虚拟化监控程序解决方案的服务控制台进行比较,而 DomU 是运行各个客户机虚拟机的地方。

Xen™ 可以在不同的 Xen™ 服务器之间迁移虚拟机。当两个 Xen 主机共享相同的底层存储时,迁移可以在不必先关闭虚拟机的情况下进行。相反,迁移是在 DomU 运行时进行的,无需重新启动或计划停机时间。这在维护场景或升级窗口中非常有用,以确保 DomU 提供的服务仍然可用。 Xen™ 的许多其他功能列在 Xen Wiki 概述页面 上。请注意,目前并非所有功能都在 FreeBSD 上受支持。

24.7.1. Xen™ Dom0 的硬件要求

要在主机上运行 Xen™ 虚拟机监视器,需要一定的硬件功能。硬件虚拟化域需要主机处理器支持扩展页表( EPT )和输入 / 输出内存管理单元( IOMMU )。

为了运行 FreeBSD Xen™ Dom0 ,必须使用传统引导( BIOS )启动该设备。

24.7.2. Xen™ Dom0 控制域设置

FreeBSD 11 的用户应安装基于 Xen 4.7 版本的包: emulators/xen-kernel47[] 和包: sysutils/xen-tools47[] 。运行在 FreeBSD-12.0 或更新版本上的系统可以分别使用基于 Xen 4.11 的包: emulators/xen-kernel411[] 和包: sysutils/xen-tools411[] 。

在安装 Xen 软件包后,必须编辑配置文件以准备主机进行 Dom0 集成。在 [/etc/sysctl.conf] 中添加条目可以禁用内存页面的限制。否则,具有较高内存需求的 DomU 虚拟机将无法运行。

# echo 'vm.max_wired=-1' >> /etc/sysctl.conf

另一个与内存相关的设置涉及更改 /etc/login.conf ,将 memorylocked 选项设置为 unlimited 。否则,创建 DomU 域可能会失败,并显示 Cannot allocate memory 错误。在对 /etc/login.conf 进行更改后,运行 cap_mkdb 以更新能力数据库。有关详细信息,请参阅 资源限制

# sed -i '' -e 's/memorylocked=64K/memorylocked=unlimited/' /etc/login.conf
# cap_mkdb /etc/login.conf

/etc/ttys 中添加一个 Xen™ 控制台的条目:

# echo 'xc0     "/usr/libexec/getty Pc"         xterm   onifconsole  secure' >> /etc/ttys

/boot/loader.conf 中选择一个 Xen™ 内核会激活 Dom0 。 Xen™ 还需要来自主机机器的 CPU 和内存资源,用于自身和其他 DomU 域。 CPU 和内存的数量取决于个体需求和硬件能力。在这个例子中,为 Dom0 提供了 8 GB 的内存和 4 个虚拟 CPU 。串行控制台也被激活,并定义了日志选项。

以下命令用于 Xen 4.7 软件包:

# 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 及更高版本,应使用以下命令:

# 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.conf

Xen™ 为 DomU 虚拟机创建的日志文件存储在 [/var/log/xen] 目录中。如果遇到问题,请务必检查该目录的内容。

在系统启动时激活 xencommons 服务:

# sysrc xencommons_enable=yes

这些设置足以启动一个启用了 Dom0 的系统。然而,它缺乏用于 DomU 虚拟机的网络功能。为了解决这个问题,需要定义一个桥接接口,使用系统的主要网络接口(主机网络接口名称替换为_em0_),以便 DomU 虚拟机可以连接到网络。

# sysrc cloned_interfaces="bridge0"
# sysrc ifconfig_bridge0="addm em0 SYNCDHCP"
# sysrc ifconfig_em0="up"

重新启动主机以加载 Xen™ 内核并启动 Dom0 。

# reboot

在成功启动 Xen™ 内核并再次登录系统后,使用 Xen™ 管理工具 xl 来显示有关域的信息。

# xl list
Name                                        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 客户机虚拟机。

24.7.3. Xen™ DomU 客户机虚拟机配置

非特权域由配置文件和虚拟或物理硬盘组成。 DomU 的虚拟磁盘存储可以是由 truncate(1) 创建的文件,也可以是 中描述的 ZFS 卷。 在此示例中,使用了一个 20 GB 的卷。 使用 ZFS 卷、 FreeBSD ISO 映像、 1 GB 的 RAM 和两个虚拟 CPU 创建了一个虚拟机。 ISO 安装文件使用 fetch(1) 获取,并保存在名为 freebsd.iso 的本地文件中。

# fetch https://download.freebsd.org/releases/ISO-IMAGES/13.1/FreeBSD-13.1-RELEASE-amd64-bootonly.iso -o freebsd.iso

创建了一个名为 xendisk0 的 20 GB ZFS 卷,用作虚拟机的磁盘空间。

# zfs create -V20G -o volmode=dev zroot/xendisk0

新的 DomU 客户机虚拟机在一个文件中定义。一些特定的定义,如名称、键盘映射和 VNC 连接详细信息也被定义。以下是一个示例的最小 DomU 配置的 freebsd.cfg 文件内容:

# cat freebsd.cfg
builder = "hvm" (1)
name = "freebsd" (2)
memory = 1024 (3)
vcpus = 2 (4)
vif = [ 'mac=00:16:3E:74:34:32,bridge=bridge0' ] (5)
disk = [
'/dev/zvol/tank/xendisk0,raw,hda,rw', (6)
'/root/freebsd.iso,raw,hdc:cdrom,r' (7)
  ]
vnc = 1 (8)
vnclisten = "0.0.0.0"
serial = "pty"
usbdevice = "tablet"

这些行将被更详细地解释:

1 这定义了要使用的虚拟化类型。 hvm 指的是硬件辅助虚拟化或硬件虚拟机。客户操作系统可以在具有虚拟化扩展的 CPU 上无需修改即可运行,提供与在物理硬件上运行几乎相同的性能。 generic 是默认值,创建一个 PV 域。 <.> 虚拟机的名称,用于区分在同一 Dom0 上运行的其他虚拟机。必填项。 <.> 分配给虚拟机的内存数量,以兆字节为单位。此数量从超级监视程序的总可用内存中减去,而不是从 Dom0 的内存中减去。 <.> 客户虚拟机可用的虚拟 CPU 数量。为了获得最佳性能,请不要创建具有超过主机上物理 CPU 数量的虚拟 CPU 的客户。 <.> 虚拟网络适配器。这是连接到主机网络接口的桥接器。 mac 参数是设置在虚拟网络接口上的 MAC 地址。如果未提供 MAC ,则此参数是可选的, Xen™ 将生成一个随机的 MAC 地址。 <.> 磁盘、文件或 ZFS 磁盘存储的完整路径,用于此虚拟机。选项和多个磁盘定义由逗号分隔。 <.> 定义安装初始操作系统的启动介质。在此示例中,它是之前下载的 ISO 镜像。请参阅 Xen™ 文档以了解其他类型的设备和设置选项。 <.> 控制 VNC 连接到 DomU 的串行控制台的选项。按顺序,它们是:激活 VNC 支持,定义要监听的 IP 地址,串行控制台的设备节点,以及精确定位鼠标和其他输入方法的输入方法。 keymap 定义要使用的键盘映射,默认为 english

在使用所有必要选项创建文件之后,通过将其作为参数传递给 xl create 来创建 DomU 。

# xl create freebsd.cfg

每次重新启动 Dom0 时,必须再次将配置文件传递给 xl create 以重新创建 DomU 。默认情况下,在重新启动后只会创建 Dom0 ,而不会创建各个虚拟机。虚拟机可以从它们上次停止的地方继续运行,因为它们将操作系统存储在虚拟磁盘上。虚拟机的配置可以随时间而变化(例如,添加更多内存)。虚拟机的配置文件必须被正确备份并保持可用,以便在需要时重新创建客户虚拟机。

xl list 的输出确认了 DomU 已经被创建。

# xl list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0  8192     4     r-----  1653.4
freebsd                                      1  1024     1     -b----   663.9

要开始安装基本操作系统,请启动 VNC 客户端,并将其指向主机的主网络地址或在 freebsd.cfg 文件的 vnclisten 行中定义的 IP 地址。操作系统安装完成后,关闭 DomU 并断开 VNC 查看器的连接。编辑 freebsd.cfg 文件,删除包含 cdrom 定义的行,或在行的开头插入一个 # 字符进行注释。要加载这个新的配置,需要使用 xl destroy 命令删除旧的 DomU ,参数可以是名称或 ID 。然后,使用修改后的 freebsd.cfg 文件重新创建 DomU 。

# xl destroy freebsd
# xl create freebsd.cfg

然后可以使用 VNC 查看器再次访问该机器。这次,它将从已安装操作系统的虚拟磁盘启动,并可用作虚拟机。

24.7.4. 故障排除

本节包含基本信息,以帮助解决在使用 FreeBSD 作为 Xen™ 主机或客户机时遇到的问题。

24.7.4.1. 主机启动故障排除

请注意,以下故障排除提示适用于 Xen™ 4.11 或更新版本。如果您仍在使用 Xen™ 4.7 并且遇到问题,请考虑迁移到更新版本的 Xen™ 。

为了解决主机启动问题,您可能需要使用串行电缆或调试 USB 电缆。可以通过向 loader.conf 中的 xen_cmdline 选项添加选项来获取详细的 Xen™ 引导输出。一些相关的调试选项包括:

  • iommu = debug :可用于打印有关 IOMMU 的额外诊断信息。

  • dom0 = verbose :可用于打印有关 dom0 构建过程的额外诊断信息。

  • sync_console :用于强制同步控制台输出的标志。在调试过程中非常有用,可以避免由于速率限制而丢失消息。在生产环境中永远不要使用此选项,因为它可能允许恶意虚拟机通过控制台对 Xen™ 进行拒绝服务( DoS )攻击。

为了识别任何问题, FreeBSD 也应该以详细模式启动。要激活详细启动,请运行以下命令:

# echo 'boot_verbose="YES"' >> /boot/loader.conf

如果这些选项都无法解决问题,请将串行引导日志发送至 mailto:freebsd-xen @ FreeBSD.org[freebsd-xen @ FreeBSD.org] 和 mailto:xen-devel @ lists.xenproject.org[xen-devel @ lists.xenproject.org] 以进行进一步分析。

24.7.4.2. 访客创建故障排除

在创建虚拟机时也可能出现问题,下面尝试为那些试图诊断虚拟机创建问题的人提供一些帮助。

创建虚拟机失败最常见的原因是 xl 命令输出错误并以非 0 的返回码退出。如果提供的错误信息不足以帮助确定问题,还可以通过多次使用 xl 命令的 v 选项来获取更详细的输出。

# xl -vvv create freebsd.cfg
Parsing config from freebsd.cfg
libxl: debug: libxl_create.c:1693:do_domain_create: Domain 0:ao 0x800d750a0: create: how=0x0 callback=0x0 poller=0x800d6f0f0
libxl: debug: libxl_device.c:397:libxl__device_disk_set_backend: Disk vdev=xvda spec.backend=unknown
libxl: debug: libxl_device.c:432:libxl__device_disk_set_backend: Disk vdev=xvda, using backend phy
libxl: debug: libxl_create.c:1018:initiate_domain_create: Domain 1:running bootloader
libxl: debug: libxl_bootloader.c:328:libxl__bootloader_run: Domain 1:not a PV/PVH domain, skipping bootloader
libxl: debug: libxl_event.c:689:libxl__ev_xswatch_deregister: watch w=0x800d96b98: deregister unregistered
domainbuilder: 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 kB
libxl: 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/xen/qemu-dm-freebsd.log 。这两个日志文件都可能包含有用的调试信息。如果以上方法都无法解决问题,请将您面临的问题的描述和尽可能多的信息发送到 mailto:freebsd-xen @ FreeBSD.org[freebsd-xen @ FreeBSD.org] 和 mailto:xen-devel @ lists.xenproject.org[xen-devel @ lists.xenproject.org] 以获取帮助。


上次修改时间: September 18, 2024 by fiercex